{"id":10753,"date":"2020-10-10T21:51:30","date_gmt":"2020-10-10T19:51:30","guid":{"rendered":"https:\/\/www.salvis.com\/blog\/?p=10753"},"modified":"2023-11-12T13:52:54","modified_gmt":"2023-11-12T12:52:54","slug":"navigation-in-large-pl-sql-code","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/","title":{"rendered":"Navigation in Large PL\/SQL Code"},"content":{"rendered":"\n<p>Are you editing large PL\/SQL code in SQL Developer? Have you noticed that sometimes you cannot navigate to a declaration anymore? No Ctrl-Click under Windows. No Command-Click under macOS. In this blog post, I explain the reason and how to fix that in SQL Developer 20.2.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Is Large?<\/h2>\n\n\n\n<p>Usually, we define the size of code using common software metrics. Here are some examples:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>characters,<\/li>\n\n\n\n<li>lines,<\/li>\n\n\n\n<li>statements,<\/li>\n\n\n\n<li>McCabe&#8217;s cyclomatic complexity,<\/li>\n\n\n\n<li>Halstead volume or<\/li>\n\n\n\n<li>maintainability index.<\/li>\n<\/ul>\n\n\n\n<p>SQL Developer uses the number of lexer tokens. For SQL Developer the magic number is <span class=\"highlight highlight-\" style=\"background-color:Lemonchiffon;color:black;\">15000 lexer tokens <\/span>\n. This is the so-called <code>parseThreshold<\/code>. PL\/SQL code with <code>15000<\/code> lexer tokens or more is considered large.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Counting Lexer Tokens<\/h2>\n\n\n\n<p>Lexer tokens are similar to words. They are used as input for the parser. In fact for parsing some lexer tokens are irrelevant. Whitespace and comments, for instance. Here is an example:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Simple code<\/span><span role=\"button\" tabindex=\"0\" data-code=\"begin\n   dbms_output.put_line('Hello World!');\nend;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;Hello World!&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">end<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>This code contains the following <code>11<\/code> relevant lexer tokens:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>begin<\/code> (IDENTIFIER)<\/li>\n\n\n\n<li><code>dbms_output<\/code> (IDENTIFIER)<\/li>\n\n\n\n<li><code>.<\/code> (OPERATION)<\/li>\n\n\n\n<li><code>put_line<\/code> (IDENTIFIER)<\/li>\n\n\n\n<li><code>(<\/code> (OPERATION)<\/li>\n\n\n\n<li><code>Hello World!<\/code> (QUOTED_STRING)<\/li>\n\n\n\n<li><code>)<\/code> (OPERATION)<\/li>\n\n\n\n<li><code>;<\/code> (OPERATION)<\/li>\n\n\n\n<li><code>end<\/code> (IDENTIFIER)<\/li>\n\n\n\n<li><code>;<\/code> (OPERATION)<\/li>\n\n\n\n<li><code>\/<\/code> (OPERATION)<\/li>\n<\/ul>\n\n\n\n<p>I put the token type in parenthesis.<\/p>\n\n\n\n<p>You can run the following Arbori program to print the number of lexer tokens in the SQL Developer console.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori program to count tokens<\/span><span role=\"button\" tabindex=\"0\" data-code=\"countTokens:\n  [node) sql_statements\n  -&gt; {\n    var LexerToken = Java.type('oracle.dbtools.parser.LexerToken'); \n    var Token = Java.type('oracle.dbtools.parser.Token');\n    var tokens = LexerToken.parse(target.input, false);\n    print(&quot;Number of tokens: &quot; + tokens.size());\n  }\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C8C8C8\">countTokens<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statements<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt; {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    var <\/span><span style=\"color: #9CDCFE\">LexerToken<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Java<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">type<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;oracle.dbtools.parser.LexerToken&#39;<\/span><span style=\"color: #D4D4D4\">); <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    var <\/span><span style=\"color: #9CDCFE\">Token<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Java<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">type<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;oracle.dbtools.parser.Token&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    var <\/span><span style=\"color: #9CDCFE\">tokens<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">LexerToken<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">parse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">target<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">input<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Number of tokens: &quot;<\/span><span style=\"color: #D4D4D4\"> + tokens.size());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Change parseThreshold Temporarily<\/h2>\n\n\n\n<p>The default <code>parseThreshold<\/code> is 15000. With that value the navigation to <code>dbms_output.put_line<\/code> is possible.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/open_declaration.png\"><img loading=\"lazy\" decoding=\"async\" width=\"454\" height=\"106\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/open_declaration.png\" alt=\"\" class=\"wp-image-10764\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/open_declaration.png 454w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/open_declaration-300x70.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/open_declaration-260x61.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/open_declaration-50x12.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/open_declaration-150x35.png 150w\" sizes=\"auto, (max-width:767px) 454px, 454px\" \/><\/a><\/figure>\n\n\n\n<p>A link is displayed when you hold down the Ctrl key under Windows or the Command key under MacOS while you move the mouse pointer over a linkable item.<\/p>\n\n\n\n<p>Fortunately, we don&#8217;t need to generate a larger code to see what happens when we reach the <code>parseThreshold<\/code>. We can simply set the <code>parseThreshold<\/code> to&nbsp;<code>11<\/code> by executing the following command in a separate worksheet. The database connection is irrelevant.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Change parseThreshold to 11<\/span><span role=\"button\" tabindex=\"0\" data-code=\"set hidden param parseThreshold = 11;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">hidden<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">param<\/span><span style=\"color: #D4D4D4\"> parseThreshold = <\/span><span style=\"color: #B5CEA8\">11<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Now we have to enforce a re-parse. For example by cutting and pasting the code. Afterwards, you should see an empty code outline window.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/empty_code_outline.png\"><img loading=\"lazy\" decoding=\"async\" width=\"256\" height=\"111\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/empty_code_outline.png\" alt=\"\" class=\"wp-image-10765\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/empty_code_outline.png 256w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/empty_code_outline-50x22.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/empty_code_outline-150x65.png 150w\" sizes=\"auto, (max-width:767px) 256px, 256px\" \/><\/a><\/figure>\n\n\n\n<p>The <code>parseThreshold<\/code> has been reached and SQL Developer does not parse the code anymore. As a result, you cannot navigate to the declaration of <code>dbms_output.put_line<\/code>. You cannot enable the link. SQL Developer needs the parse tree for the navigation. No parse-tree, no navigation.<\/p>\n\n\n\n<p>But it is easy to get it working again. Just remove a token. The <code>\/<\/code> at the end, for instance. Now we have only <code>10<\/code> lexer tokens. A complete code outline is shown and code navigation works again.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Change parseThreshold Permanently<\/h2>\n\n\n\n<p>You can configure a script to be executed when opening a connection in SQL Developer.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/preferences_login.png\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"500\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/preferences_login.png\" alt=\"\" class=\"wp-image-10770\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/preferences_login.png 700w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/preferences_login-300x214.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/preferences_login-204x146.png 204w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/preferences_login-50x36.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/preferences_login-105x75.png 105w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/preferences_login-1x1.png 1w\" sizes=\"auto, (max-width:767px) 480px, 700px\" \/><\/a><\/figure>\n\n\n\n<p>In this script, you can define a higher threshold value. A magnitude of ten higher than the default value should be sufficient for most cases.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">login.sql<\/span><span role=\"button\" tabindex=\"0\" data-code=\"set hidden param parseThreshold = 150000;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">hidden<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">param<\/span><span style=\"color: #D4D4D4\"> parseThreshold = <\/span><span style=\"color: #B5CEA8\">150000<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">What&#8217;s the Impact of a Higher parseThreshold?<\/h2>\n\n\n\n<p>There is no impact, if you work with PL\/SQL and SQL code with less than <code>15000<\/code> lexer tokens.<\/p>\n\n\n\n<p>However, if work with larger code the code editor will need more time to open. And of course, it will consume more memory. That&#8217;s the price you pay for enabling navigation in large PL\/SQL code.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Are you editing large PL\/SQL code in SQL Developer? Have you noticed that sometimes you cannot navigate to a declaration anymore? No Ctrl-Click under Windows. No Command-Click under macOS. In this blog post, I explain the reason and how to fix that in SQL Developer 20.2. What Is Large? Usually, we define<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":10780,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[129,135,13,85,87],"class_list":["post-10753","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-arbori","tag-javascript","tag-plsql","tag-sql","tag-sql-developer"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Navigation in Large PL\/SQL Code - Philipp Salvisberg&#039;s Blog<\/title>\n<meta name=\"description\" content=\"Are you editing large PL\/SQL code in SQL Developer? And you cannot navigate to a declaration anymore? No problem. I show you how to fix that.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Navigation in Large PL\/SQL Code - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"Are you editing large PL\/SQL code in SQL Developer? And you cannot navigate to a declaration anymore? No problem. I show you how to fix that.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-10-10T19:51:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-12T12:52:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/compass.png\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"623\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Philipp Salvisberg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:site\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Philipp Salvisberg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/10\\\/10\\\/navigation-in-large-pl-sql-code\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/10\\\/10\\\/navigation-in-large-pl-sql-code\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"Navigation in Large PL\\\/SQL Code\",\"datePublished\":\"2020-10-10T19:51:30+00:00\",\"dateModified\":\"2023-11-12T12:52:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/10\\\/10\\\/navigation-in-large-pl-sql-code\\\/\"},\"wordCount\":502,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/10\\\/10\\\/navigation-in-large-pl-sql-code\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/compass.png\",\"keywords\":[\"Arbori\",\"JavaScript\",\"PL\\\/SQL\",\"SQL\",\"SQL Developer\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/10\\\/10\\\/navigation-in-large-pl-sql-code\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/10\\\/10\\\/navigation-in-large-pl-sql-code\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/10\\\/10\\\/navigation-in-large-pl-sql-code\\\/\",\"name\":\"Navigation in Large PL\\\/SQL Code - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/10\\\/10\\\/navigation-in-large-pl-sql-code\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/10\\\/10\\\/navigation-in-large-pl-sql-code\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/compass.png\",\"datePublished\":\"2020-10-10T19:51:30+00:00\",\"dateModified\":\"2023-11-12T12:52:54+00:00\",\"description\":\"Are you editing large PL\\\/SQL code in SQL Developer? And you cannot navigate to a declaration anymore? No problem. I show you how to fix that.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/10\\\/10\\\/navigation-in-large-pl-sql-code\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/10\\\/10\\\/navigation-in-large-pl-sql-code\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/10\\\/10\\\/navigation-in-large-pl-sql-code\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/compass.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/compass.png\",\"width\":640,\"height\":623},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/10\\\/10\\\/navigation-in-large-pl-sql-code\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Navigation in Large PL\\\/SQL Code\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\",\"name\":\"Philipp Salvisberg&#039;s Blog\",\"description\":\"Database-centric development\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\",\"name\":\"Philipp Salvisberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"width\":400,\"height\":400,\"caption\":\"Philipp Salvisberg\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\"},\"sameAs\":[\"http:\\\/\\\/www.salvis.com\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Navigation in Large PL\/SQL Code - Philipp Salvisberg&#039;s Blog","description":"Are you editing large PL\/SQL code in SQL Developer? And you cannot navigate to a declaration anymore? No problem. I show you how to fix that.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/","og_locale":"en_US","og_type":"article","og_title":"Navigation in Large PL\/SQL Code - Philipp Salvisberg&#039;s Blog","og_description":"Are you editing large PL\/SQL code in SQL Developer? And you cannot navigate to a declaration anymore? No problem. I show you how to fix that.","og_url":"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2020-10-10T19:51:30+00:00","article_modified_time":"2023-11-12T12:52:54+00:00","og_image":[{"width":640,"height":623,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/compass.png","type":"image\/png"}],"author":"Philipp Salvisberg","twitter_card":"summary_large_image","twitter_creator":"@phsalvisberg","twitter_site":"@phsalvisberg","twitter_misc":{"Written by":"Philipp Salvisberg","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"Navigation in Large PL\/SQL Code","datePublished":"2020-10-10T19:51:30+00:00","dateModified":"2023-11-12T12:52:54+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/"},"wordCount":502,"commentCount":2,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/compass.png","keywords":["Arbori","JavaScript","PL\/SQL","SQL","SQL Developer"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/","url":"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/","name":"Navigation in Large PL\/SQL Code - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/compass.png","datePublished":"2020-10-10T19:51:30+00:00","dateModified":"2023-11-12T12:52:54+00:00","description":"Are you editing large PL\/SQL code in SQL Developer? And you cannot navigate to a declaration anymore? No problem. I show you how to fix that.","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/compass.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/10\/compass.png","width":640,"height":623},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2020\/10\/10\/navigation-in-large-pl-sql-code\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Navigation in Large PL\/SQL Code"}]},{"@type":"WebSite","@id":"https:\/\/www.salvis.com\/blog\/#website","url":"https:\/\/www.salvis.com\/blog\/","name":"Philipp Salvisberg&#039;s Blog","description":"Database-centric development","publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.salvis.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515","name":"Philipp Salvisberg","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","width":400,"height":400,"caption":"Philipp Salvisberg"},"logo":{"@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg"},"sameAs":["http:\/\/www.salvis.com\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/10753","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/comments?post=10753"}],"version-history":[{"count":22,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/10753\/revisions"}],"predecessor-version":[{"id":12695,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/10753\/revisions\/12695"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/10780"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=10753"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=10753"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=10753"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}