<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SQL Developer Archives - Philipp Salvisberg&#039;s Blog</title>
	<atom:link href="https://www.salvis.com/blog/tag/sql-developer/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.salvis.com/blog/tag/sql-developer/</link>
	<description>Database-centric development</description>
	<lastBuildDate>Sun, 06 Jul 2025 12:10:49 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://www.salvis.com/blog/wp-content/uploads/2014/04/favicon.png</url>
	<title>SQL Developer Archives - Philipp Salvisberg&#039;s Blog</title>
	<link>https://www.salvis.com/blog/tag/sql-developer/</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://www.salvis.com/blog/tag/sql-developer/feed/"/>
	<item>
		<title>Installing SQL Developer in IDEs Implementing the VS Code Extension API</title>
		<link>https://www.salvis.com/blog/2025/07/05/installing-sql-developer-in-ides-implementing-the-vs-code-extension-api/</link>
		
		<dc:creator><![CDATA[Philipp Salvisberg]]></dc:creator>
		<pubDate>Sat, 05 Jul 2025 13:56:19 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQL Developer]]></category>
		<category><![CDATA[VSCode]]></category>
		<guid isPermaLink="false">https://www.salvis.com/blog/?p=13951</guid>

					<description><![CDATA[<p>Introduction The Oracle SQL Developer team is working on bringing the essential functionality built over the last 20 years in the classic SQL Developer IDE—a JDeveloper extension running as a standalone application—to the modern VS Code IDE. The integration with the VS Code ecosystem greatly enhances the developer experience. Is it time<span class="excerpt-hellip"> […]</span></p>
<p>The post <a href="https://www.salvis.com/blog/2025/07/05/installing-sql-developer-in-ides-implementing-the-vs-code-extension-api/">Installing SQL Developer in IDEs Implementing the VS Code Extension API</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="introduction">Introduction</h2>



<p class="wp-block-paragraph">The Oracle SQL Developer team is working on bringing the essential functionality built over the last 20 years in the classic SQL Developer IDE—a JDeveloper extension running as a standalone application—to the modern VS Code IDE. The integration with the VS Code ecosystem greatly enhances the developer experience. </p>



<p class="wp-block-paragraph">Is it time to switch? &#8211; Well, it depends on which part of SQL Developer you use and how often. I&#8217;d say it&#8217;s time to start using the SQL Developer extension for VS Code. Use the classic SQL Developer when needed. You will do it less and less over time.</p>



<p class="wp-block-paragraph">The SQL Developer extension is available in the VS Code Marketplace. That simplifies the installation for VS Code users. Unfortunately, this marketplace is not available in forks of VS Code or, more precisely, in IDEs that implement the VS Code extension API, such as <a href="https://vscodium.com/">VSCodium</a>, <a href="https://cursor.com/">Cursor</a>, <a href="https://windsurf.com/editor">Windsurf</a> and <a href="https://theia-ide.org/#theiaide">Theia IDE</a>. So, how do we install VS Code extensions, specifically SQL Developer, in these IDEs? &#8211; I&#8217;ll answer this question in this blog post.</p>



<h2 class="wp-block-heading" id="installing-sql-developer-in-vs-code">Installing SQL Developer in VS Code</h2>



<p class="wp-block-paragraph">The easiest way to install SQL Developer in VS Code is to start VS Code, search for <code>oracle sql developer</code> in the <code>Extensions</code> view, and click on the <code>Install</code> button. That&#8217;s it.</p>



<figure class="wp-block-image size-full is-resized"><a href="https://www.salvis.com/blog/wp-content/uploads/2025/07/image.png"><img fetchpriority="high" decoding="async" width="1230" height="450" src="https://www.salvis.com/blog/wp-content/uploads/2025/07/image.png" alt="Install SQL Developer within VS Code" class="wp-image-13952" style="width:615px" srcset="https://www.salvis.com/blog/wp-content/uploads/2025/07/image.png 1230w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-300x110.png 300w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-1024x375.png 1024w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-768x281.png 768w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-150x55.png 150w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-480x176.png 480w" sizes="(max-width:767px) 480px, (max-width:1230px) 100vw, 1230px" /></a></figure>



<p class="wp-block-paragraph">Please note that the second entry shown in the screenshot above is a deprecated/decommissioned extension developed by another team at Oracle. It&#8217;s a completely unrelated product.</p>



<h2 class="wp-block-heading" id="downloading-sql-developer-vsix-file">Downloading SQL Developer&#8217;s .vsix File</h2>



<p class="wp-block-paragraph">At the time of writing, it is not possible (anymore) to download an extension such as SQL Developer directly from the <a href="https://marketplace.visualstudio.com/items?itemName=Oracle.sql-developer">VS Code Marketplace website</a>. At least not officially. However, it&#8217;s possible in VS Code.</p>



<p class="wp-block-paragraph">Instead of clicking on the <code>install</code> button as before, right-click on the extension and select <code>Download VSIX</code>.</p>



<figure class="wp-block-image size-full is-resized"><a href="https://www.salvis.com/blog/wp-content/uploads/2025/07/image-1.png"><img decoding="async" width="1510" height="748" src="https://www.salvis.com/blog/wp-content/uploads/2025/07/image-1.png" alt="Download VSIX file within VS Code" class="wp-image-13954" style="width:755px" srcset="https://www.salvis.com/blog/wp-content/uploads/2025/07/image-1.png 1510w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-1-300x149.png 300w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-1-1024x507.png 1024w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-1-768x380.png 768w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-1-150x75.png 150w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-1-480x238.png 480w" sizes="(max-width:767px) 480px, (max-width:1510px) 100vw, 1510px" /></a></figure>



<p class="wp-block-paragraph">and then select the platform architecture.</p>



<figure class="wp-block-image size-large is-resized"><a href="https://www.salvis.com/blog/wp-content/uploads/2025/07/image-4.png"><img decoding="async" width="1024" height="287" src="https://www.salvis.com/blog/wp-content/uploads/2025/07/image-4-1024x287.png" alt="Select the platform for which you want to download the VSIX" class="wp-image-13960" style="width:595px" srcset="https://www.salvis.com/blog/wp-content/uploads/2025/07/image-4-1024x287.png 1024w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-4-300x84.png 300w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-4-768x216.png 768w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-4-150x42.png 150w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-4-480x135.png 480w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-4.png 1190w" sizes="(max-width:767px) 480px, (max-width:1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">This is necessary because SQL Developer comes with a Java Runtime Environment, which contains platform-specific binaries.</p>



<h2 class="wp-block-heading" id="installing-a-vsix-file">Installing a VSIX File</h2>



<p class="wp-block-paragraph">VS Code, VSCodium, Cursor, Windsurf, and Theila IDE provide a <code>Install from VSIX...</code> command. You find it via <code>View -> Command Pallette...</code>. Run it,</p>



<figure class="wp-block-image size-large is-resized"><a href="https://www.salvis.com/blog/wp-content/uploads/2025/07/image-3.png"><img loading="lazy" decoding="async" width="1024" height="109" src="https://www.salvis.com/blog/wp-content/uploads/2025/07/image-3-1024x109.png" alt="Install from VSIX..." class="wp-image-13956" style="width:591px" srcset="https://www.salvis.com/blog/wp-content/uploads/2025/07/image-3-1024x109.png 1024w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-3-300x32.png 300w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-3-768x82.png 768w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-3-150x16.png 150w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-3-480x51.png 480w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-3.png 1182w" sizes="auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">and select the VSIX file to install, and you&#8217;re done.</p>



<h2 class="wp-block-heading" id="open-vsx-registry">Open VSX Registry</h2>



<p class="wp-block-paragraph">Why are VSCodium, Cursor, Windsurf and Theia IDE not using the VS Code Marketplace? &#8211; Because the <a href="https://www.nuget.org/policies/terms">Terms of Use</a> do not allow this. Here&#8217;s the relevant passage:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">(&#8230;) you may not access, search, obtain or attempt to obtain any Offerings, materials, or information from the Sites through any means other than directly from Microsoft’s publicly supported interfaces (&#8230;)</p>
</blockquote>



<p class="wp-block-paragraph">This is why <a href="https://vscodium.com/">VSCodium</a>, <a href="https://cursor.com/">Cursor</a>, <a href="https://windsurf.com/editor">Windsurf</a> and <a href="https://theia-ide.org/#theiaide">Theia IDE</a> use the alternative marketplace <a href="https://open-vsx.org/">Open VSX Registry</a>.</p>



<p class="wp-block-paragraph">At the time of writing, the Oracle SQL Developer Extension for VSCode is not available in the Open VSX Registry. Here&#8217;s a screenshot of a search in Cursor:</p>



<figure class="wp-block-image size-large is-resized"><a href="https://www.salvis.com/blog/wp-content/uploads/2025/07/image-6.png"><img loading="lazy" decoding="async" width="1024" height="610" src="https://www.salvis.com/blog/wp-content/uploads/2025/07/image-6-1024x610.png" alt="Search for Oracle SQL Developer  within Cursor" class="wp-image-13964" style="width:633px" srcset="https://www.salvis.com/blog/wp-content/uploads/2025/07/image-6-1024x610.png 1024w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-6-300x179.png 300w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-6-768x457.png 768w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-6-126x75.png 126w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-6-480x286.png 480w, https://www.salvis.com/blog/wp-content/uploads/2025/07/image-6.png 1266w" sizes="auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">As you see, the deprecated/decommissioned extension is listed, but the successor is missing. </p>



<h2 class="wp-block-heading" id="summary">Summary</h2>



<p class="wp-block-paragraph">Installing an extension in VS Code via the integrated marketplace is super easy. Getting the .vsix file is also straightforward and enables the installation of VS Code extensions in IDEs that implement the VS Code extension API.</p>



<p class="wp-block-paragraph">It would be great if the Oracle SQL Developer team published their SQL Developer extension on the Open VSX Registry too. This would make the initial installation and subsequent updates much simpler.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://www.salvis.com/blog/2025/07/05/installing-sql-developer-in-ides-implementing-the-vs-code-extension-api/">Installing SQL Developer in IDEs Implementing the VS Code Extension API</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Sharing SQL Developer Connections #JoelKallmanDay</title>
		<link>https://www.salvis.com/blog/2023/10/11/sharing-sql-developer-connections-joelkallmanday/</link>
		
		<dc:creator><![CDATA[Philipp Salvisberg]]></dc:creator>
		<pubDate>Tue, 10 Oct 2023 22:10:56 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQL Developer]]></category>
		<category><![CDATA[VSCode]]></category>
		<guid isPermaLink="false">https://www.salvis.com/blog/?p=12481</guid>

					<description><![CDATA[<p>1. The Problem I created a Docker image and a container for the Oracle Database 19c (19.19) for Linux ARM. The container contains ORDS, APEX and various sample schemas. Finally, an Oracle database that runs pretty fast on my Apple Silicon machine. Then I built a cold database clone by creating a<span class="excerpt-hellip"> […]</span></p>
<p>The post <a href="https://www.salvis.com/blog/2023/10/11/sharing-sql-developer-connections-joelkallmanday/">Sharing SQL Developer Connections #JoelKallmanDay</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">1. The Problem</h2>



<p class="wp-block-paragraph">I created a Docker image and a container for the <a href="https://www.oracle.com/database/technologies/oracle19c-linux-arm64-downloads.html">Oracle Database 19c (19.19) for Linux ARM</a>. The container contains ORDS, APEX and various sample schemas. Finally, an Oracle database that runs pretty fast on my Apple Silicon machine. Then I built a cold database clone by creating a container on another machine using a copy of the original Docker volume. So far, so good.</p>



<p class="wp-block-paragraph">In SQL Developer I created a folder named <code>odb190-localhost</code> with 29 connections. Now I&#8217;d like to copy these SQL Developer connections to another machine. Easy, right? Export all connections to a JSON file and import it in the other SQL Developer instance. Yes, this works. But if you have several hundred connections like me, you get more than you want. The target installation might contain connection names with different properties. Therefore you do not want to import and overwrite existing connections and to identify and delete unwanted newly created connections after the import.</p>



<p class="wp-block-paragraph">So, what can we do?</p>



<h2 class="wp-block-heading">2. Some Possible Solutions</h2>



<h3 class="wp-block-heading">2.1. Export Only Wanted Connections</h3>



<p class="wp-block-paragraph">Exporting some chosen connections works technically. However, the export wizard does not support the concept of folders and presents a flat list of all connections. Selecting all connections in a folder is not feasible without sorting or filtering options in the UI.</p>



<figure class="wp-block-image"><a href="https://www.salvis.com/blog/wp-content/uploads/2023/10/sqldev-export-connections.png"><img loading="lazy" decoding="async" width="800" height="600" src="https://www.salvis.com/blog/wp-content/uploads/2023/10/sqldev-export-connections.png" alt="SQL Developer export wizard" class="wp-image-12483" srcset="https://www.salvis.com/blog/wp-content/uploads/2023/10/sqldev-export-connections.png 800w, https://www.salvis.com/blog/wp-content/uploads/2023/10/sqldev-export-connections-300x225.png 300w, https://www.salvis.com/blog/wp-content/uploads/2023/10/sqldev-export-connections-768x576.png 768w, https://www.salvis.com/blog/wp-content/uploads/2023/10/sqldev-export-connections-100x75.png 100w, https://www.salvis.com/blog/wp-content/uploads/2023/10/sqldev-export-connections-480x360.png 480w" sizes="auto, (max-width:767px) 480px, (max-width:800px) 100vw, 800px" /></a></figure>



<p class="wp-block-paragraph">Finding all entries ending on <code>odb190-localhost</code> is no fun. It might work for a handful of connections, but not for 29.</p>



<h3 class="wp-block-heading">2.2. Export Only One Template Connection</h3>



<p class="wp-block-paragraph">As an alternative, you can export just one connection and import it into the target SQL Developer installation. Use this connection as a kind of template. Click on the connection and select <code>Properties</code> in the context menu.</p>



<figure class="wp-block-image"><a href="https://www.salvis.com/blog/wp-content/uploads/2023/10/sqldev-new-select-database-connection.png"><img loading="lazy" decoding="async" width="780" height="500" src="https://www.salvis.com/blog/wp-content/uploads/2023/10/sqldev-new-select-database-connection.png" alt="New / Select Database Connection in SQL Developer" class="wp-image-12484" srcset="https://www.salvis.com/blog/wp-content/uploads/2023/10/sqldev-new-select-database-connection.png 780w, https://www.salvis.com/blog/wp-content/uploads/2023/10/sqldev-new-select-database-connection-300x192.png 300w, https://www.salvis.com/blog/wp-content/uploads/2023/10/sqldev-new-select-database-connection-768x492.png 768w, https://www.salvis.com/blog/wp-content/uploads/2023/10/sqldev-new-select-database-connection-117x75.png 117w, https://www.salvis.com/blog/wp-content/uploads/2023/10/sqldev-new-select-database-connection-480x308.png 480w" sizes="auto, (max-width:767px) 480px, (max-width:780px) 100vw, 780px" /></a></figure>



<p class="wp-block-paragraph">In this window, you can change the <code>Name</code>, <code>Username</code> and <code>Password</code> and press <code>Save</code>. Repeat that process for all other connections. Either now or later when you need them.</p>



<p class="wp-block-paragraph">Not really a satisfying solution either, right?</p>



<h3 class="wp-block-heading">2.3. Export All Connections and Filter with VS Code</h3>



<p class="wp-block-paragraph">Exporting all connections is easy. Let&#8217;s look at the file in Visual Studio Code.</p>



<figure class="wp-block-image"><a href="https://www.salvis.com/blog/wp-content/uploads/2023/10/all-connections-vscode-original.png"><img loading="lazy" decoding="async" width="953" height="710" src="https://www.salvis.com/blog/wp-content/uploads/2023/10/all-connections-vscode-original.png" alt="all-connections.json in VS Code (original)" class="wp-image-12501" srcset="https://www.salvis.com/blog/wp-content/uploads/2023/10/all-connections-vscode-original.png 953w, https://www.salvis.com/blog/wp-content/uploads/2023/10/all-connections-vscode-original-300x225.png 300w, https://www.salvis.com/blog/wp-content/uploads/2023/10/all-connections-vscode-original-768x572.png 768w, https://www.salvis.com/blog/wp-content/uploads/2023/10/all-connections-vscode-original-101x75.png 101w, https://www.salvis.com/blog/wp-content/uploads/2023/10/all-connections-vscode-original-480x358.png 480w" sizes="auto, (max-width:767px) 480px, (max-width:953px) 100vw, 953px" /></a></figure>



<p class="wp-block-paragraph">This is a minified JSON. Let&#8217;s select <code>Format Document</code> from the context menu to make it human-readable.</p>



<figure class="wp-block-image"><a href="https://www.salvis.com/blog/wp-content/uploads/2023/10/all-connections-vscode-formatted.png"><img decoding="async" src="https://www.salvis.com/blog/wp-content/uploads/2023/10/all-connections-vscode-formatted.png" alt="all-connections.json in VS Code (formatted)" class="wp-image-12487"/></a></figure>



<p class="wp-block-paragraph">Ahh, much better.</p>



<h4 class="wp-block-heading">Removing Unwanted <code>info</code>&nbsp;Objects</h4>



<p class="wp-block-paragraph">On line 11 we see the property <code>NAV_FOLDER</code>. We are only interested in connections with the value <code>odb190-localhost</code>. Is there a way to delete all unwanted entries? Yes, there is. By using <a href="https://jqlang.github.io/jq/">jq</a>, a command line utility to process JSON files. There is also an extension for VS Code named <a href="https://marketplace.visualstudio.com/items?itemName=petli-full.jq-vscode">jq-vscode</a>, which simplifies the development of a jq command.</p>



<p class="wp-block-paragraph">Here&#8217;s the jq command to remove all unwanted <code>info</code> objects from the <code>connections</code> array:</p>



<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">jq command to remove unwanted connections</span><span role="button" tabindex="0" data-code="del(
    .connections[] 
    | select(.info.NAV_FOLDER!=&quot;odb190-localhost&quot;)
)" 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: #DCDCAA">del</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    .</span><span style="color: #9CDCFE">connections</span><span style="color: #D4D4D4">[] </span></span>
<span class="line"><span style="color: #D4D4D4">    | </span><span style="color: #DCDCAA">select</span><span style="color: #D4D4D4">(.</span><span style="color: #9CDCFE">info</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">NAV_FOLDER</span><span style="color: #D4D4D4">!=</span><span style="color: #CE9178">&quot;odb190-localhost&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph">In VS Code you can open a split window via the command <code>JQ: Open a new file to exec jq</code>. There you can enter the jq command.</p>



<figure class="wp-block-image"><a href="https://www.salvis.com/blog/wp-content/uploads/2023/10/all-connections-vscode-jq-result.png"><img decoding="async" src="https://www.salvis.com/blog/wp-content/uploads/2023/10/all-connections-vscode-jq-result.png" alt="all-connections.json filtered with jq-vscode" class="wp-image-12489"/></a></figure>



<p class="wp-block-paragraph">In the lower part of the screen, you can see the result of the jq command. Copy the output and save it to a file to be imported into any SQL Developer installation.</p>



<h3 class="wp-block-heading">2.4. Export All Connections and Filter with JQ CLI</h3>



<p class="wp-block-paragraph">This is basically the same solution as before. The only difference is that we use the <a href="https://jqlang.github.io/jq/">jq</a> command-line tool. jq is available on all major platforms (Linux, Windows, macOS). Download it from <a href="https://jqlang.github.io/jq/download/">here</a> or install it directly with your OS package installer (e.g. apt, yum, dnf, brew, &#8230;).</p>



<p class="wp-block-paragraph">I exported all connections to a file named <code>all-connections.json</code> from SQL Developer.</p>



<p class="wp-block-paragraph">With the following command, I produce the file <code>odb190-localhost-connections.json</code> that contains only the connections in the folder <code>odb190-localhost</code>:</p>



<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">jq CLI command to remove unwanted connections</span><span role="button" tabindex="0" data-code="jq 'del(.connections[] | select(.info.NAV_FOLDER!=&quot;odb190-localhost&quot;))' \
    all-connections.json &gt; odb190-localhost-connections.json" 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: #9CDCFE">jq</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;del(.connections[] | select(.info.NAV_FOLDER!=&quot;odb190-localhost&quot;))&#39;</span><span style="color: #D4D4D4"> \</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">all</span><span style="color: #D4D4D4">-</span><span style="color: #9CDCFE">connections</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">json</span><span style="color: #D4D4D4"> &gt; </span><span style="color: #9CDCFE">odb190</span><span style="color: #D4D4D4">-</span><span style="color: #9CDCFE">localhost</span><span style="color: #D4D4D4">-</span><span style="color: #9CDCFE">connections</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">json</span></span></code></pre></div>



<p class="wp-block-paragraph">The file <code>odb190-localhost-connections.json</code> is ready to be shared and imported into other SQL Developer installations.</p>



<h2 class="wp-block-heading">3. Conclusion</h2>



<p class="wp-block-paragraph">There are other solutions, not covered in this blog post, to create a filtered connection export from SQL Developer. For example, writing a dedicated SQL Developer extension. Or filtering an export file with another tool. Or processing a JSON export file in the database.</p>



<p class="wp-block-paragraph">However, IMO jq is an excellent tool to process JSON data in shell scripts. Perfect for automation. In this case, it makes sharing a subset of your SQL Developer connections easier. For any filter criteria, you want to apply.</p>
<p>The post <a href="https://www.salvis.com/blog/2023/10/11/sharing-sql-developer-connections-joelkallmanday/">Sharing SQL Developer Connections #JoelKallmanDay</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Quoted Identifiers #JoelKallmanDay</title>
		<link>https://www.salvis.com/blog/2022/10/11/quoted-identifiers-joelkallmanday/</link>
		
		<dc:creator><![CDATA[Philipp Salvisberg]]></dc:creator>
		<pubDate>Mon, 10 Oct 2022 22:42:05 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Arbori]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Developer]]></category>
		<guid isPermaLink="false">https://www.salvis.com/blog/?p=11687</guid>

					<description><![CDATA[<p>Background and TL;DR Connor McDonald wrote a blog post named Cleaner DDL than DBMS_METADATA. Back then he asked me if it would be possible to let the formatter remove unnecessary double quotes from quoted identifiers. Yes, of course. Actually, the current version of the PL/SQL &#38; SQL Formatter Settings does exactly that.<span class="excerpt-hellip"> […]</span></p>
<p>The post <a href="https://www.salvis.com/blog/2022/10/11/quoted-identifiers-joelkallmanday/">Quoted Identifiers #JoelKallmanDay</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Background and TL;DR</h2>



<p class="wp-block-paragraph">Connor McDonald wrote a blog post named <a href="https://connor-mcdonald.com/2022/03/02/cleaner-ddl-than-dbms_metadata/">Cleaner DDL than DBMS_METADATA</a>. Back then he asked me if it would be possible to let the formatter remove unnecessary double quotes from quoted identifiers. Yes, of course. Actually, the current version of the <a href="https://github.com/Trivadis/plsql-formatter-settings">PL/SQL &amp; SQL Formatter Settings</a> does exactly that. And no, you cannot do that with <code>dbms_metadata</code> in the Oracle Database versions 19c and 21c. Read on if you are interested in the details.</p>



<h2 class="wp-block-heading">The Problem with DBMS_METADATA …</h2>



<p class="wp-block-paragraph">When you execute a DDL against the Oracle Database the database stores some metadata in the data dictionary. The DDL statement itself is not stored, at least not completely. This is one reason why it is a good idea to store DDL statements in files and manage these files within a version control system. Nevertheless, the Oracle Database provides an API –&nbsp;<a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_METADATA.html"><code>dbms_metadata</code></a>&nbsp;– to reconstruct a DDL based on the information available in the data dictionary.</p>



<p class="wp-block-paragraph">Let’s create a view based on the famous&nbsp;<code>dept</code>&nbsp;and&nbsp;<code>emp</code>&nbsp;tables:</p>



<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(2 * 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">1) Initial DDL</span><span role="button" tabindex="0" data-code="create or replace view deptsal as
   select d.deptno,
          d.dname,
          nvl(sum(e.sal), 0) as sum_sal,
          nvl(count(e.empno), 0) as num_emps,
          nvl(round(avg(e.sal), 2), 0) as avg_sal
     from dept d
     left join emp e
       on e.deptno = d.deptno
    group by d.deptno, d.dname;" 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">create or replace</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">view</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">deptsal</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">as</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> d.deptno,</span></span>
<span class="line"><span style="color: #D4D4D4">          d.dname,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">sum</span><span style="color: #D4D4D4">(e.sal), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> sum_sal,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">count</span><span style="color: #D4D4D4">(e.empno), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> num_emps,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">round</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">avg</span><span style="color: #D4D4D4">(e.sal), </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> avg_sal</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> dept d</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">left join</span><span style="color: #D4D4D4"> emp e</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> e.deptno = d.deptno</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">group by</span><span style="color: #D4D4D4"> d.deptno, d.dname;</span></span></code></pre></div>



<p class="wp-block-paragraph">and retrieve the DDL like this:</p>



<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">2) Get DDL</span><span role="button" tabindex="0" data-code="select dbms_metadata.get_ddl('VIEW', 'DEPTSAL', user) from dual;" 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">select</span><span style="color: #D4D4D4"> dbms_metadata.get_ddl(</span><span style="color: #CE9178">&#39;VIEW&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;DEPTSAL&#39;</span><span style="color: #D4D4D4">, user) </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> dual;</span></span></code></pre></div>



<p class="wp-block-paragraph">to produce this DDL:</p>



<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(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">3) DDL by dbms_metadata</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE FORCE EDITIONABLE VIEW &quot;REDSTACK&quot;.&quot;DEPTSAL&quot; (&quot;DEPTNO&quot;, &quot;DNAME&quot;, &quot;SUM_SAL&quot;, &quot;NUM_EMPS&quot;, &quot;AVG_SAL&quot;) DEFAULT COLLATION &quot;USING_NLS_COMP&quot;  AS 
  select d.deptno,
          d.dname,
          nvl(sum(e.sal), 0) as sum_sal,
          nvl(count(e.empno), 0) as num_emps,
          nvl(round(avg(e.sal), 2), 0) as avg_sal
     from dept d
     left join emp e
       on e.deptno = d.deptno
    group by d.deptno, d.dname" 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 cbp-line-highlight"><span style="color: #569CD6">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">REPLACE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FORCE</span><span style="color: #D4D4D4"> EDITIONABLE VIEW </span><span style="color: #CE9178">&quot;REDSTACK&quot;</span><span style="color: #D4D4D4">.</span><span style="color: #CE9178">&quot;DEPTSAL&quot;</span><span style="color: #D4D4D4"> (</span><span style="color: #CE9178">&quot;DEPTNO&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;DNAME&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;SUM_SAL&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;NUM_EMPS&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;AVG_SAL&quot;</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> COLLATION </span><span style="color: #CE9178">&quot;USING_NLS_COMP&quot;</span><span style="color: #D4D4D4">  </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> d.deptno,</span></span>
<span class="line"><span style="color: #D4D4D4">          d.dname,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">sum</span><span style="color: #D4D4D4">(e.sal), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> sum_sal,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">count</span><span style="color: #D4D4D4">(e.empno), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> num_emps,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">round</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">avg</span><span style="color: #D4D4D4">(e.sal), </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> avg_sal</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> dept d</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">left join</span><span style="color: #D4D4D4"> emp e</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> e.deptno = d.deptno</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">group by</span><span style="color: #D4D4D4"> d.deptno, d.dname</span></span></code></pre></div>



<p class="wp-block-paragraph">We see that the&nbsp;<code>subquery</code>&nbsp;part of the view has been preserved, except the first line which has a different indentation. Actually, the indentation of the first line is not stored in the data dictionary (see&nbsp;<code>user_views.text</code>). The two spaces are produced by the default&nbsp;<code>pretty</code>&nbsp;option of&nbsp;<code>dbms_metadata</code>. So far, so good.</p>



<p class="wp-block-paragraph">In many cases, the Oracle Data Dictionary explicitly stores default values. For instance,&nbsp;<code>Y</code>&nbsp;for&nbsp;<code>editionable</code>&nbsp;or&nbsp;<code>USING_NLS_COMP</code>&nbsp;for&nbsp;<code>default_collation</code>. This fact alone makes it impossible to reconstruct the original DDL reliably. The database simply does not know whether an optional clause such as&nbsp;<code>editionable</code>&nbsp;or&nbsp;<code>default collation</code>&nbsp;has been specified or omitted. Moreover, some optional DDL clauses such as&nbsp;<code>or replace</code>&nbsp;or&nbsp;<code>force</code>&nbsp;are simply not represented in the data dictionary.</p>



<h2 class="wp-block-heading">… Especially with Quoted Identifiers</h2>



<p class="wp-block-paragraph">And last but not least, identifiers such as columns names, table names or view names are stored without double quotes. Therefore, the database knows nothing about the use of double quotes in the original DDL. However, the database knows exactly when double quotes are required. As a result,&nbsp;<code>dbms_metadata</code>&nbsp;could emit only necessary double quotes. This would result in a more readable DDL and would probably also be more similar to the original DDL.</p>



<p class="wp-block-paragraph">The reality is that code generators such as&nbsp;<code>dbms_metadata</code>&nbsp;often use double quotes for all identifiers. It’s simply easier for them, because this way the generated code works for all kind of strange identifiers.</p>



<p class="wp-block-paragraph">However, using quoted identifiers is a&nbsp;<a href="https://trivadis.github.io/plsql-and-sql-coding-guidelines/v4.2/4-language-usage/2-variables-and-types/1-general/g-2180/">bad practice</a>. It is, in fact, a very bad practice when they are used unnecessarily.</p>



<h2 class="wp-block-heading">Shaping the DDL</h2>



<p class="wp-block-paragraph">So what can we do? We can configure&nbsp;<code>dbms_metadata</code>&nbsp;to produce a DDL which is more similar to our original one. In this case we can change the following:</p>



<ul class="wp-block-list">
<li>remove the schema of the view (owner)</li>



<li>remove the&nbsp;<code>force</code>&nbsp;keyword</li>



<li>remove the&nbsp;<code>default collation</code>&nbsp;clause</li>



<li>add the missing SQL terminator (<code>;)</code></li>
</ul>



<p class="wp-block-paragraph">This query</p>



<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(2 * 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">4) Get customized DDL</span><span role="button" tabindex="0" data-code="with
   function view_ddl(in_name in varchar2) return clob is
      l_main_handle   integer;
      l_modify_handle integer;
      l_ddl_handle    integer;
      l_ddl           clob;
   begin
      -- initialize dbms_metadata for view based on current schema
      l_main_handle   := sys.dbms_metadata.open('VIEW');
      sys.dbms_metadata.set_filter(l_main_handle, 'SCHEMA', user);
      sys.dbms_metadata.set_filter(l_main_handle, 'NAME', in_name);
      -- remove schema name from input structure
      l_modify_handle := sys.dbms_metadata.add_transform(l_main_handle, 'MODIFY');
      sys.dbms_metadata.set_remap_param(l_modify_handle, 'REMAP_SCHEMA', user, null);
      -- non-default transformations to improve DDL
      l_ddl_handle    := sys.dbms_metadata.add_transform(l_main_handle, 'DDL');
      sys.dbms_metadata.set_transform_param(l_ddl_handle, 'FORCE', false);
      sys.dbms_metadata.set_transform_param(l_ddl_handle, 'COLLATION_CLAUSE', 'NO_NLS');
      sys.dbms_metadata.set_transform_param(l_ddl_handle, 'SQLTERMINATOR', true);
      -- get DDL
      l_ddl           := sys.dbms_metadata.fetch_clob(l_main_handle);
      -- free sys.dbms_metadata resources
      sys.dbms_metadata.close(l_main_handle);
      -- return result
      return l_ddl;
   end view_ddl;
select view_ddl('DEPTSAL')
  from dual
/" 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">with</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> view_ddl(in_name </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">varchar2</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> clob </span><span style="color: #569CD6">is</span></span>
<span class="line"><span style="color: #D4D4D4">      l_main_handle   </span><span style="color: #569CD6">integer</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_modify_handle </span><span style="color: #569CD6">integer</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_ddl_handle    </span><span style="color: #569CD6">integer</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_ddl           clob;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">begin</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- initialize dbms_metadata for view based on current schema</span></span>
<span class="line"><span style="color: #D4D4D4">      l_main_handle   := sys.dbms_metadata.</span><span style="color: #569CD6">open</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;VIEW&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.set_filter(l_main_handle, </span><span style="color: #CE9178">&#39;SCHEMA&#39;</span><span style="color: #D4D4D4">, user);</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.set_filter(l_main_handle, </span><span style="color: #CE9178">&#39;NAME&#39;</span><span style="color: #D4D4D4">, in_name);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- remove schema name from input structure</span></span>
<span class="line"><span style="color: #D4D4D4">      l_modify_handle := sys.dbms_metadata.add_transform(l_main_handle, </span><span style="color: #CE9178">&#39;MODIFY&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.set_remap_param(l_modify_handle, </span><span style="color: #CE9178">&#39;REMAP_SCHEMA&#39;</span><span style="color: #D4D4D4">, user, </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- non-default transformations to improve DDL</span></span>
<span class="line"><span style="color: #D4D4D4">      l_ddl_handle    := sys.dbms_metadata.add_transform(l_main_handle, </span><span style="color: #CE9178">&#39;DDL&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.set_transform_param(l_ddl_handle, </span><span style="color: #CE9178">&#39;FORCE&#39;</span><span style="color: #D4D4D4">, false);</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.set_transform_param(l_ddl_handle, </span><span style="color: #CE9178">&#39;COLLATION_CLAUSE&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;NO_NLS&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.set_transform_param(l_ddl_handle, </span><span style="color: #CE9178">&#39;SQLTERMINATOR&#39;</span><span style="color: #D4D4D4">, true);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- get DDL</span></span>
<span class="line"><span style="color: #D4D4D4">      l_ddl           := sys.dbms_metadata.fetch_clob(l_main_handle);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- free sys.dbms_metadata resources</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.</span><span style="color: #569CD6">close</span><span style="color: #D4D4D4">(l_main_handle);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- return result</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> l_ddl;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">end</span><span style="color: #D4D4D4"> view_ddl;</span></span>
<span class="line"><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> view_ddl(</span><span style="color: #CE9178">&#39;DEPTSAL&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> dual</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p class="wp-block-paragraph">produces this result:</p>



<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(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">5) Customized DDL via dbms_metadata</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE EDITIONABLE VIEW &quot;DEPTSAL&quot; (&quot;DEPTNO&quot;, &quot;DNAME&quot;, &quot;SUM_SAL&quot;, &quot;NUM_EMPS&quot;, &quot;AVG_SAL&quot;) AS 
  select d.deptno,
          d.dname,
          nvl(sum(e.sal), 0) as sum_sal,
          nvl(count(e.empno), 0) as num_emps,
          nvl(round(avg(e.sal), 2), 0) as avg_sal
     from dept d
     left join emp e
       on e.deptno = d.deptno
   group by d.deptno, d.dname;" 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 cbp-line-highlight"><span style="color: #569CD6">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">REPLACE</span><span style="color: #D4D4D4"> EDITIONABLE VIEW </span><span style="color: #CE9178">&quot;DEPTSAL&quot;</span><span style="color: #D4D4D4"> (</span><span style="color: #CE9178">&quot;DEPTNO&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;DNAME&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;SUM_SAL&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;NUM_EMPS&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;AVG_SAL&quot;</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> d.deptno,</span></span>
<span class="line"><span style="color: #D4D4D4">          d.dname,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">sum</span><span style="color: #D4D4D4">(e.sal), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> sum_sal,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">count</span><span style="color: #D4D4D4">(e.empno), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> num_emps,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">round</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">avg</span><span style="color: #D4D4D4">(e.sal), </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> avg_sal</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> dept d</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">left join</span><span style="color: #D4D4D4"> emp e</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> e.deptno = d.deptno</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">group by</span><span style="color: #D4D4D4"> d.deptno, d.dname;</span></span></code></pre></div>



<p class="wp-block-paragraph">This looks better. However, I would like to configure&nbsp;<code>dbms_metadata</code>&nbsp;to omit the default&nbsp;<code>editionable</code>&nbsp;clause. Furthermore, I do not like the column alias list, which is unnecessary in this case. And of course, I’d like to suppress unnecessary double quotes around identifiers. Is that possible with&nbsp;<code>dbms_metadata</code>?</p>



<h2 class="wp-block-heading">Shaping the DDL from (S)XML</h2>



<p class="wp-block-paragraph">Well, we can try. The&nbsp;<code>dbms_metadata</code>&nbsp;API is very extensive. Besides other things, it can also represent metadata as an XML document. There are two formats.</p>



<ul class="wp-block-list">
<li>XML – An extensive XML containing internals such as object number, owner number, creation date, etc.</li>



<li>SXML – A simple and terse XML that contains everything you need to produce a DDL. The SXML format is therefore very well suited for schema comparison.</li>
</ul>



<p class="wp-block-paragraph">It’s possible to produce a DDL from both formats. We can also change the XML beforehand.</p>



<p class="wp-block-paragraph">Let’s look at both variants in the next two subchapters.</p>



<p class="wp-block-paragraph">Important: I consider the changes to the XML document and configuration of&nbsp;<code>dbms_metadata</code>&nbsp;in the following subchapters as experimental. The purpose is to show what is doable. They are not good examples of how it should be done. Even though the unnecessary list of column aliases annoys me, I would leave them as they are. I also think that overriding the default&nbsp;<code>VERSION</code>&nbsp;is a very bad idea in the long run.</p>



<h3 class="wp-block-heading">Convert XML to DDL</h3>



<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(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">6) Get customized DDL from XML</span><span role="button" tabindex="0" data-code="with
   function view_ddl(in_name in varchar2) return clob is
      l_xml         xmltype;
      l_main_handle integer;
      l_ddl_handle  integer;
      l_ddl         clob;
   begin
      -- create XML document and remove unwanted nodes
      l_xml         := xmltype(sys.dbms_metadata.get_xml('VIEW', in_name, user));
      l_xml         := l_xml.deletexml('/ROWSET/ROW/VIEW_T/SCHEMA_OBJ/OWNER_NAME');
      l_xml         := l_xml.deletexml('/ROWSET/ROW/VIEW_T/COL_LIST');
      -- initialize dbms_metadata for view based on XML input
      l_main_handle := sys.dbms_metadata.openw('VIEW');
      -- non-default transformations to improve DDL
      l_ddl_handle  := sys.dbms_metadata.add_transform(l_main_handle, 'DDL');
      sys.dbms_metadata.set_transform_param(l_ddl_handle, 'FORCE', false);
      sys.dbms_metadata.set_transform_param(l_ddl_handle, 'COLLATION_CLAUSE', 'NO_NLS');
      sys.dbms_metadata.set_transform_param(l_ddl_handle, 'SQLTERMINATOR', true);
      sys.dbms_metadata.set_transform_param(l_ddl_handle, 'VERSION', 1120000000);
      -- get DDL
      sys.dbms_lob.createtemporary(l_ddl, false, sys.dbms_lob.session);
      sys.dbms_metadata.convert(l_main_handle, l_xml, l_ddl);
      -- free dbms_metadata resources
      sys.dbms_metadata.close(l_main_handle);
      -- return result
      return l_ddl;
   end view_ddl;
select xmlserialize(document xmltype(sys.dbms_metadata.get_xml('VIEW', 'DEPTSAL', user))
          as clob indent size = 4)
  from dual
union all
select view_ddl('DEPTSAL')
  from dual
/" 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">with</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> view_ddl(in_name </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">varchar2</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> clob </span><span style="color: #569CD6">is</span></span>
<span class="line"><span style="color: #D4D4D4">      l_xml         xmltype;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_main_handle </span><span style="color: #569CD6">integer</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_ddl_handle  </span><span style="color: #569CD6">integer</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_ddl         clob;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">begin</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- create XML document and remove unwanted nodes</span></span>
<span class="line"><span style="color: #D4D4D4">      l_xml         := xmltype(sys.dbms_metadata.get_xml(</span><span style="color: #CE9178">&#39;VIEW&#39;</span><span style="color: #D4D4D4">, in_name, user));</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">      l_xml         := l_xml.deletexml(</span><span style="color: #CE9178">&#39;/ROWSET/ROW/VIEW_T/SCHEMA_OBJ/OWNER_NAME&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">      l_xml         := l_xml.deletexml(</span><span style="color: #CE9178">&#39;/ROWSET/ROW/VIEW_T/COL_LIST&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- initialize dbms_metadata for view based on XML input</span></span>
<span class="line"><span style="color: #D4D4D4">      l_main_handle := sys.dbms_metadata.openw(</span><span style="color: #CE9178">&#39;VIEW&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- non-default transformations to improve DDL</span></span>
<span class="line"><span style="color: #D4D4D4">      l_ddl_handle  := sys.dbms_metadata.add_transform(l_main_handle, </span><span style="color: #CE9178">&#39;DDL&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.set_transform_param(l_ddl_handle, </span><span style="color: #CE9178">&#39;FORCE&#39;</span><span style="color: #D4D4D4">, false);</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.set_transform_param(l_ddl_handle, </span><span style="color: #CE9178">&#39;COLLATION_CLAUSE&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;NO_NLS&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.set_transform_param(l_ddl_handle, </span><span style="color: #CE9178">&#39;SQLTERMINATOR&#39;</span><span style="color: #D4D4D4">, true);</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">      sys.dbms_metadata.set_transform_param(l_ddl_handle, </span><span style="color: #CE9178">&#39;VERSION&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1120000000</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- get DDL</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_lob.createtemporary(l_ddl, false, sys.dbms_lob.</span><span style="color: #569CD6">session</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.</span><span style="color: #DCDCAA">convert</span><span style="color: #D4D4D4">(l_main_handle, l_xml, l_ddl);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- free dbms_metadata resources</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.</span><span style="color: #569CD6">close</span><span style="color: #D4D4D4">(l_main_handle);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- return result</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> l_ddl;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">end</span><span style="color: #D4D4D4"> view_ddl;</span></span>
<span class="line"><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> xmlserialize(document xmltype(sys.dbms_metadata.get_xml(</span><span style="color: #CE9178">&#39;VIEW&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;DEPTSAL&#39;</span><span style="color: #D4D4D4">, user))</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> clob indent </span><span style="color: #569CD6">size</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> dual</span></span>
<span class="line"><span style="color: #569CD6">union all</span></span>
<span class="line"><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> view_ddl(</span><span style="color: #CE9178">&#39;DEPTSAL&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> dual</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p class="wp-block-paragraph">The query produces the following two rows (CLOBs):</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<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(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">7) XML input</span><span role="button" tabindex="0" data-code="&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;ROWSET&gt;
    &lt;ROW&gt;
        &lt;VIEW_T&gt;
            &lt;VERS_MAJOR&gt;1&lt;/VERS_MAJOR&gt;
            &lt;VERS_MINOR&gt;4 &lt;/VERS_MINOR&gt;
            &lt;OBJ_NUM&gt;232322&lt;/OBJ_NUM&gt;
            &lt;SCHEMA_OBJ&gt;
                &lt;OBJ_NUM&gt;232322&lt;/OBJ_NUM&gt;
                &lt;OWNER_NUM&gt;501&lt;/OWNER_NUM&gt;
                &lt;OWNER_NAME&gt;REDSTACK&lt;/OWNER_NAME&gt;
                &lt;NAME&gt;DEPTSAL&lt;/NAME&gt;
                &lt;NAMESPACE&gt;1&lt;/NAMESPACE&gt;
                &lt;TYPE_NUM&gt;4&lt;/TYPE_NUM&gt;
                &lt;TYPE_NAME&gt;VIEW&lt;/TYPE_NAME&gt;
                &lt;CTIME&gt;2022-10-04 12:11:25&lt;/CTIME&gt;
                &lt;MTIME&gt;2022-10-04 12:11:25&lt;/MTIME&gt;
                &lt;STIME&gt;2022-10-04 12:11:25&lt;/STIME&gt;
                &lt;STATUS&gt;1&lt;/STATUS&gt;
                &lt;FLAGS&gt;0&lt;/FLAGS&gt;
                &lt;FLAGS2&gt;0&lt;/FLAGS2&gt;
                &lt;SPARE1&gt;6&lt;/SPARE1&gt;
                &lt;SPARE2&gt;65535&lt;/SPARE2&gt;
                &lt;SPARE3&gt;501&lt;/SPARE3&gt;
                &lt;OWNER_NAME2&gt;REDSTACK&lt;/OWNER_NAME2&gt;
                &lt;SIGNATURE&gt;76DCDE35671FAA6AF576D6A6B4D97D48&lt;/SIGNATURE&gt;
                &lt;SPARE7&gt;134233583&lt;/SPARE7&gt;
                &lt;SPARE8&gt;0&lt;/SPARE8&gt;
                &lt;SPARE9&gt;0&lt;/SPARE9&gt;
                &lt;DFLCOLLNAME&gt;USING_NLS_COMP&lt;/DFLCOLLNAME&gt;
            &lt;/SCHEMA_OBJ&gt;
            &lt;AUDIT_VAL&gt;--------------------------------------&lt;/AUDIT_VAL&gt;
            &lt;COLS&gt;5&lt;/COLS&gt;
            &lt;INTCOLS&gt;5&lt;/INTCOLS&gt;
            &lt;PROPERTY&gt;0&lt;/PROPERTY&gt;
            &lt;PROPERTY2&gt;0&lt;/PROPERTY2&gt;
            &lt;FLAGS&gt;0&lt;/FLAGS&gt;
            &lt;TEXTLENGTH&gt;270&lt;/TEXTLENGTH&gt;
            &lt;TEXT&gt;select d.deptno,
          d.dname,
          nvl(sum(e.sal), 0) as sum_sal,
          nvl(count(e.empno), 0) as num_emps,
          nvl(round(avg(e.sal), 2), 0) as avg_sal
     from dept d
     left join emp e
       on e.deptno = d.deptno
   group by d.deptno, d.dname&lt;/TEXT&gt;
            &lt;COL_LIST&gt;
                &lt;COL_LIST_ITEM&gt;
                    &lt;OBJ_NUM&gt;232322&lt;/OBJ_NUM&gt;
                    &lt;COL_NUM&gt;1&lt;/COL_NUM&gt;
                    &lt;INTCOL_NUM&gt;1&lt;/INTCOL_NUM&gt;
                    &lt;SEGCOL_NUM&gt;1&lt;/SEGCOL_NUM&gt;
                    &lt;PROPERTY&gt;0&lt;/PROPERTY&gt;
                    &lt;PROPERTY2&gt;0&lt;/PROPERTY2&gt;
                    &lt;NAME&gt;DEPTNO&lt;/NAME&gt;
                    &lt;TYPE_NUM&gt;2&lt;/TYPE_NUM&gt;
                &lt;/COL_LIST_ITEM&gt;
                &lt;COL_LIST_ITEM&gt;
                    &lt;OBJ_NUM&gt;232322&lt;/OBJ_NUM&gt;
                    &lt;COL_NUM&gt;2&lt;/COL_NUM&gt;
                    &lt;INTCOL_NUM&gt;2&lt;/INTCOL_NUM&gt;
                    &lt;SEGCOL_NUM&gt;2&lt;/SEGCOL_NUM&gt;
                    &lt;PROPERTY&gt;0&lt;/PROPERTY&gt;
                    &lt;PROPERTY2&gt;0&lt;/PROPERTY2&gt;
                    &lt;NAME&gt;DNAME&lt;/NAME&gt;
                    &lt;TYPE_NUM&gt;1&lt;/TYPE_NUM&gt;
                &lt;/COL_LIST_ITEM&gt;
                &lt;COL_LIST_ITEM&gt;
                    &lt;OBJ_NUM&gt;232322&lt;/OBJ_NUM&gt;
                    &lt;COL_NUM&gt;3&lt;/COL_NUM&gt;
                    &lt;INTCOL_NUM&gt;3&lt;/INTCOL_NUM&gt;
                    &lt;SEGCOL_NUM&gt;3&lt;/SEGCOL_NUM&gt;
                    &lt;PROPERTY&gt;14336&lt;/PROPERTY&gt;
                    &lt;PROPERTY2&gt;0&lt;/PROPERTY2&gt;
                    &lt;NAME&gt;SUM_SAL&lt;/NAME&gt;
                    &lt;TYPE_NUM&gt;2&lt;/TYPE_NUM&gt;
                &lt;/COL_LIST_ITEM&gt;
                &lt;COL_LIST_ITEM&gt;
                    &lt;OBJ_NUM&gt;232322&lt;/OBJ_NUM&gt;
                    &lt;COL_NUM&gt;4&lt;/COL_NUM&gt;
                    &lt;INTCOL_NUM&gt;4&lt;/INTCOL_NUM&gt;
                    &lt;SEGCOL_NUM&gt;4&lt;/SEGCOL_NUM&gt;
                    &lt;PROPERTY&gt;14336&lt;/PROPERTY&gt;
                    &lt;PROPERTY2&gt;0&lt;/PROPERTY2&gt;
                    &lt;NAME&gt;NUM_EMPS&lt;/NAME&gt;
                    &lt;TYPE_NUM&gt;2&lt;/TYPE_NUM&gt;
                &lt;/COL_LIST_ITEM&gt;
                &lt;COL_LIST_ITEM&gt;
                    &lt;OBJ_NUM&gt;232322&lt;/OBJ_NUM&gt;
                    &lt;COL_NUM&gt;5&lt;/COL_NUM&gt;
                    &lt;INTCOL_NUM&gt;5&lt;/INTCOL_NUM&gt;
                    &lt;SEGCOL_NUM&gt;5&lt;/SEGCOL_NUM&gt;
                    &lt;PROPERTY&gt;14336&lt;/PROPERTY&gt;
                    &lt;PROPERTY2&gt;0&lt;/PROPERTY2&gt;
                    &lt;NAME&gt;AVG_SAL&lt;/NAME&gt;
                    &lt;TYPE_NUM&gt;2&lt;/TYPE_NUM&gt;
                &lt;/COL_LIST_ITEM&gt;
            &lt;/COL_LIST&gt;
            &lt;COL_LIST2/&gt;
            &lt;CON1_LIST/&gt;
            &lt;CON2_LIST/&gt;
        &lt;/VIEW_T&gt;
    &lt;/ROW&gt;
&lt;/ROWSET&gt;" 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: #808080">&lt;?</span><span style="color: #569CD6">xml</span><span style="color: #9CDCFE"> version</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;1.0&quot;</span><span style="color: #808080">?&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">ROWSET</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">ROW</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">VIEW_T</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">VERS_MAJOR</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">1</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">VERS_MAJOR</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">VERS_MINOR</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">4 </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">VERS_MINOR</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">OBJ_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">232322</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">OBJ_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SCHEMA_OBJ</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">OBJ_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">232322</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">OBJ_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">OWNER_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">501</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">OWNER_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">OWNER_NAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">REDSTACK</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">OWNER_NAME</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">DEPTSAL</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">NAMESPACE</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">1</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">NAMESPACE</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">TYPE_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">4</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">TYPE_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">TYPE_NAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">VIEW</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">TYPE_NAME</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">CTIME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">2022-10-04 12:11:25</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">CTIME</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">MTIME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">2022-10-04 12:11:25</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">MTIME</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">STIME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">2022-10-04 12:11:25</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">STIME</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">STATUS</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">1</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">STATUS</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">FLAGS</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">0</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">FLAGS</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">FLAGS2</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">0</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">FLAGS2</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SPARE1</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">6</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SPARE1</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SPARE2</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">65535</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SPARE2</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SPARE3</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">501</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SPARE3</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">OWNER_NAME2</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">REDSTACK</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">OWNER_NAME2</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SIGNATURE</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">76DCDE35671FAA6AF576D6A6B4D97D48</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SIGNATURE</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SPARE7</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">134233583</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SPARE7</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SPARE8</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">0</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SPARE8</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SPARE9</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">0</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SPARE9</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">DFLCOLLNAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">USING_NLS_COMP</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">DFLCOLLNAME</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SCHEMA_OBJ</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">AUDIT_VAL</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">--------------------------------------</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">AUDIT_VAL</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COLS</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">5</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COLS</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">INTCOLS</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">5</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">INTCOLS</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">PROPERTY</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">0</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">PROPERTY</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">PROPERTY2</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">0</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">PROPERTY2</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">FLAGS</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">0</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">FLAGS</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">TEXTLENGTH</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">270</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">TEXTLENGTH</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">TEXT</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">select d.deptno,</span></span>
<span class="line"><span style="color: #D4D4D4">          d.dname,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(sum(e.sal), 0) as sum_sal,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(count(e.empno), 0) as num_emps,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(round(avg(e.sal), 2), 0) as avg_sal</span></span>
<span class="line"><span style="color: #D4D4D4">     from dept d</span></span>
<span class="line"><span style="color: #D4D4D4">     left join emp e</span></span>
<span class="line"><span style="color: #D4D4D4">       on e.deptno = d.deptno</span></span>
<span class="line"><span style="color: #D4D4D4">   group by d.deptno, d.dname</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">TEXT</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_LIST</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">OBJ_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">232322</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">OBJ_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">1</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">INTCOL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">1</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">INTCOL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SEGCOL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">1</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SEGCOL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">PROPERTY</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">0</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">PROPERTY</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">PROPERTY2</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">0</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">PROPERTY2</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">DEPTNO</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">TYPE_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">2</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">TYPE_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">OBJ_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">232322</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">OBJ_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">2</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">INTCOL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">2</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">INTCOL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SEGCOL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">2</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SEGCOL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">PROPERTY</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">0</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">PROPERTY</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">PROPERTY2</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">0</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">PROPERTY2</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">DNAME</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">TYPE_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">1</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">TYPE_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">OBJ_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">232322</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">OBJ_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">3</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">INTCOL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">3</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">INTCOL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SEGCOL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">3</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SEGCOL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">PROPERTY</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">14336</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">PROPERTY</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">PROPERTY2</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">0</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">PROPERTY2</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">SUM_SAL</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">TYPE_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">2</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">TYPE_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">OBJ_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">232322</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">OBJ_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">4</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">INTCOL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">4</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">INTCOL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SEGCOL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">4</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SEGCOL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">PROPERTY</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">14336</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">PROPERTY</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">PROPERTY2</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">0</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">PROPERTY2</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">NUM_EMPS</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">TYPE_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">2</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">TYPE_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">OBJ_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">232322</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">OBJ_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">5</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">INTCOL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">5</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">INTCOL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SEGCOL_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">5</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SEGCOL_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">PROPERTY</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">14336</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">PROPERTY</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">PROPERTY2</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">0</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">PROPERTY2</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">AVG_SAL</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">TYPE_NUM</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">2</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">TYPE_NUM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_LIST</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_LIST2</span><span style="color: #808080">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">CON1_LIST</span><span style="color: #808080">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">CON2_LIST</span><span style="color: #808080">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">VIEW_T</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">ROW</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">ROWSET</span><span style="color: #808080">&gt;</span></span></code></pre></div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<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(2 * 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">8) Customized DDL from XML</span><span role="button" tabindex="0" data-code="    CREATE OR REPLACE VIEW &quot;DEPTSAL&quot; () AS 
  select d.deptno,
          d.dname,
          nvl(sum(e.sal), 0) as sum_sal,
          nvl(count(e.empno), 0) as num_emps,
          nvl(round(avg(e.sal), 2), 0) as avg_sal
     from dept d
     left join emp e
       on e.deptno = d.deptno
    group by d.deptno, d.dname;" 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: #D4D4D4">    </span><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VIEW</span><span style="color: #D4D4D4"> &quot;</span><span style="color: #DCDCAA">DEPTSAL</span><span style="color: #D4D4D4">&quot; () </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> d.deptno,</span></span>
<span class="line"><span style="color: #D4D4D4">          d.dname,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">sum</span><span style="color: #D4D4D4">(e.sal), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> sum_sal,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">count</span><span style="color: #D4D4D4">(e.empno), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> num_emps,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">round</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">avg</span><span style="color: #D4D4D4">(e.sal), </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> avg_sal</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> dept d</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">left join</span><span style="color: #D4D4D4"> emp e</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> e.deptno = d.deptno</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">group by</span><span style="color: #D4D4D4"> d.deptno, d.dname;</span></span></code></pre></div>



<p class="wp-block-paragraph">We removed the&nbsp;<code>OWNER_NAME</code>&nbsp;node (on line 11) from the XML document. As a result, the schema was removed in the DDL. The result is the same as with the&nbsp;<code>REMAP_SCHEMA</code>&nbsp;transformation. Perfect.</p>



<p class="wp-block-paragraph">We also removed the&nbsp;<code>COL_LIST</code>&nbsp;node (lines 48-99) from the XML document. However, the result in the DDL regarding the column alias list does not look good. The columns are gone, but the surrounding parentheses survived, which makes the DDL invalid. IMO this is a bug in the&nbsp;<code>$ORACLE_HOME/rdbms/xml/xsl/kuview.xsl</code>&nbsp;script. It’s handled correctly in the SXML script as we will see later. However, we can fix that by calling&nbsp;<code>replace(..., '" () AS', '" AS')</code>&nbsp;. Please note that a complete solution should do some checks to ensure that the&nbsp;<code>COL_LIST</code>&nbsp;is really not required.</p>



<p class="wp-block-paragraph">When you look at line 12 in the XML document (<code>&lt;NAME&gt;DEPTSAL&lt;/NAME&gt;</code>), you see that the view name does not contain double quotes. This is a strong indicator, that there is no way to remove the double quotes by manipulating the input XML document. In fact, the double quotes are hard-coded in all XSLT scripts. No way to override this behavior via&nbsp;<code>dbms_metadata</code>.</p>



<p class="wp-block-paragraph">Furthermore, you do not find a node named like&nbsp;<code>EDITIONABLE</code>with a value&nbsp;<code>Y</code>&nbsp;as in&nbsp;<code>all_objects</code>. Why? Because this information is stored in the node&nbsp;<code>FLAGS</code>.&nbsp;<code>0</code>&nbsp;means&nbsp;<code>editionable</code>&nbsp;and&nbsp;<code>1048576</code>&nbsp;means&nbsp;<code>noneditionable</code>. To be precise&nbsp;<code>1048576</code>&nbsp;represents bit number&nbsp;<code>21</code>. If this bit is set then the view is&nbsp;<code>noneditionable</code>. You find the proof for this statement in the&nbsp;<code>dba_objects</code>&nbsp;view, where the expression for the&nbsp;<code>editionable</code>&nbsp;column looks like this:</p>



<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(2 * 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">9) Editionable column in dba_objects (formatted)</span><span role="button" tabindex="0" data-code="case
   when o.type# in (
      4, 5, 7, 8, 9, 11, 12, 13, 14, 22, 87, 114
   )
   then
      decode(
         bitand(o.flags, 1048576),
            0,       'Y', 
            1048576, 'N', 
                     'Y'
      )
   else
      null
end" 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">case</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">when</span><span style="color: #D4D4D4"> o.type# </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">7</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">8</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">9</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">11</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">12</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">13</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">14</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">22</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">87</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">114</span></span>
<span class="line"><span style="color: #D4D4D4">   )</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">then</span></span>
<span class="line"><span style="color: #D4D4D4">      decode(</span></span>
<span class="line"><span style="color: #D4D4D4">         bitand(o.flags, </span><span style="color: #B5CEA8">1048576</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">,       </span><span style="color: #CE9178">&#39;Y&#39;</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #B5CEA8">1048576</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;N&#39;</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">                     </span><span style="color: #CE9178">&#39;Y&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">      )</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">else</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">null</span></span>
<span class="line"><span style="color: #569CD6">end</span></span></code></pre></div>



<p class="wp-block-paragraph">The&nbsp;<code>$ORACLE_HOME/rdbms/xml/xsl/kucommon.xsl</code>script (see template&nbsp;<code>Editionable</code>) is evaluating this flag and either emitting a&nbsp;<code>EDITIONABLE</code>&nbsp;or&nbsp;<code>NONEDITIONABLE</code>&nbsp;text. These keywords were introduced in version 12.1. Since&nbsp;<code>dbms_metadata</code>&nbsp;can produce version-specific DDL, we set the version to 11.2 to suppress&nbsp;<code>EDITIONABLE</code>&nbsp;in the resulting DDL.</p>
</div>
</div>



<h3 class="wp-block-heading">Convert SXML to DDL</h3>



<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(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">10) Get customized DDL from SXML</span><span role="button" tabindex="0" data-code="with
   function view_ddl(in_name in varchar2) return clob is
      l_sxml        xmltype;
      l_main_handle integer;
      l_ddl_handle  integer;
      l_ddl         clob;
   begin
      -- create SXML document and remove unwanted nodes
      l_sxml        := xmltype(sys.dbms_metadata.get_sxml('VIEW', in_name, user));
      l_sxml        := l_sxml.deletexml('/VIEW/SCHEMA', 'xmlns=http://xmlns.oracle.com/ku');
      l_sxml        := l_sxml.deletexml('/VIEW/COL_LIST', 'xmlns=http://xmlns.oracle.com/ku');
      -- initialize dbms_metadata for view based on SXML input
      l_main_handle := sys.dbms_metadata.openw('VIEW');
      -- non-default transformations to improve DDL
      l_ddl_handle  := sys.dbms_metadata.add_transform(l_main_handle, 'SXMLDDL');
      sys.dbms_metadata.set_transform_param(l_ddl_handle, 'FORCE', false);
      sys.dbms_metadata.set_transform_param(l_ddl_handle, 'COLLATION_CLAUSE', 'NO_NLS');
      sys.dbms_metadata.set_transform_param(l_ddl_handle, 'SQLTERMINATOR', true);
      sys.dbms_metadata.set_transform_param(l_ddl_handle, 'VERSION', 1120000000);
      -- get DDL
      sys.dbms_lob.createtemporary(l_ddl, false, sys.dbms_lob.session);
      sys.dbms_metadata.convert(l_main_handle, l_sxml, l_ddl);
      -- free dbms_metadata resources
      sys.dbms_metadata.close(l_main_handle);
      -- return result
      return l_ddl;
   end view_ddl;
select xmlserialize(document xmltype(sys.dbms_metadata.get_sxml('VIEW', 'DEPTSAL', user))
          as clob indent size = 4)
  from dual
union all
select view_ddl('DEPTSAL')
  from dual
/" 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">with</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> view_ddl(in_name </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">varchar2</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> clob </span><span style="color: #569CD6">is</span></span>
<span class="line"><span style="color: #D4D4D4">      l_sxml        xmltype;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_main_handle </span><span style="color: #569CD6">integer</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_ddl_handle  </span><span style="color: #569CD6">integer</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_ddl         clob;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">begin</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- create SXML document and remove unwanted nodes</span></span>
<span class="line"><span style="color: #D4D4D4">      l_sxml        := xmltype(sys.dbms_metadata.get_sxml(</span><span style="color: #CE9178">&#39;VIEW&#39;</span><span style="color: #D4D4D4">, in_name, user));</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">      l_sxml        := l_sxml.deletexml(</span><span style="color: #CE9178">&#39;/VIEW/SCHEMA&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;xmlns=http://xmlns.oracle.com/ku&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">      l_sxml        := l_sxml.deletexml(</span><span style="color: #CE9178">&#39;/VIEW/COL_LIST&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;xmlns=http://xmlns.oracle.com/ku&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- initialize dbms_metadata for view based on SXML input</span></span>
<span class="line"><span style="color: #D4D4D4">      l_main_handle := sys.dbms_metadata.openw(</span><span style="color: #CE9178">&#39;VIEW&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- non-default transformations to improve DDL</span></span>
<span class="line"><span style="color: #D4D4D4">      l_ddl_handle  := sys.dbms_metadata.add_transform(l_main_handle, </span><span style="color: #CE9178">&#39;SXMLDDL&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.set_transform_param(l_ddl_handle, </span><span style="color: #CE9178">&#39;FORCE&#39;</span><span style="color: #D4D4D4">, false);</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.set_transform_param(l_ddl_handle, </span><span style="color: #CE9178">&#39;COLLATION_CLAUSE&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;NO_NLS&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.set_transform_param(l_ddl_handle, </span><span style="color: #CE9178">&#39;SQLTERMINATOR&#39;</span><span style="color: #D4D4D4">, true);</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">      sys.dbms_metadata.set_transform_param(l_ddl_handle, </span><span style="color: #CE9178">&#39;VERSION&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1120000000</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- get DDL</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_lob.createtemporary(l_ddl, false, sys.dbms_lob.</span><span style="color: #569CD6">session</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.</span><span style="color: #DCDCAA">convert</span><span style="color: #D4D4D4">(l_main_handle, l_sxml, l_ddl);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- free dbms_metadata resources</span></span>
<span class="line"><span style="color: #D4D4D4">      sys.dbms_metadata.</span><span style="color: #569CD6">close</span><span style="color: #D4D4D4">(l_main_handle);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">-- return result</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> l_ddl;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">end</span><span style="color: #D4D4D4"> view_ddl;</span></span>
<span class="line"><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> xmlserialize(document xmltype(sys.dbms_metadata.get_sxml(</span><span style="color: #CE9178">&#39;VIEW&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;DEPTSAL&#39;</span><span style="color: #D4D4D4">, user))</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> clob indent </span><span style="color: #569CD6">size</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> dual</span></span>
<span class="line"><span style="color: #569CD6">union all</span></span>
<span class="line"><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> view_ddl(</span><span style="color: #CE9178">&#39;DEPTSAL&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> dual</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<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(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">11) SXML input</span><span role="button" tabindex="0" data-code="&lt;VIEW xmlns=&quot;http://xmlns.oracle.com/ku&quot; version=&quot;1.0&quot;&gt;
    &lt;SCHEMA&gt;REDSTACK&lt;/SCHEMA&gt;
    &lt;NAME&gt;DEPTSAL&lt;/NAME&gt;
    &lt;DEFAULT_COLLATION&gt;USING_NLS_COMP&lt;/DEFAULT_COLLATION&gt;
    &lt;COL_LIST&gt;
        &lt;COL_LIST_ITEM&gt;
            &lt;NAME&gt;DEPTNO&lt;/NAME&gt;
        &lt;/COL_LIST_ITEM&gt;
        &lt;COL_LIST_ITEM&gt;
            &lt;NAME&gt;DNAME&lt;/NAME&gt;
        &lt;/COL_LIST_ITEM&gt;
        &lt;COL_LIST_ITEM&gt;
            &lt;NAME&gt;SUM_SAL&lt;/NAME&gt;
        &lt;/COL_LIST_ITEM&gt;
        &lt;COL_LIST_ITEM&gt;
            &lt;NAME&gt;NUM_EMPS&lt;/NAME&gt;
        &lt;/COL_LIST_ITEM&gt;
        &lt;COL_LIST_ITEM&gt;
            &lt;NAME&gt;AVG_SAL&lt;/NAME&gt;
        &lt;/COL_LIST_ITEM&gt;
    &lt;/COL_LIST&gt;
    &lt;SUBQUERY&gt;select d.deptno,
          d.dname,
          nvl(sum(e.sal), 0) as sum_sal,
          nvl(count(e.empno), 0) as num_emps,
          nvl(round(avg(e.sal), 2), 0) as avg_sal
     from dept d
     left join emp e
       on e.deptno = d.deptno
   group by d.deptno, d.dname&lt;/SUBQUERY&gt;
&lt;/VIEW&gt;" 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: #808080">&lt;</span><span style="color: #569CD6">VIEW</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xmlns</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;http://xmlns.oracle.com/ku&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">version</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;1.0&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SCHEMA</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">REDSTACK</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SCHEMA</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">DEPTSAL</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">DEFAULT_COLLATION</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">USING_NLS_COMP</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">DEFAULT_COLLATION</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_LIST</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">DEPTNO</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">DNAME</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">SUM_SAL</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">NUM_EMPS</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">AVG_SAL</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">NAME</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_LIST_ITEM</span><span style="color: #808080">&gt;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">COL_LIST</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">SUBQUERY</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">select d.deptno,</span></span>
<span class="line"><span style="color: #D4D4D4">          d.dname,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(sum(e.sal), 0) as sum_sal,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(count(e.empno), 0) as num_emps,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(round(avg(e.sal), 2), 0) as avg_sal</span></span>
<span class="line"><span style="color: #D4D4D4">     from dept d</span></span>
<span class="line"><span style="color: #D4D4D4">     left join emp e</span></span>
<span class="line"><span style="color: #D4D4D4">       on e.deptno = d.deptno</span></span>
<span class="line"><span style="color: #D4D4D4">   group by d.deptno, d.dname</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">SUBQUERY</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">VIEW</span><span style="color: #808080">&gt;</span></span></code></pre></div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<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(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">12) Customized DDL from SXML</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE VIEW &quot;&quot;.&quot;DEPTSAL&quot; 
  AS 
  select d.deptno,
          d.dname,
          nvl(sum(e.sal), 0) as sum_sal,
          nvl(count(e.empno), 0) as num_emps,
          nvl(round(avg(e.sal), 2), 0) as avg_sal
     from dept d
     left join emp e
       on e.deptno = d.deptno
    group by d.deptno, d.dname;" 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 cbp-line-highlight"><span style="color: #569CD6">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OR</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">REPLACE</span><span style="color: #D4D4D4"> VIEW </span><span style="color: #CE9178">&quot;&quot;</span><span style="color: #D4D4D4">.</span><span style="color: #CE9178">&quot;DEPTSAL&quot;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> d.deptno,</span></span>
<span class="line"><span style="color: #D4D4D4">          d.dname,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">sum</span><span style="color: #D4D4D4">(e.sal), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> sum_sal,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">count</span><span style="color: #D4D4D4">(e.empno), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> num_emps,</span></span>
<span class="line"><span style="color: #D4D4D4">          nvl(</span><span style="color: #DCDCAA">round</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">avg</span><span style="color: #D4D4D4">(e.sal), </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">), </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> avg_sal</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> dept d</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">left join</span><span style="color: #D4D4D4"> emp e</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> e.deptno = d.deptno</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">group by</span><span style="color: #D4D4D4"> d.deptno, d.dname;</span></span></code></pre></div>



<p class="wp-block-paragraph">The SXML document is smaller. It contains just the nodes to produce a DDL. That makes it easier to read.</p>



<p class="wp-block-paragraph">We removed the&nbsp;<code>SCHEMA</code>&nbsp;node (on line 2) from the SXML document. As a result, the schema was removed in the DDL. But not completely. Two double quotes and one dot survived, which makes the DDL invalid. IMO this is a bug in the&nbsp;<code>$ORACLE_HOME/rdbms/xml/xsl/kusviewd.xsl</code>&nbsp;script. It’s handled correctly in the XML script. We could fix that with a&nbsp;<code>replace(..., 'VIEW ""."', 'VIEW "')</code>&nbsp;call. As long as the search term is not ambiguous, everything should be fine.</p>



<p class="wp-block-paragraph">We also removed the&nbsp;<code>COL_LIST</code>&nbsp;node (lines 5-21) from the SXML document. In this case, the column alias list is completely removed from the DDL. Including the parentheses. Nice.</p>



<p class="wp-block-paragraph">Maybe you wonder how&nbsp;<code>editionable</code>&nbsp;is represented in the SXML document. – With a&nbsp;<code>NONEDITIONABLE</code>&nbsp;node if the view is&nbsp;<code>noneditionable</code>.</p>
</div>
</div>



<h2 class="wp-block-heading">How Can We Work Around the Limitations?</h2>



<p class="wp-block-paragraph">We’ve seen the limitations of the current&nbsp;<code>dbms_metadata</code>&nbsp;API and the necessity to use string manipulation functions to fix invalid DDL.</p>



<p class="wp-block-paragraph">There is no way to remove double quotes from quoted identifiers with&nbsp;<code>dbms_metadata</code>. However, as Connor McDonald demonstrated in his&nbsp;<a href="https://connor-mcdonald.com/2022/03/02/cleaner-ddl-than-dbms_metadata/">blog post</a>&nbsp;we can remove them with some string acrobatics. Why not use a simple&nbsp;<code>replace</code>&nbsp;call? Because there are some rules to follow. A globally applied&nbsp;<code>replace(..., '"', null)</code>&nbsp;call would produce invalid code in many real-life scenarios. We need a more robust solution.</p>



<p class="wp-block-paragraph">Applying the rules in a code formatter can be such a robust solution.</p>



<h2 class="wp-block-heading">Rules for Safely Removing Double Quotes from Quoted Identifiers</h2>



<p class="wp-block-paragraph">What are the rules to follow?</p>



<h3 class="wp-block-heading">1. Is a SQL or PL/SQL Identifier</h3>



<p class="wp-block-paragraph">You have to make sure that the double quotes surround a SQL or PL/SQL identifier. Sounds logical. However, it is not that simple. Here are some examples:</p>



<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);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">13) PL/SQL comment</span><span role="button" tabindex="0" data-code="create or replace procedure plsql_comment is
begin
   -- &quot;NOT_AN_IDENTIFIER&quot;
   /*
      &quot;NOT_AN_IDENTIFIER&quot;
   */
   null;
end;
/" 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">create or replace</span><span style="color: #D4D4D4"> procedure plsql_comment </span><span style="color: #569CD6">is</span></span>
<span class="line"><span style="color: #569CD6">begin</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- &quot;NOT_AN_IDENTIFIER&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">/*</span></span>
<span class="line cbp-line-highlight"><span style="color: #6A9955">      &quot;NOT_AN_IDENTIFIER&quot;</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">end</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<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(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">14) PL/SQL string</span><span role="button" tabindex="0" data-code="create or replace procedure plsql_string is
   l_string1 varchar2(100 char);
   l_string2 varchar2(100 char);
begin
   l_string1 := '&quot;NOT_AN_IDENTIFIER&quot;';
   l_string2 := q'[
                   &quot;NOT_AN_IDENTIFIER&quot;
                ]';
end;
/" 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">create or replace</span><span style="color: #D4D4D4"> procedure plsql_string </span><span style="color: #569CD6">is</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #9CDCFE">l_string1</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">varchar2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">char</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #9CDCFE">l_string2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">varchar2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">char</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #569CD6">begin</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">   </span><span style="color: #9CDCFE">l_string1</span><span style="color: #D4D4D4"> := </span><span style="color: #CE9178">&#39;&quot;NOT_AN_IDENTIFIER&quot;&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #9CDCFE">l_string2</span><span style="color: #D4D4D4"> := q</span><span style="color: #CE9178">&#39;[</span></span>
<span class="line cbp-line-highlight"><span style="color: #CE9178">                   &quot;NOT_AN_IDENTIFIER&quot;</span></span>
<span class="line"><span style="color: #CE9178">                ]&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">end</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<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(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">15) PL/SQL conditional compilation text</span><span role="button" tabindex="0" data-code="create or replace procedure plsql_conditional_compilation_text is
begin
   $if false $then
      Conditional compilation blocks can contain any text.
      It does not need to be valid PL/SQL.
      &quot;NOT_AN_IDENTIFIER&quot;
      FTLDB and tePLSQL use this construct to store code templates in such blocks.
   $end
   null;
end;
/" 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">create or replace</span><span style="color: #D4D4D4"> procedure plsql_conditional_compilation_text </span><span style="color: #569CD6">is</span></span>
<span class="line"><span style="color: #569CD6">begin</span></span>
<span class="line"><span style="color: #D4D4D4">   $</span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4"> $</span><span style="color: #569CD6">then</span></span>
<span class="line"><span style="color: #D4D4D4">      Conditional compilation blocks can contain </span><span style="color: #569CD6">any</span><span style="color: #D4D4D4"> text.</span></span>
<span class="line"><span style="color: #D4D4D4">      It does </span><span style="color: #569CD6">not</span><span style="color: #D4D4D4"> need to be valid PL/</span><span style="color: #569CD6">SQL</span><span style="color: #D4D4D4">.</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">      </span><span style="color: #CE9178">&quot;NOT_AN_IDENTIFIER&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">      FTLDB </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> tePLSQL use this construct to store code templates </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> such blocks.</span></span>
<span class="line"><span style="color: #D4D4D4">   $</span><span style="color: #569CD6">end</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">end</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>



<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);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">16) Java string</span><span role="button" tabindex="0" data-code="create or replace and resolve java source named &quot;JavaString&quot; as
public class JavaString {
  public static String hello() {
     return &quot;NOT_AN_IDENTIFIER&quot;;
  }
}
/" 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">create or replace</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> resolve </span><span style="color: #569CD6">java</span><span style="color: #D4D4D4"> source named </span><span style="color: #CE9178">&quot;JavaString&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">as</span></span>
<span class="line"><span style="color: #D4D4D4">public class JavaString {</span></span>
<span class="line"><span style="color: #D4D4D4">  public static String hello() {</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">     </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;NOT_AN_IDENTIFIER&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p class="wp-block-paragraph">You can solve the first three examples easily with a lexer. A lexer groups a stream of characters. Such a group of characters is called a lexer token. A lexer token knows the start and end position in a source text and has a type. The lexer in SQL Developer and SQLcl produces the following types of tokens:</p>



<ul class="wp-block-list">
<li>COMMENT (<code>/* ... */</code>)</li>



<li>LINE_COMMENT (<code>-- ...</code>)</li>



<li>QUOTED_STRING (<code>'string'</code>&nbsp;or&nbsp;<code>q'[string]'</code>)</li>



<li>DQUOTED_STRING (<code>"string"</code>&nbsp;)</li>



<li>WS (space, tab, new line, carriage return)</li>



<li>DIGITS (<code>0123456789</code>&nbsp;plus some special cases)</li>



<li>OPERATION (e.g.&nbsp;<code>()[]^-|!*+.&gt;&lt;=,;:%@?/~</code>)</li>



<li>IDENTIFIER (words)</li>



<li>MACRO_SKIP (conditional compilation tokens such as&nbsp;<code>$if</code>,&nbsp;<code>$then</code>, etc.)</li>
</ul>



<p class="wp-block-paragraph">We can simply focus on tokens of the type&nbsp;<code>DQUOTED_STRING</code>&nbsp;and ignore tokens that are within conditional compilation tokens&nbsp;<code>$if</code>and&nbsp;<code>$end</code>.</p>



<p class="wp-block-paragraph">To find out if a&nbsp;<code>DQUOTED_STRING</code>&nbsp;is part of a Java stored procedure is more difficult. Luckily SQL Developer’s parser cannot deal with Java stored procedures and produces a parse error. As a result, we just have to keep the code “as is” in such cases.</p>



<h3 class="wp-block-heading">2. Consists of Valid Characters</h3>



<p class="wp-block-paragraph">According to the&nbsp;<a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/plsql-language-fundamentals.html#GUID-DF2095E7-6D82-457C-BA82-00BEFABF5B24">PL/SQL Language Reference</a>&nbsp;a nonquoted identifier must comply with the following rules:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">An ordinary user-defined identifier:</p>



<ul class="wp-block-list">
<li>Begins with a letter</li>



<li>Can include letters, digits, and these symbols:
<ul class="wp-block-list">
<li>Dollar sign ($)</li>



<li>Number sign (#)</li>



<li>Underscore (_)</li>
</ul>
</li>
</ul>
</blockquote>



<p class="wp-block-paragraph">What is a valid letter in this context? The&nbsp;<a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Database-Object-Names-and-Qualifiers.html">SQL Language Reference</a>&nbsp;defines a letter as an “alphabetic character from your database character set”. Here are some examples of valid letters and therefore valid PL/SQL variable names or SQL column names:</p>



<ul class="wp-block-list">
<li>Latin letters (<code>AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz</code>)</li>



<li>Umlauts (<code>ÄäËëÏïÖöÜüŸÿ</code>)</li>



<li>German Esszett (<code>ẞß</code>), please note that the Oracle Database does not convert the case of an Esszett, because the uppercase Esszett exists offically only since&nbsp;<a href="https://www.rechtschreibrat.com/DOX/rfdr_PM_2017-06-29_Aktualisierung_Regelwerk.pdf">2017-03-29</a></li>



<li>C cedilla (<code>Çç</code>)</li>



<li>Grave accented letters (<code>ÀàÈèÌìÒòÙù</code>)</li>



<li>Acute accented letters (<code>ÁáĆćÉéÍíÓóÚúÝý)</code></li>



<li>Circumflex accented letters (<code>ÂâÊêÎîÔôÛû</code>)</li>



<li>Tilde accented letters (<code>ÃãÑñÕõ</code>)</li>



<li>Caron accented letters (<code>ǍǎB̌b̌ČčĚěF̌f̌ǦǧȞȟǏǐJ̌ǰǨǩM̌m̌ŇňǑǒP̌p̌Q̌q̌ŘřŠšǓǔV̌v̌W̌w̌X̌x̌Y̌y̌ŽžǮǯ</code>)</li>



<li>Ring accented letters (<code>ÅåŮů</code>)</li>



<li>Greek letters (<code>ΑαΒβΓγΔδΕεΖζΗηΘθΙιΚκΛλΜμΝνΞξΟοΠπΡρΣσΤτΥυΦφΧχΨψΩω</code>)</li>



<li>Common Cyrillic letters (<code>АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя</code>)</li>



<li>Hiragana letters (<code>ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖゝゞゟ</code>)</li>
</ul>



<p class="wp-block-paragraph">The Oracle Database throws an&nbsp;<a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/errmg/ORA-00910.html#GUID-D9EBDFFA-88C6-4185-BD2C-E1B959A97274__GUID-B763234E-65A7-41D3-9EC3-B83DAC009939">ORA-00911: invalid character</a>&nbsp;when this rule is violated.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Cause:&nbsp;The identifier <span class="highlight highlight-" style="background-color:Lemonchiffon;color:black;">name&nbsp;started with an ASCII character other than a letter or a number</span>
. After the first character of the identifier name, ASCII characters are allowed including “$”, “#” and “_”. Identifiers enclosed in double quotation marks may contain any character other than a double quotation. Alternate quotation marks (q’#…#’) cannot use spaces, tabs, or carriage returns as delimiters. For all other contexts, consult the SQL Language Reference Manual.</p>
</blockquote>



<p class="wp-block-paragraph">The cause for this error message seems to be outdated, inaccurate and wrong. Firstly, it limits letters to those contained in an&nbsp;<a href="https://en.wikipedia.org/wiki/ASCII#Character_set">ASCII character set</a>. This limitation is not generally valid anymore. Secondly, it claims that an identifier can start with a number, which is simply wrong. Thirdly, ASCII characters and letters are used as synonyms, which is misleading.</p>



<p class="wp-block-paragraph">However, there are still cases where an identifier is limited to ASCII characters or single byte characters. For example, a database name or a database link name. In the projects I know, the reduction of letters to&nbsp;<code>A-Z</code>&nbsp;for identifiers is not a problem. The use of accented letters in identifiers are typically oversights. Therefore, I recommend limiting the range of letters in identifiers to&nbsp;<code>A-Z</code>&nbsp;.</p>



<p class="wp-block-paragraph">Checking this rule is quite simple. We just have to make sure that the quoted identifier matches this regular expression:&nbsp;<code>^"[A-Z][A-Z0-9_$#]*"$</code>. This works with any regular expression engine, unlike&nbsp;<code>^"[[:alpha:]][[:alpha:]0-9_$#]*"$</code>.</p>



<h3 class="wp-block-heading">3. Is Not a Reserved Word</h3>



<p class="wp-block-paragraph">According to the&nbsp;<a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/plsql-language-fundamentals.html#GUID-DF2095E7-6D82-457C-BA82-00BEFABF5B24">PL/SQL Language Reference</a>&nbsp;and&nbsp;the&nbsp;<a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Oracle-SQL-Reserved-Words.html#GUID-55C49D1E-BE08-4C50-A9DD-8593EB925612">SQL Language Reference</a>&nbsp;a nonquoted identifier must not be a reserved word.</p>



<p class="wp-block-paragraph">If you are working with 3rd party parsers, the list of reserved words might not match the ones defined for the Oracle Database. In my case, I also want to consider the reserved words defined by db* CODECOP. I’m using the following query to create a JSON array with currently 260 keywords:</p>



<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(2 * 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">17) JSON array of keywords</span><span role="button" tabindex="0" data-code="select json_arrayagg(keyword order by keyword) as keywords
  from (
          -- reserved keywords in Oracle database 21.3.0.0.0 (ATP)
          select keyword
            from v$reserved_words
           where (reserved = 'Y' or res_type = 'Y' or res_attr = 'Y' or res_semi = 'Y')
             and keyword is not null
             and regexp_like(keyword, '^[A-Z][A-Z0-9_$#]*$') -- valid nonquoted identifier
          union
          -- reserved keywords in db* CODECOP's PL/SQL parser 4.2.0
          select keyword
            from json_table(
                    '[&quot;AFTER&quot;,&quot;ALL&quot;,&quot;ALLOW&quot;,&quot;ALTER&quot;,&quot;ANALYTIC&quot;,&quot;AND&quot;,&quot;ANYSCHEMA&quot;,&quot;AS&quot;,&quot;ASC&quot;,&quot;ASSOCIATE&quot;,&quot;AUTHID&quot;,&quot;AUTOMATIC&quot;,
                      &quot;AUTONOMOUS_TRANSACTION&quot;,&quot;BEFORE&quot;,&quot;BEGIN&quot;,&quot;BETWEEN&quot;,&quot;BULK&quot;,&quot;BY&quot;,&quot;BYTE&quot;,&quot;CANONICAL&quot;,&quot;CASE&quot;,
                      &quot;CASE-SENSITIVE&quot;,&quot;CHECK&quot;,&quot;CLUSTER&quot;,&quot;COMPOUND&quot;,&quot;CONNECT&quot;,&quot;CONNECT_BY_ROOT&quot;,&quot;CONSTANT&quot;,&quot;CONSTRAINT&quot;,
                      &quot;CONSTRUCTOR&quot;,&quot;CORRUPT_XID&quot;,&quot;CORRUPT_XID_ALL&quot;,&quot;CREATE&quot;,&quot;CROSSEDITION&quot;,&quot;CURRENT&quot;,&quot;CUSTOMDATUM&quot;,
                      &quot;CYCLE&quot;,&quot;DB_ROLE_CHANGE&quot;,&quot;DECLARE&quot;,&quot;DECREMENT&quot;,&quot;DEFAULTS&quot;,&quot;DEFINE&quot;,&quot;DEFINER&quot;,&quot;DETERMINISTIC&quot;,
                      &quot;DIMENSION&quot;,&quot;DISALLOW&quot;,&quot;DISASSOCIATE&quot;,&quot;DISTINCT&quot;,&quot;DROP&quot;,&quot;EACH&quot;,&quot;EDITIONING&quot;,&quot;ELSE&quot;,&quot;ELSIF&quot;,
                      &quot;END&quot;,&quot;EVALNAME&quot;,&quot;EXCEPTION&quot;,&quot;EXCEPTION_INIT&quot;,&quot;EXCEPTIONS&quot;,&quot;EXCLUSIVE&quot;,&quot;EXTERNAL&quot;,&quot;FETCH&quot;,
                      &quot;FOLLOWING&quot;,&quot;FOLLOWS&quot;,&quot;FOR&quot;,&quot;FORALL&quot;,&quot;FROM&quot;,&quot;GOTO&quot;,&quot;GRANT&quot;,&quot;GROUP&quot;,&quot;HAVING&quot;,&quot;HIDE&quot;,&quot;HIER_ANCESTOR&quot;,
                      &quot;HIER_LAG&quot;,&quot;HIER_LEAD&quot;,&quot;HIER_PARENT&quot;,&quot;IF&quot;,&quot;IGNORE&quot;,&quot;IMMUTABLE&quot;,&quot;IN&quot;,&quot;INCREMENT&quot;,&quot;INDEX&quot;,&quot;INDICATOR&quot;,
                      &quot;INDICES&quot;,&quot;INITIALLY&quot;,&quot;INLINE&quot;,&quot;INSERT&quot;,&quot;INSTEAD&quot;,&quot;INTERSECT&quot;,&quot;INTO&quot;,&quot;INVISIBLE&quot;,&quot;IS&quot;,&quot;ISOLATION&quot;,
                      &quot;JAVA&quot;,&quot;JSON_EXISTS&quot;,&quot;JSON_TABLE&quot;,&quot;LATERAL&quot;,&quot;LIBRARY&quot;,&quot;LIKE&quot;,&quot;LIKE2&quot;,&quot;LIKE4&quot;,&quot;LIKEC&quot;,&quot;LOCK&quot;,&quot;LOGON&quot;,
                      &quot;MAXVALUE&quot;,&quot;MEASURES&quot;,&quot;MERGE&quot;,&quot;MINUS&quot;,&quot;MINVALUE&quot;,&quot;MULTISET&quot;,&quot;MUTABLE&quot;,&quot;NAN&quot;,&quot;NAV&quot;,&quot;NCHAR_CS&quot;,&quot;NOCOPY&quot;,
                      &quot;NOCYCLE&quot;,&quot;NONSCHEMA&quot;,&quot;NORELY&quot;,&quot;NOT&quot;,&quot;NOVALIDATE&quot;,&quot;NOWAIT&quot;,&quot;OF&quot;,&quot;ON&quot;,&quot;ONLY&quot;,&quot;OPTION&quot;,&quot;OR&quot;,&quot;ORADATA&quot;,
                      &quot;ORDER&quot;,&quot;ORDINALITY&quot;,&quot;OVER&quot;,&quot;OVERRIDING&quot;,&quot;PARALLEL_ENABLE&quot;,&quot;PARTITION&quot;,&quot;PASSING&quot;,&quot;PAST&quot;,&quot;PIPELINED&quot;,
                      &quot;PIVOT&quot;,&quot;PRAGMA&quot;,&quot;PRECEDES&quot;,&quot;PRECEDING&quot;,&quot;PRESENT&quot;,&quot;PRIOR&quot;,&quot;PROCEDURE&quot;,&quot;REFERENCES&quot;,&quot;REFERENCING&quot;,
                      &quot;REJECT&quot;,&quot;RELY&quot;,&quot;REPEAT&quot;,&quot;RESPECT&quot;,&quot;RESTRICT_REFERENCES&quot;,&quot;RESULT_CACHE&quot;,&quot;RETURNING&quot;,&quot;REVOKE&quot;,
                      &quot;SELECT&quot;,&quot;SEQUENTIAL&quot;,&quot;SERIALIZABLE&quot;,&quot;SERIALLY_REUSABLE&quot;,&quot;SERVERERROR&quot;,&quot;SETS&quot;,&quot;SHARE&quot;,&quot;SIBLINGS&quot;,
                      &quot;SINGLE&quot;,&quot;SOME&quot;,&quot;SQL_MACRO&quot;,&quot;SQLDATA&quot;,&quot;STANDALONE&quot;,&quot;START&quot;,&quot;SUBMULTISET&quot;,&quot;SUBPARTITION&quot;,
                      &quot;SUPPRESSES_WARNING_6009&quot;,&quot;THE&quot;,&quot;THEN&quot;,&quot;TO&quot;,&quot;TRIGGER&quot;,&quot;UDF&quot;,&quot;UNBOUNDED&quot;,&quot;UNDER&quot;,&quot;UNION&quot;,
                      &quot;UNIQUE&quot;,&quot;UNLIMITED&quot;,&quot;UNPIVOT&quot;,&quot;UNTIL&quot;,&quot;UPDATE&quot;,&quot;UPSERT&quot;,&quot;USING&quot;,&quot;VALUES&quot;,&quot;VARRAY&quot;,&quot;VARYING&quot;,
                      &quot;VIEW&quot;,&quot;WHEN&quot;,&quot;WHERE&quot;,&quot;WHILE&quot;,&quot;WINDOW&quot;,&quot;WITH&quot;,&quot;XMLATTRIBUTES&quot;,&quot;XMLEXISTS&quot;,&quot;XMLFOREST&quot;,
                      &quot;XMLNAMESPACES&quot;,&quot;XMLQUERY&quot;,&quot;XMLROOT&quot;,&quot;XMLSCHEMA&quot;,&quot;XMLSERIALIZE&quot;,&quot;XMLTABLE&quot;]',
                    '$[*]' columns (keyword path '$')
                 )
       );" 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">select</span><span style="color: #D4D4D4"> json_arrayagg(keyword </span><span style="color: #569CD6">order by</span><span style="color: #D4D4D4"> keyword) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> keywords</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #6A9955">-- reserved keywords in Oracle database 21.3.0.0.0 (ATP)</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> keyword</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> v$reserved_words</span></span>
<span class="line"><span style="color: #D4D4D4">           </span><span style="color: #569CD6">where</span><span style="color: #D4D4D4"> (reserved = </span><span style="color: #CE9178">&#39;Y&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">or</span><span style="color: #D4D4D4"> res_type = </span><span style="color: #CE9178">&#39;Y&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">or</span><span style="color: #D4D4D4"> res_attr = </span><span style="color: #CE9178">&#39;Y&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">or</span><span style="color: #D4D4D4"> res_semi = </span><span style="color: #CE9178">&#39;Y&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> keyword </span><span style="color: #569CD6">is not null</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> regexp_like(keyword, </span><span style="color: #CE9178">&#39;^[A-Z][A-Z0-9_$#]*$&#39;</span><span style="color: #D4D4D4">) </span><span style="color: #6A9955">-- valid nonquoted identifier</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #569CD6">union</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #6A9955">-- reserved keywords in db* CODECOP&#39;s PL/SQL parser 4.2.0</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> keyword</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> json_table(</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #CE9178">&#39;[&quot;AFTER&quot;,&quot;ALL&quot;,&quot;ALLOW&quot;,&quot;ALTER&quot;,&quot;ANALYTIC&quot;,&quot;AND&quot;,&quot;ANYSCHEMA&quot;,&quot;AS&quot;,&quot;ASC&quot;,&quot;ASSOCIATE&quot;,&quot;AUTHID&quot;,&quot;AUTOMATIC&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;AUTONOMOUS_TRANSACTION&quot;,&quot;BEFORE&quot;,&quot;BEGIN&quot;,&quot;BETWEEN&quot;,&quot;BULK&quot;,&quot;BY&quot;,&quot;BYTE&quot;,&quot;CANONICAL&quot;,&quot;CASE&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;CASE-SENSITIVE&quot;,&quot;CHECK&quot;,&quot;CLUSTER&quot;,&quot;COMPOUND&quot;,&quot;CONNECT&quot;,&quot;CONNECT_BY_ROOT&quot;,&quot;CONSTANT&quot;,&quot;CONSTRAINT&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;CONSTRUCTOR&quot;,&quot;CORRUPT_XID&quot;,&quot;CORRUPT_XID_ALL&quot;,&quot;CREATE&quot;,&quot;CROSSEDITION&quot;,&quot;CURRENT&quot;,&quot;CUSTOMDATUM&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;CYCLE&quot;,&quot;DB_ROLE_CHANGE&quot;,&quot;DECLARE&quot;,&quot;DECREMENT&quot;,&quot;DEFAULTS&quot;,&quot;DEFINE&quot;,&quot;DEFINER&quot;,&quot;DETERMINISTIC&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;DIMENSION&quot;,&quot;DISALLOW&quot;,&quot;DISASSOCIATE&quot;,&quot;DISTINCT&quot;,&quot;DROP&quot;,&quot;EACH&quot;,&quot;EDITIONING&quot;,&quot;ELSE&quot;,&quot;ELSIF&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;END&quot;,&quot;EVALNAME&quot;,&quot;EXCEPTION&quot;,&quot;EXCEPTION_INIT&quot;,&quot;EXCEPTIONS&quot;,&quot;EXCLUSIVE&quot;,&quot;EXTERNAL&quot;,&quot;FETCH&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;FOLLOWING&quot;,&quot;FOLLOWS&quot;,&quot;FOR&quot;,&quot;FORALL&quot;,&quot;FROM&quot;,&quot;GOTO&quot;,&quot;GRANT&quot;,&quot;GROUP&quot;,&quot;HAVING&quot;,&quot;HIDE&quot;,&quot;HIER_ANCESTOR&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;HIER_LAG&quot;,&quot;HIER_LEAD&quot;,&quot;HIER_PARENT&quot;,&quot;IF&quot;,&quot;IGNORE&quot;,&quot;IMMUTABLE&quot;,&quot;IN&quot;,&quot;INCREMENT&quot;,&quot;INDEX&quot;,&quot;INDICATOR&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;INDICES&quot;,&quot;INITIALLY&quot;,&quot;INLINE&quot;,&quot;INSERT&quot;,&quot;INSTEAD&quot;,&quot;INTERSECT&quot;,&quot;INTO&quot;,&quot;INVISIBLE&quot;,&quot;IS&quot;,&quot;ISOLATION&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;JAVA&quot;,&quot;JSON_EXISTS&quot;,&quot;JSON_TABLE&quot;,&quot;LATERAL&quot;,&quot;LIBRARY&quot;,&quot;LIKE&quot;,&quot;LIKE2&quot;,&quot;LIKE4&quot;,&quot;LIKEC&quot;,&quot;LOCK&quot;,&quot;LOGON&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;MAXVALUE&quot;,&quot;MEASURES&quot;,&quot;MERGE&quot;,&quot;MINUS&quot;,&quot;MINVALUE&quot;,&quot;MULTISET&quot;,&quot;MUTABLE&quot;,&quot;NAN&quot;,&quot;NAV&quot;,&quot;NCHAR_CS&quot;,&quot;NOCOPY&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;NOCYCLE&quot;,&quot;NONSCHEMA&quot;,&quot;NORELY&quot;,&quot;NOT&quot;,&quot;NOVALIDATE&quot;,&quot;NOWAIT&quot;,&quot;OF&quot;,&quot;ON&quot;,&quot;ONLY&quot;,&quot;OPTION&quot;,&quot;OR&quot;,&quot;ORADATA&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;ORDER&quot;,&quot;ORDINALITY&quot;,&quot;OVER&quot;,&quot;OVERRIDING&quot;,&quot;PARALLEL_ENABLE&quot;,&quot;PARTITION&quot;,&quot;PASSING&quot;,&quot;PAST&quot;,&quot;PIPELINED&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;PIVOT&quot;,&quot;PRAGMA&quot;,&quot;PRECEDES&quot;,&quot;PRECEDING&quot;,&quot;PRESENT&quot;,&quot;PRIOR&quot;,&quot;PROCEDURE&quot;,&quot;REFERENCES&quot;,&quot;REFERENCING&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;REJECT&quot;,&quot;RELY&quot;,&quot;REPEAT&quot;,&quot;RESPECT&quot;,&quot;RESTRICT_REFERENCES&quot;,&quot;RESULT_CACHE&quot;,&quot;RETURNING&quot;,&quot;REVOKE&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;SELECT&quot;,&quot;SEQUENTIAL&quot;,&quot;SERIALIZABLE&quot;,&quot;SERIALLY_REUSABLE&quot;,&quot;SERVERERROR&quot;,&quot;SETS&quot;,&quot;SHARE&quot;,&quot;SIBLINGS&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;SINGLE&quot;,&quot;SOME&quot;,&quot;SQL_MACRO&quot;,&quot;SQLDATA&quot;,&quot;STANDALONE&quot;,&quot;START&quot;,&quot;SUBMULTISET&quot;,&quot;SUBPARTITION&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;SUPPRESSES_WARNING_6009&quot;,&quot;THE&quot;,&quot;THEN&quot;,&quot;TO&quot;,&quot;TRIGGER&quot;,&quot;UDF&quot;,&quot;UNBOUNDED&quot;,&quot;UNDER&quot;,&quot;UNION&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;UNIQUE&quot;,&quot;UNLIMITED&quot;,&quot;UNPIVOT&quot;,&quot;UNTIL&quot;,&quot;UPDATE&quot;,&quot;UPSERT&quot;,&quot;USING&quot;,&quot;VALUES&quot;,&quot;VARRAY&quot;,&quot;VARYING&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;VIEW&quot;,&quot;WHEN&quot;,&quot;WHERE&quot;,&quot;WHILE&quot;,&quot;WINDOW&quot;,&quot;WITH&quot;,&quot;XMLATTRIBUTES&quot;,&quot;XMLEXISTS&quot;,&quot;XMLFOREST&quot;,</span></span>
<span class="line"><span style="color: #CE9178">                      &quot;XMLNAMESPACES&quot;,&quot;XMLQUERY&quot;,&quot;XMLROOT&quot;,&quot;XMLSCHEMA&quot;,&quot;XMLSERIALIZE&quot;,&quot;XMLTABLE&quot;]&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #CE9178">&#39;$[*]&#39;</span><span style="color: #D4D4D4"> columns (keyword </span><span style="color: #569CD6">path</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;$&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                 )</span></span>
<span class="line"><span style="color: #D4D4D4">       );</span></span></code></pre></div>



<p class="wp-block-paragraph">The result can be used to populate a&nbsp;<code>HashSet</code>. This allows you to check very efficiently whether an identifier is a keyword.</p>



<p class="wp-block-paragraph">Of course, such a global list of keywords is a simplification. In reality, the restrictions are context-specific. However, I consider the use of keywords for identifiers in any context a bad practice. Therefore, I can live with some unnecessarily quoted identifiers.</p>



<h3 class="wp-block-heading">4. Is in Upper Case</h3>



<p class="wp-block-paragraph">This means that the following condition must be true: <code>quoted_identifier = upper(quoted_identifier)</code>.</p>



<p class="wp-block-paragraph">This does not necessarily mean that the identifier is case-insensitive as the following examples show:</p>



<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(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">18) JSON dot notation is case-sensitive</span><span role="button" tabindex="0" data-code="set pagesize 100
column key format A3
column value format A5
set null &quot;(-)&quot;
 
-- OK, KEY/VALUE are clearly case-sensitive
select j.pair.&quot;KEY&quot;, j.pair.&quot;VALUE&quot;
  from json_table('[{KEY:1, VALUE:&quot;One&quot;},{KEY:2, VALUE:&quot;Two&quot;}]',
          '$[*]' columns (pair varchar2(100) format json path '$')) j;
 
KEY VALUE
--- -----
1   One  
2   Two  
 
-- OK, KEY/VALUE are case-sensitive, but you have to &quot;know&quot; that
select j.pair.KEY, j.pair.VALUE
  from json_table('[{KEY:1, VALUE:&quot;One&quot;},{KEY:2, VALUE:&quot;Two&quot;}]',
          '$[*]' columns (pair varchar2(100) format json path '$')) j;
 
KEY VALUE
--- -----
1   One  
2   Two  
          
-- Oups, no error, but the result is wrong (all NULLs)
-- This is why you should not let the formatter change the case of your identifiers!
select j.pair.key, j.pair.value
  from json_table('[{KEY:1, VALUE:&quot;One&quot;},{KEY:2, VALUE:&quot;Two&quot;}]',
          '$[*]' columns (pair varchar2(100) format json path '$')) j;
 
KEY VALUE
--- -----
(-) (-)  
(-) (-)" 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"> pagesize </span><span style="color: #B5CEA8">100</span></span>
<span class="line"><span style="color: #D4D4D4">column </span><span style="color: #569CD6">key</span><span style="color: #D4D4D4"> format A3</span></span>
<span class="line"><span style="color: #D4D4D4">column </span><span style="color: #569CD6">value</span><span style="color: #D4D4D4"> format A5</span></span>
<span class="line"><span style="color: #569CD6">set</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;(-)&quot;</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #6A9955">-- OK, KEY/VALUE are clearly case-sensitive</span></span>
<span class="line cbp-line-highlight"><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> j.pair.</span><span style="color: #CE9178">&quot;KEY&quot;</span><span style="color: #D4D4D4">, j.pair.</span><span style="color: #CE9178">&quot;VALUE&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> json_table(</span><span style="color: #CE9178">&#39;[{KEY:1, VALUE:&quot;One&quot;},{KEY:2, VALUE:&quot;Two&quot;}]&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #CE9178">&#39;$[*]&#39;</span><span style="color: #D4D4D4"> columns (pair </span><span style="color: #569CD6">varchar2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">) format </span><span style="color: #569CD6">json</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">path</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;$&#39;</span><span style="color: #D4D4D4">)) j;</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #569CD6">KEY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VALUE</span></span>
<span class="line"><span style="color: #6A9955">--- -----</span></span>
<span class="line"><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">   One  </span></span>
<span class="line"><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">   Two  </span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #6A9955">-- OK, KEY/VALUE are case-sensitive, but you have to &quot;know&quot; that</span></span>
<span class="line cbp-line-highlight"><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> j.pair.</span><span style="color: #569CD6">KEY</span><span style="color: #D4D4D4">, j.pair.</span><span style="color: #569CD6">VALUE</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> json_table(</span><span style="color: #CE9178">&#39;[{KEY:1, VALUE:&quot;One&quot;},{KEY:2, VALUE:&quot;Two&quot;}]&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #CE9178">&#39;$[*]&#39;</span><span style="color: #D4D4D4"> columns (pair </span><span style="color: #569CD6">varchar2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">) format </span><span style="color: #569CD6">json</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">path</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;$&#39;</span><span style="color: #D4D4D4">)) j;</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #569CD6">KEY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VALUE</span></span>
<span class="line"><span style="color: #6A9955">--- -----</span></span>
<span class="line"><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">   One  </span></span>
<span class="line"><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">   Two  </span></span>
<span class="line"><span style="color: #D4D4D4">          </span></span>
<span class="line"><span style="color: #6A9955">-- Oups, no error, but the result is wrong (all NULLs)</span></span>
<span class="line"><span style="color: #6A9955">-- This is why you should not let the formatter change the case of your identifiers!</span></span>
<span class="line cbp-line-highlight"><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> j.pair.</span><span style="color: #569CD6">key</span><span style="color: #D4D4D4">, j.pair.</span><span style="color: #569CD6">value</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> json_table(</span><span style="color: #CE9178">&#39;[{KEY:1, VALUE:&quot;One&quot;},{KEY:2, VALUE:&quot;Two&quot;}]&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #CE9178">&#39;$[*]&#39;</span><span style="color: #D4D4D4"> columns (pair </span><span style="color: #569CD6">varchar2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">) format </span><span style="color: #569CD6">json</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">path</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;$&#39;</span><span style="color: #D4D4D4">)) j;</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #569CD6">KEY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VALUE</span></span>
<span class="line"><span style="color: #6A9955">--- -----</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">(-) (-)  </span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">(-) (-)</span></span></code></pre></div>



<p class="wp-block-paragraph">You can check this rule in combination with the previous rule by using a case-insensitive regular expression, which is the default.</p>



<h3 class="wp-block-heading">5. Is Not Part of a Code Section for Which the Formatter Is Disabled</h3>



<p class="wp-block-paragraph">When you use a formatter there are some code sections where you do not want the formatter to change it. Therefore we want to honor the marker comments that disable and enable the formatter.</p>



<p class="wp-block-paragraph">Here is an example:</p>



<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(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">19) Disable formatter &#8211; input</span><span role="button" tabindex="0" data-code="create or replace procedure disable_enable_formatter is
   l_dummy sys.dual.dummy%type;
begin
   -- @formatter:off
   select decode(dummy, 'X', 1 
                      , 'Y', 2
                      , 'Z', 3
                           , 0) &quot;DECODE_RESULT&quot; /* @formatter:on */
     into &quot;L_DUMMY&quot;
     from &quot;SYS&quot;.&quot;DUAL&quot;;
 
   select &quot;DUMMY&quot; -- noformat start
     into &quot;L_DUMMY&quot;
     from &quot;SYS&quot;.&quot;DUAL&quot; -- noformat end
    where &quot;DUMMY&quot; is not null;
end;
/" 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">create or replace</span><span style="color: #D4D4D4"> procedure disable_enable_formatter </span><span style="color: #569CD6">is</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #9CDCFE">l_dummy</span><span style="color: #D4D4D4"> sys.dual.dummy%</span><span style="color: #569CD6">type</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">begin</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- @formatter:off</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">decode</span><span style="color: #D4D4D4">(dummy, </span><span style="color: #CE9178">&#39;X&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">                      , </span><span style="color: #CE9178">&#39;Y&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span></span>
<span class="line"><span style="color: #D4D4D4">                      , </span><span style="color: #CE9178">&#39;Z&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">3</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                           , </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #CE9178">&quot;DECODE_RESULT&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955">/* @formatter:on */</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">into</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;L_DUMMY&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;SYS&quot;</span><span style="color: #D4D4D4">.</span><span style="color: #CE9178">&quot;DUAL&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;DUMMY&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955">-- noformat start</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">into</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;L_DUMMY&quot;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;SYS&quot;</span><span style="color: #D4D4D4">.</span><span style="color: #CE9178">&quot;DUAL&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955">-- noformat end</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">where</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;DUMMY&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">is not null</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">end</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p class="wp-block-paragraph">After calling the formatter we expect the following output (when changing the identifier case to lower is enabled):</p>



<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(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">20) Disable formatter &#8211; result</span><span role="button" tabindex="0" data-code="create or replace procedure disable_enable_formatter is
   l_dummy sys.dual.dummy%type;
begin
   -- @formatter:off
   select decode(dummy, 'X', 1 
                      , 'Y', 2
                      , 'Z', 3
                           , 0) &quot;DECODE_RESULT&quot; /* @formatter:on */
     into l_dummy
     from sys.dual;
 
   select dummy -- noformat start
     into &quot;L_DUMMY&quot;
     from &quot;SYS&quot;.&quot;DUAL&quot; -- noformat end
    where dummy is not null;
end;
/" 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">create or replace</span><span style="color: #D4D4D4"> procedure disable_enable_formatter </span><span style="color: #569CD6">is</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #9CDCFE">l_dummy</span><span style="color: #D4D4D4"> sys.dual.dummy%</span><span style="color: #569CD6">type</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">begin</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- @formatter:off</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">decode</span><span style="color: #D4D4D4">(dummy, </span><span style="color: #CE9178">&#39;X&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">                      , </span><span style="color: #CE9178">&#39;Y&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span></span>
<span class="line"><span style="color: #D4D4D4">                      , </span><span style="color: #CE9178">&#39;Z&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">3</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                           , </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #CE9178">&quot;DECODE_RESULT&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955">/* @formatter:on */</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">into</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">l_dummy</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> sys.dual;</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> dummy </span><span style="color: #6A9955">-- noformat start</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">into</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;L_DUMMY&quot;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;SYS&quot;</span><span style="color: #D4D4D4">.</span><span style="color: #CE9178">&quot;DUAL&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955">-- noformat end</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">where</span><span style="color: #D4D4D4"> dummy </span><span style="color: #569CD6">is not null</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">end</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p class="wp-block-paragraph">To check this we can reuse the approach for quoted identifiers in conditional compilation text.</p>



<h2 class="wp-block-heading">Removing Double Quotes from Quoted Identifiers with Arbori</h2>



<p class="wp-block-paragraph">As mentioned at the beginning of the post, the current version of the <a href="https://github.com/Trivadis/plsql-formatter-settings">PL/SQL &amp; SQL Formatter Settings</a> can safely remove double quotes from PL/SQL and SQL code.</p>



<p class="wp-block-paragraph">Here are simplified formatter settings which can be imported into SQL Developer 22.2.1. The formatter with these settings only removes the double quotes from identifiers in a safe way and leaves your code &#8220;as is&#8221;. You can download these settings from <a href="https://gist.github.com/PhilippSalvisberg/ce8d07c984daf32552e217c24a13c1c6">this Gist</a>.</p>



<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">21) Advanced Settings</span><span role="button" tabindex="0" data-code="&lt;options&gt;
    &lt;adjustCaseOnly&gt;false&lt;/adjustCaseOnly&gt;
    &lt;singleLineComments&gt;oracle.dbtools.app.Format.InlineComments.CommentsUnchanged&lt;/singleLineComments&gt;
    &lt;maxCharLineSize&gt;120000&lt;/maxCharLineSize&gt;
    &lt;idCase&gt;oracle.dbtools.app.Format.Case.NoCaseChange&lt;/idCase&gt;
    &lt;kwCase&gt;oracle.dbtools.app.Format.Case.lower&lt;/kwCase&gt;
    &lt;formatWhenSyntaxError&gt;false&lt;/formatWhenSyntaxError&gt;
&lt;/options&gt;" 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: #808080">&lt;</span><span style="color: #569CD6">options</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">adjustCaseOnly</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">false</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">adjustCaseOnly</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">singleLineComments</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">oracle.dbtools.app.Format.InlineComments.CommentsUnchanged</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">singleLineComments</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">maxCharLineSize</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">120000</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">maxCharLineSize</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">idCase</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">oracle.dbtools.app.Format.Case.NoCaseChange</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">idCase</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">kwCase</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">oracle.dbtools.app.Format.Case.lower</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">kwCase</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">formatWhenSyntaxError</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">false</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">formatWhenSyntaxError</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">options</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">Firstly, the option <code>adjustCaseOnly</code> ensures that the Arbori program is fully applied.</p>



<p class="wp-block-paragraph">Secondly, the option <code>singleLineComments</code> ensures that the whitespace before single-line comments are kept &#8220;as is&#8221;.</p>



<p class="wp-block-paragraph">Thirdly, the <code>maxCharLineSize</code> ensures that no line breaks are added. The value of <code>120000</code> seems to be ridiculously high. However, I&#8217;ve seen single lines of around a hundred thousand characters in the wild.</p>



<p class="wp-block-paragraph">Fourthly, the option <code>idCase</code> ensures that the case of nonquoted identifiers is not changed. This is important for JSON dot notation.</p>



<p class="wp-block-paragraph">Fifthly, the option <code>kwCase</code> ensures that the case of keywords is also kept &#8220;as is&#8221;.</p>



<p class="wp-block-paragraph">And Finally, the option <code>formatWhenSyntaxError</code> ensures that the formatter does not change code that the formatter does not understand. This is important to keep Java strings intact.</p>



<p class="wp-block-paragraph">The value of all other options is irrelevant for this Arbori program.</p>



<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(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);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">22) Custom Format</span><span role="button" tabindex="0" data-code="-- --------------------------------------------------------------------------------------------------------------------
-- Minimal Arbori program (expected by the formatter, also expected: &quot;order_by_clause___0&quot;).
-- --------------------------------------------------------------------------------------------------------------------
include &quot;std.arbori&quot;
dummy: :indentConditions &amp; [node) identifier;
skipWhiteSpaceBeforeNode: runOnce -&gt; { var doNotCallCallbackFunction;}
dontFormatNode: [node) numeric_literal | [node) path -&gt;;
 
-- --------------------------------------------------------------------------------------------------------------------
-- Keep existing whitespace.
-- --------------------------------------------------------------------------------------------------------------------
 
keep_significant_whitespace:
    runOnce
-&gt; {
    var LexerToken = Java.type('oracle.dbtools.parser.LexerToken');
    var tokens = LexerToken.parse(target.input, true);  // include hidden tokens
    var hiddenTokenCount = 0;
    var wsBefore = &quot;&quot;;
    var Token = Java.type('oracle.dbtools.parser.Token');
    for (var i in tokens) {
        var type = tokens[i].type;
        if (type == Token.LINE_COMMENT || type == Token.COMMENT || type == Token.WS ||
            type == Token.MACRO_SKIP || type == Token.SQLPLUSLINECONTINUE_SKIP)
        {
            hiddenTokenCount++;
            if (type == Token.WS) {
                wsBefore += tokens[i].content;
            } else {
                wsBefore = &quot;&quot;;
            }
        } else {
            if (i-hiddenTokenCount == 0 &amp;&amp; hiddenTokenCount == wsBefore.length) {
                struct.putNewline(0, &quot;&quot;);
            } else if (wsBefore != &quot; &quot;) {
                struct.putNewline(i-hiddenTokenCount, wsBefore);
            }
            wsBefore = &quot;&quot;;
        }
    }
}
 
-- --------------------------------------------------------------------------------------------------------------------
-- Enforce nonquoted identifiers.
-- --------------------------------------------------------------------------------------------------------------------
 
enforce_nonquoted_identifiers:
    runOnce
-&gt; {
    var offOnRanges = [];
 
    var populateOffOnRanges = function(tokens) {
        var off = -1;
        for (var i in tokens) {
            var type = tokens[i].type;
            if (type == Token.LINE_COMMENT || type == Token.COMMENT) {
                if (tokens[i].content.toLowerCase().indexOf(&quot;@formatter:off&quot;) != -1 
                    || tokens[i].content.toLowerCase().indexOf(&quot;noformat start&quot;) != -1)
                {
                    off = tokens[i].begin;
                }
                if (off != -1) {
                    if (tokens[i].content.toLowerCase().indexOf(&quot;@formatter:on&quot;) != -1
                        || tokens[i].content.toLowerCase().indexOf(&quot;noformat end&quot;) != -1)
                    {
                        offOnRanges.push([off, tokens[i].end]);
                        off = -1;
                    }
                }
            }
        }
    }
 
    var inOffOnRange = function(pos) {
        for (var x in offOnRanges) {
            if (pos &gt;= offOnRanges[x][0] &amp;&amp; pos &lt; offOnRanges[x][1]) {
                return true;
            }
        }
        return false;
    }
 
    var HashSet = Java.type('java.util.HashSet');
    var Arrays = Java.type('java.util.Arrays');
    var reservedKeywords = new HashSet(Arrays.asList(&quot;ACCESS&quot;,&quot;ADD&quot;,&quot;AFTER&quot;,&quot;ALL&quot;,&quot;ALLOW&quot;,&quot;ALTER&quot;,&quot;ANALYTIC&quot;,&quot;AND&quot;,
        &quot;ANY&quot;,&quot;ANYSCHEMA&quot;,&quot;AS&quot;,&quot;ASC&quot;,&quot;ASSOCIATE&quot;,&quot;AUDIT&quot;,&quot;AUTHID&quot;,&quot;AUTOMATIC&quot;,&quot;AUTONOMOUS_TRANSACTION&quot;,&quot;BEFORE&quot;,
        &quot;BEGIN&quot;,&quot;BETWEEN&quot;,&quot;BULK&quot;,&quot;BY&quot;,&quot;BYTE&quot;,&quot;CANONICAL&quot;,&quot;CASE&quot;,&quot;CASE-SENSITIVE&quot;,&quot;CHAR&quot;,&quot;CHECK&quot;,&quot;CLUSTER&quot;,&quot;COLUMN&quot;,
        &quot;COLUMN_VALUE&quot;,&quot;COMMENT&quot;,&quot;COMPOUND&quot;,&quot;COMPRESS&quot;,&quot;CONNECT&quot;,&quot;CONNECT_BY_ROOT&quot;,&quot;CONSTANT&quot;,&quot;CONSTRAINT&quot;,
        &quot;CONSTRUCTOR&quot;,&quot;CORRUPT_XID&quot;,&quot;CORRUPT_XID_ALL&quot;,&quot;CREATE&quot;,&quot;CROSSEDITION&quot;,&quot;CURRENT&quot;,&quot;CUSTOMDATUM&quot;,&quot;CYCLE&quot;,
        &quot;DATE&quot;,&quot;DB_ROLE_CHANGE&quot;,&quot;DECIMAL&quot;,&quot;DECLARE&quot;,&quot;DECREMENT&quot;,&quot;DEFAULT&quot;,&quot;DEFAULTS&quot;,&quot;DEFINE&quot;,&quot;DEFINER&quot;,&quot;DELETE&quot;,
        &quot;DESC&quot;,&quot;DETERMINISTIC&quot;,&quot;DIMENSION&quot;,&quot;DISALLOW&quot;,&quot;DISASSOCIATE&quot;,&quot;DISTINCT&quot;,&quot;DROP&quot;,&quot;EACH&quot;,&quot;EDITIONING&quot;,&quot;ELSE&quot;,
        &quot;ELSIF&quot;,&quot;END&quot;,&quot;EVALNAME&quot;,&quot;EXCEPT&quot;,&quot;EXCEPTION&quot;,&quot;EXCEPTIONS&quot;,&quot;EXCEPTION_INIT&quot;,&quot;EXCLUSIVE&quot;,&quot;EXISTS&quot;,&quot;EXTERNAL&quot;,
        &quot;FETCH&quot;,&quot;FILE&quot;,&quot;FLOAT&quot;,&quot;FOLLOWING&quot;,&quot;FOLLOWS&quot;,&quot;FOR&quot;,&quot;FORALL&quot;,&quot;FROM&quot;,&quot;GOTO&quot;,&quot;GRANT&quot;,&quot;GROUP&quot;,&quot;HAVING&quot;,&quot;HIDE&quot;,
        &quot;HIER_ANCESTOR&quot;,&quot;HIER_LAG&quot;,&quot;HIER_LEAD&quot;,&quot;HIER_PARENT&quot;,&quot;IDENTIFIED&quot;,&quot;IF&quot;,&quot;IGNORE&quot;,&quot;IMMEDIATE&quot;,&quot;IMMUTABLE&quot;,
        &quot;IN&quot;,&quot;INCREMENT&quot;,&quot;INDEX&quot;,&quot;INDICATOR&quot;,&quot;INDICES&quot;,&quot;INITIAL&quot;,&quot;INITIALLY&quot;,&quot;INLINE&quot;,&quot;INSERT&quot;,&quot;INSTEAD&quot;,&quot;INTEGER&quot;,
        &quot;INTERSECT&quot;,&quot;INTO&quot;,&quot;INVISIBLE&quot;,&quot;IS&quot;,&quot;ISOLATION&quot;,&quot;JAVA&quot;,&quot;JSON_EXISTS&quot;,&quot;JSON_TABLE&quot;,&quot;LATERAL&quot;,&quot;LEVEL&quot;,&quot;LIBRARY&quot;,
        &quot;LIKE&quot;,&quot;LIKE2&quot;,&quot;LIKE4&quot;,&quot;LIKEC&quot;,&quot;LOCK&quot;,&quot;LOGON&quot;,&quot;LONG&quot;,&quot;MAXEXTENTS&quot;,&quot;MAXVALUE&quot;,&quot;MEASURES&quot;,&quot;MERGE&quot;,&quot;MINUS&quot;,
        &quot;MINVALUE&quot;,&quot;MLSLABEL&quot;,&quot;MODE&quot;,&quot;MODIFY&quot;,&quot;MULTISET&quot;,&quot;MUTABLE&quot;,&quot;NAN&quot;,&quot;NAV&quot;,&quot;NCHAR_CS&quot;,&quot;NESTED_TABLE_ID&quot;,&quot;NOAUDIT&quot;,
        &quot;NOCOMPRESS&quot;,&quot;NOCOPY&quot;,&quot;NOCYCLE&quot;,&quot;NONSCHEMA&quot;,&quot;NORELY&quot;,&quot;NOT&quot;,&quot;NOVALIDATE&quot;,&quot;NOWAIT&quot;,&quot;NULL&quot;,&quot;NUMBER&quot;,&quot;OF&quot;,
        &quot;OFFLINE&quot;,&quot;ON&quot;,&quot;ONLINE&quot;,&quot;ONLY&quot;,&quot;OPTION&quot;,&quot;OR&quot;,&quot;ORADATA&quot;,&quot;ORDER&quot;,&quot;ORDINALITY&quot;,&quot;OVER&quot;,&quot;OVERRIDING&quot;,
        &quot;PARALLEL_ENABLE&quot;,&quot;PARTITION&quot;,&quot;PASSING&quot;,&quot;PAST&quot;,&quot;PCTFREE&quot;,&quot;PIPELINED&quot;,&quot;PIVOT&quot;,&quot;PRAGMA&quot;,&quot;PRECEDES&quot;,
        &quot;PRECEDING&quot;,&quot;PRESENT&quot;,&quot;PRIOR&quot;,&quot;PROCEDURE&quot;,&quot;PUBLIC&quot;,&quot;RAW&quot;,&quot;REFERENCES&quot;,&quot;REFERENCING&quot;,&quot;REJECT&quot;,&quot;RELY&quot;,
        &quot;RENAME&quot;,&quot;REPEAT&quot;,&quot;RESOURCE&quot;,&quot;RESPECT&quot;,&quot;RESTRICT_REFERENCES&quot;,&quot;RESULT_CACHE&quot;,&quot;RETURNING&quot;,&quot;REVOKE&quot;,&quot;ROW&quot;,
        &quot;ROWID&quot;,&quot;ROWNUM&quot;,&quot;ROWS&quot;,&quot;SELECT&quot;,&quot;SEQUENTIAL&quot;,&quot;SERIALIZABLE&quot;,&quot;SERIALLY_REUSABLE&quot;,&quot;SERVERERROR&quot;,&quot;SESSION&quot;,
        &quot;SET&quot;,&quot;SETS&quot;,&quot;SHARE&quot;,&quot;SIBLINGS&quot;,&quot;SINGLE&quot;,&quot;SIZE&quot;,&quot;SMALLINT&quot;,&quot;SOME&quot;,&quot;SQLDATA&quot;,&quot;SQL_MACRO&quot;,&quot;STANDALONE&quot;,
        &quot;START&quot;,&quot;SUBMULTISET&quot;,&quot;SUBPARTITION&quot;,&quot;SUCCESSFUL&quot;,&quot;SUPPRESSES_WARNING_6009&quot;,&quot;SYNONYM&quot;,&quot;SYSDATE&quot;,&quot;TABLE&quot;,
        &quot;THE&quot;,&quot;THEN&quot;,&quot;TO&quot;,&quot;TRIGGER&quot;,&quot;UDF&quot;,&quot;UID&quot;,&quot;UNBOUNDED&quot;,&quot;UNDER&quot;,&quot;UNION&quot;,&quot;UNIQUE&quot;,&quot;UNLIMITED&quot;,&quot;UNPIVOT&quot;,&quot;UNTIL&quot;,
        &quot;UPDATE&quot;,&quot;UPSERT&quot;,&quot;USER&quot;,&quot;USING&quot;,&quot;VALIDATE&quot;,&quot;VALUES&quot;,&quot;VARCHAR&quot;,&quot;VARCHAR2&quot;,&quot;VARRAY&quot;,&quot;VARYING&quot;,&quot;VIEW&quot;,
        &quot;WHEN&quot;,&quot;WHENEVER&quot;,&quot;WHERE&quot;,&quot;WHILE&quot;,&quot;WINDOW&quot;,&quot;WITH&quot;,&quot;XMLATTRIBUTES&quot;,&quot;XMLEXISTS&quot;,&quot;XMLFOREST&quot;,&quot;XMLNAMESPACES&quot;,
        &quot;XMLQUERY&quot;,&quot;XMLROOT&quot;,&quot;XMLSCHEMA&quot;,&quot;XMLSERIALIZE&quot;,&quot;XMLTABLE&quot;));
 
    var isKeyword = function(token) {
        return reservedKeywords.contains(token.content.replace('&quot;', &quot;&quot;));
    }
 
    var isUnquotingAllowed = function(token) {
        var Pattern = Java.type(&quot;java.util.regex.Pattern&quot;);
        if (!Pattern.matches('^&quot;[A-Z][A-Z0-9_$#]*&quot;$', token.content)) {
            return false;
        }
        if (isKeyword(token)) {
            return false;
        }
        return true;
    }
 
    var findAndConvertQuotedIdentifiers = function() {
        var tokens = LexerToken.parse(target.input,true);  // include hidden tokens
        populateOffOnRanges(tokens);
        var StringBuilder = Java.type('java.lang.StringBuilder');
        var newInput = new StringBuilder(target.input);
        var delpos = [];
        var conditionalBlock = false;
        for (var i in tokens) {
            var type = tokens[i].type;
            if (type == Token.MACRO_SKIP) {
                var content = tokens[i].content.toLowerCase();
                if (content.indexOf(&quot;$if &quot;) == 0) {
                    conditionalBlock = true;
                } else if (content.indexOf(&quot;$end&quot;) == 0) {
                    conditionalBlock = false;
                }
            }
            if (type == Token.DQUOTED_STRING &amp;&amp; isUnquotingAllowed(tokens[i]) 
                &amp;&amp; !inOffOnRange(tokens[i].begin) &amp;&amp; !conditionalBlock) 
            {
                delpos.push(tokens[i].begin);
                delpos.push(tokens[i].end-1);
            }
        }
        var i = delpos.length - 1;
        while (i &gt;= 0) {
            newInput.deleteCharAt(delpos[i]);
            i--;
        }
        target.input = newInput.toString();
    }
 
    var updateParseTreeAndTokenList = function() {
        var Parsed = Java.type('oracle.dbtools.parser.Parsed');
        var SqlEarley = Java.type('oracle.dbtools.parser.plsql.SqlEarley')
        var defaultTokens = LexerToken.parse(target.input);
        var newTarget = new Parsed(target.input, defaultTokens, SqlEarley.getInstance(), 
            Java.to([&quot;sql_statements&quot;], &quot;java.lang.String[]&quot;));            
        target.src.clear();
        target.src.addAll(newTarget.src);
    }
 
    // main
    findAndConvertQuotedIdentifiers();
    updateParseTreeAndTokenList();
}
 
-- --------------------------------------------------------------------------------------------------------------------
-- Define identifiers (relevant for keyword case and identifier case)
-- --------------------------------------------------------------------------------------------------------------------
 
analytics: [identifier) identifier &amp; [call) analytic_function &amp; [call = [identifier;
ids: [identifier) identifier;
identifiers: ids - analytics -&gt;;" 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: #D4D4D4">-- --------------------------------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">-- </span><span style="color: #9CDCFE">Minimal</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Arbori</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">program</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">expected</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">by</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">the</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">formatter</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">also</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">expected</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;order_by_clause___0&quot;</span><span style="color: #D4D4D4">).</span></span>
<span class="line"><span style="color: #D4D4D4">-- --------------------------------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #9CDCFE">include</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;std.arbori&quot;</span></span>
<span class="line"><span style="color: #C8C8C8">dummy</span><span style="color: #D4D4D4">: :</span><span style="color: #9CDCFE">indentConditions</span><span style="color: #D4D4D4"> &amp; [</span><span style="color: #9CDCFE">node</span><span style="color: #D4D4D4">) </span><span style="color: #9CDCFE">identifier</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #9CDCFE">skipWhiteSpaceBeforeNode</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">runOnce</span><span style="color: #D4D4D4"> -&gt; { var doNotCallCallbackFunction;}</span></span>
<span class="line"><span style="color: #9CDCFE">dontFormatNode</span><span style="color: #D4D4D4">: [</span><span style="color: #9CDCFE">node</span><span style="color: #D4D4D4">) </span><span style="color: #9CDCFE">numeric_literal</span><span style="color: #D4D4D4"> | [</span><span style="color: #9CDCFE">node</span><span style="color: #D4D4D4">) </span><span style="color: #9CDCFE">path</span><span style="color: #D4D4D4"> -&gt;;</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">-- --------------------------------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">-- </span><span style="color: #9CDCFE">Keep</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">existing</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">whitespace</span><span style="color: #D4D4D4">.</span></span>
<span class="line"><span style="color: #D4D4D4">-- --------------------------------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #9CDCFE">keep_significant_whitespace</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">runOnce</span></span>
<span class="line"><span style="color: #D4D4D4">-&gt; {</span></span>
<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>
<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">true</span><span style="color: #D4D4D4">);  </span><span style="color: #6A9955">// include hidden tokens</span></span>
<span class="line"><span style="color: #D4D4D4">    var </span><span style="color: #9CDCFE">hiddenTokenCount</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    var </span><span style="color: #9CDCFE">wsBefore</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;&quot;</span><span style="color: #D4D4D4">;</span></span>
<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>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">for</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">in</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4"> == </span><span style="color: #9CDCFE">Token</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">LINE_COMMENT</span><span style="color: #D4D4D4"> || </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4"> == </span><span style="color: #9CDCFE">Token</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">COMMENT</span><span style="color: #D4D4D4"> || </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4"> == </span><span style="color: #9CDCFE">Token</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">WS</span><span style="color: #D4D4D4"> ||</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4"> == </span><span style="color: #9CDCFE">Token</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">MACRO_SKIP</span><span style="color: #D4D4D4"> || </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4"> == </span><span style="color: #9CDCFE">Token</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">SQLPLUSLINECONTINUE_SKIP</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">hiddenTokenCount</span><span style="color: #D4D4D4">++;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4"> == </span><span style="color: #9CDCFE">Token</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">WS</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">wsBefore</span><span style="color: #D4D4D4"> += </span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">wsBefore</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">-</span><span style="color: #9CDCFE">hiddenTokenCount</span><span style="color: #D4D4D4"> == </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> &amp;&amp; </span><span style="color: #9CDCFE">hiddenTokenCount</span><span style="color: #D4D4D4"> == </span><span style="color: #9CDCFE">wsBefore</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">length</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">struct</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">putNewline</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">wsBefore</span><span style="color: #D4D4D4"> != </span><span style="color: #CE9178">&quot; &quot;</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">struct</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">putNewline</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">-</span><span style="color: #9CDCFE">hiddenTokenCount</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">wsBefore</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">wsBefore</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">-- --------------------------------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">-- </span><span style="color: #9CDCFE">Enforce</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nonquoted</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">identifiers</span><span style="color: #D4D4D4">.</span></span>
<span class="line"><span style="color: #D4D4D4">-- --------------------------------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #9CDCFE">enforce_nonquoted_identifiers</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">runOnce</span></span>
<span class="line"><span style="color: #D4D4D4">-&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">    var </span><span style="color: #9CDCFE">offOnRanges</span><span style="color: #D4D4D4"> = [];</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    var </span><span style="color: #DCDCAA">populateOffOnRanges</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">off</span><span style="color: #D4D4D4"> = -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4"> == </span><span style="color: #9CDCFE">Token</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">LINE_COMMENT</span><span style="color: #D4D4D4"> || </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4"> == </span><span style="color: #9CDCFE">Token</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">COMMENT</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">toLowerCase</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">indexOf</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;@formatter:off&quot;</span><span style="color: #D4D4D4">) != -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">                    || </span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">toLowerCase</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">indexOf</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;noformat start&quot;</span><span style="color: #D4D4D4">) != -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">off</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">begin</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">off</span><span style="color: #D4D4D4"> != -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">toLowerCase</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">indexOf</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;@formatter:on&quot;</span><span style="color: #D4D4D4">) != -</span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">                        || </span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">toLowerCase</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">indexOf</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;noformat end&quot;</span><span style="color: #D4D4D4">) != -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                    {</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #9CDCFE">offOnRanges</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">push</span><span style="color: #D4D4D4">([</span><span style="color: #9CDCFE">off</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">end</span><span style="color: #D4D4D4">]);</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #9CDCFE">off</span><span style="color: #D4D4D4"> = -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                    }</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    var </span><span style="color: #DCDCAA">inOffOnRange</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">pos</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">offOnRanges</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">pos</span><span style="color: #D4D4D4"> &gt;= </span><span style="color: #9CDCFE">offOnRanges</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">][</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">] &amp;&amp; </span><span style="color: #9CDCFE">pos</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">offOnRanges</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">][</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">]) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    var </span><span style="color: #9CDCFE">HashSet</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;java.util.HashSet&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    var </span><span style="color: #9CDCFE">Arrays</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;java.util.Arrays&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    var </span><span style="color: #9CDCFE">reservedKeywords</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">HashSet</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">Arrays</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">asList</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;ACCESS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ADD&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;AFTER&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ALL&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ALLOW&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ALTER&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ANALYTIC&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;AND&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;ANY&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ANYSCHEMA&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;AS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ASC&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ASSOCIATE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;AUDIT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;AUTHID&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;AUTOMATIC&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;AUTONOMOUS_TRANSACTION&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;BEFORE&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;BEGIN&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;BETWEEN&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;BULK&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;BY&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;BYTE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CANONICAL&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CASE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CASE-SENSITIVE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CHAR&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CHECK&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CLUSTER&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;COLUMN&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;COLUMN_VALUE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;COMMENT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;COMPOUND&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;COMPRESS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CONNECT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CONNECT_BY_ROOT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CONSTANT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CONSTRAINT&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;CONSTRUCTOR&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CORRUPT_XID&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CORRUPT_XID_ALL&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CREATE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CROSSEDITION&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CURRENT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CUSTOMDATUM&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;CYCLE&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;DATE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DB_ROLE_CHANGE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DECIMAL&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DECLARE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DECREMENT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DEFAULT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DEFAULTS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DEFINE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DEFINER&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DELETE&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;DESC&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DETERMINISTIC&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DIMENSION&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DISALLOW&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DISASSOCIATE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DISTINCT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;DROP&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;EACH&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;EDITIONING&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ELSE&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;ELSIF&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;END&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;EVALNAME&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;EXCEPT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;EXCEPTION&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;EXCEPTIONS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;EXCEPTION_INIT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;EXCLUSIVE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;EXISTS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;EXTERNAL&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;FETCH&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;FILE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;FLOAT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;FOLLOWING&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;FOLLOWS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;FOR&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;FORALL&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;FROM&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;GOTO&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;GRANT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;GROUP&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;HAVING&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;HIDE&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;HIER_ANCESTOR&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;HIER_LAG&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;HIER_LEAD&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;HIER_PARENT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;IDENTIFIED&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;IF&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;IGNORE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;IMMEDIATE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;IMMUTABLE&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;IN&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;INCREMENT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;INDEX&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;INDICATOR&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;INDICES&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;INITIAL&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;INITIALLY&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;INLINE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;INSERT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;INSTEAD&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;INTEGER&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;INTERSECT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;INTO&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;INVISIBLE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;IS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ISOLATION&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;JAVA&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;JSON_EXISTS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;JSON_TABLE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;LATERAL&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;LEVEL&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;LIBRARY&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;LIKE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;LIKE2&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;LIKE4&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;LIKEC&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;LOCK&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;LOGON&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;LONG&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;MAXEXTENTS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;MAXVALUE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;MEASURES&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;MERGE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;MINUS&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;MINVALUE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;MLSLABEL&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;MODE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;MODIFY&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;MULTISET&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;MUTABLE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;NAN&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;NAV&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;NCHAR_CS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;NESTED_TABLE_ID&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;NOAUDIT&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;NOCOMPRESS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;NOCOPY&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;NOCYCLE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;NONSCHEMA&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;NORELY&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;NOT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;NOVALIDATE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;NOWAIT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;NULL&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;NUMBER&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;OF&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;OFFLINE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ON&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ONLINE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ONLY&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;OPTION&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;OR&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ORADATA&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ORDER&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ORDINALITY&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;OVER&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;OVERRIDING&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;PARALLEL_ENABLE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;PARTITION&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;PASSING&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;PAST&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;PCTFREE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;PIPELINED&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;PIVOT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;PRAGMA&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;PRECEDES&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;PRECEDING&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;PRESENT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;PRIOR&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;PROCEDURE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;PUBLIC&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;RAW&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;REFERENCES&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;REFERENCING&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;REJECT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;RELY&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;RENAME&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;REPEAT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;RESOURCE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;RESPECT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;RESTRICT_REFERENCES&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;RESULT_CACHE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;RETURNING&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;REVOKE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ROW&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;ROWID&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ROWNUM&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;ROWS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SELECT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SEQUENTIAL&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SERIALIZABLE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SERIALLY_REUSABLE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SERVERERROR&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SESSION&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;SET&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SETS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SHARE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SIBLINGS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SINGLE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SIZE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SMALLINT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SOME&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SQLDATA&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SQL_MACRO&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;STANDALONE&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;START&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SUBMULTISET&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SUBPARTITION&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SUCCESSFUL&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SUPPRESSES_WARNING_6009&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SYNONYM&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;SYSDATE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;TABLE&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;THE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;THEN&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;TO&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;TRIGGER&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;UDF&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;UID&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;UNBOUNDED&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;UNDER&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;UNION&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;UNIQUE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;UNLIMITED&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;UNPIVOT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;UNTIL&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;UPDATE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;UPSERT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;USER&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;USING&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;VALIDATE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;VALUES&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;VARCHAR&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;VARCHAR2&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;VARRAY&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;VARYING&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;VIEW&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;WHEN&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;WHENEVER&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;WHERE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;WHILE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;WINDOW&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;WITH&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;XMLATTRIBUTES&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;XMLEXISTS&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;XMLFOREST&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;XMLNAMESPACES&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;XMLQUERY&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;XMLROOT&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;XMLSCHEMA&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;XMLSERIALIZE&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&quot;XMLTABLE&quot;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    var </span><span style="color: #DCDCAA">isKeyword</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">token</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">reservedKeywords</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">contains</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">token</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">replace</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;&quot;&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;&quot;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    var </span><span style="color: #DCDCAA">isUnquotingAllowed</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">token</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Pattern</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">&quot;java.util.regex.Pattern&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (!</span><span style="color: #9CDCFE">Pattern</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">matches</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;^&quot;[A-Z][A-Z0-9_$#]*&quot;$&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">token</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">)) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #DCDCAA">isKeyword</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">token</span><span style="color: #D4D4D4">)) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    var </span><span style="color: #DCDCAA">findAndConvertQuotedIdentifiers</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </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">true</span><span style="color: #D4D4D4">);  </span><span style="color: #6A9955">// include hidden tokens</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">populateOffOnRanges</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">StringBuilder</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;java.lang.StringBuilder&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">newInput</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">StringBuilder</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>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">delpos</span><span style="color: #D4D4D4"> = [];</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">conditionalBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4"> == </span><span style="color: #9CDCFE">Token</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">MACRO_SKIP</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">toLowerCase</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">indexOf</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;$if &quot;</span><span style="color: #D4D4D4">) == </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">conditionalBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">indexOf</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;$end&quot;</span><span style="color: #D4D4D4">) == </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">conditionalBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4"> == </span><span style="color: #9CDCFE">Token</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">DQUOTED_STRING</span><span style="color: #D4D4D4"> &amp;&amp; </span><span style="color: #DCDCAA">isUnquotingAllowed</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">]) </span></span>
<span class="line"><span style="color: #D4D4D4">                &amp;&amp; !</span><span style="color: #DCDCAA">inOffOnRange</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">begin</span><span style="color: #D4D4D4">) &amp;&amp; !</span><span style="color: #9CDCFE">conditionalBlock</span><span style="color: #D4D4D4">) </span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">delpos</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">push</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">begin</span><span style="color: #D4D4D4">);</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">delpos</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">push</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">tokens</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">end</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">delpos</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">length</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> &gt;= </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) {</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">newInput</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">deleteCharAt</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">delpos</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">]);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">--;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><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: #9CDCFE">newInput</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">toString</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    var </span><span style="color: #DCDCAA">updateParseTreeAndTokenList</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Parsed</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.Parsed&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SqlEarley</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.plsql.SqlEarley&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">defaultTokens</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>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">newTarget</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Parsed</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: #9CDCFE">defaultTokens</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">SqlEarley</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getInstance</span><span style="color: #D4D4D4">(), </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">Java</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">to</span><span style="color: #D4D4D4">([</span><span style="color: #CE9178">&quot;sql_statements&quot;</span><span style="color: #D4D4D4">], </span><span style="color: #CE9178">&quot;java.lang.String[]&quot;</span><span style="color: #D4D4D4">));            </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">target</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">src</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">clear</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">target</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">src</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">addAll</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">newTarget</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">src</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// main</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">findAndConvertQuotedIdentifiers</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">updateParseTreeAndTokenList</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">-- --------------------------------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4">-- </span><span style="color: #9CDCFE">Define</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">identifiers</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">relevant</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">keyword</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">case</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">and</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">identifier</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">case</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">-- --------------------------------------------------------------------------------------------------------------------</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #9CDCFE">analytics</span><span style="color: #D4D4D4">: [</span><span style="color: #9CDCFE">identifier</span><span style="color: #D4D4D4">) </span><span style="color: #9CDCFE">identifier</span><span style="color: #D4D4D4"> &amp; [</span><span style="color: #9CDCFE">call</span><span style="color: #D4D4D4">) </span><span style="color: #9CDCFE">analytic_function</span><span style="color: #D4D4D4"> &amp; [</span><span style="color: #9CDCFE">call</span><span style="color: #D4D4D4"> = [</span><span style="color: #9CDCFE">identifier</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #9CDCFE">ids</span><span style="color: #D4D4D4">: [</span><span style="color: #9CDCFE">identifier</span><span style="color: #D4D4D4">) </span><span style="color: #9CDCFE">identifier</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #9CDCFE">identifiers</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">ids</span><span style="color: #D4D4D4"> - </span><span style="color: #9CDCFE">analytics</span><span style="color: #D4D4D4"> -&gt;;</span></span></code></pre></div>



<p class="wp-block-paragraph">Firstly, the lines 1 to 8 are required by the formatter. They are not interesting in this context.</p>



<p class="wp-block-paragraph">Secondly, lines 9 to 42 are the heart of a lightweight formatter. This code ensures that all whitespace between all tokens is kept. Therefore, the existing format of the code remains untouched. Read <a href="https://www.salvis.com/blog/2020/04/13/formatting-code-with-sql-developer/">this blog post</a> to learn how SQL Developer&#8217;s formatter works.</p>



<p class="wp-block-paragraph">Thirdly, lines 43 to 173 remove unnecessary double quotes from identifiers. We store the position of double quotes to be removed on lines 147 and 148 in an array named <code>delpos</code> while processing all tokens from start to end. The removal of the double quotes happens on line 153 while processing <code>delpos</code> entries from end to start.</p>



<p class="wp-block-paragraph">And finally, the lines 174-180 define an Arbori query named <code>identifier</code>. The formatter uses this query to divide lexer tokens of type <code>IDENTIFIER</code> into keywords and identifiers. This is important to ensure that the case of identifiers is left &#8220;as is&#8221; regardless of the configuration of <code>kwCase</code>.</p>



<h2 class="wp-block-heading">Doesn’t Connor’s PL/SQL Function Do the Same?</h2>



<p class="wp-block-paragraph">No, when you look closely at the <a href="https://github.com/connormcd/misc-scripts/blob/8d748205cca42c63121a3ff762e80b0555d6967e/ddl_cleanup.sql">ddl_cleanup.sql</a> script as of 2022-03-02, you will find out that the <code>ddl</code> function has the following limitations:</p>



<ul class="wp-block-list">
<li>Quoted identifiers are not ignored in
<ul class="wp-block-list">
<li>Single and multi-line comments</li>



<li>Conditional compilation text</li>



<li>Code sections for which the formatter is disabled</li>
</ul>
</li>



<li>Java Strings are treated as quoted identifiers</li>



<li>Reserved keywords are not considered</li>



<li>Nonquoted identifiers are changed to lowercase, which might break code using JSON dot notation</li>
</ul>



<p class="wp-block-paragraph">It just shows that things become complicated when you don&#8217;t solve them in the right place. In this case dbms_metadata&#8217;s XSLT scripts. dbms_metadata knows what&#8217;s an identifier. It can safely skip the enquoting process if the identifier is in upper case, matches the regular expression ^[A-Z][A-Z0-9_$#]*$ and the identifier is not a reserved keyword. That&#8217;s all. The logic can be implemented in a single XSL template. We API users on the other side must parse the code to somehow identify quoted identifiers and their context before we can decide how to proceed.</p>



<h2 class="wp-block-heading">Formatting DDL Automatically</h2>



<p class="wp-block-paragraph">You can configure SQL Developer to automatically format DDL with your current formatter settings. For that you have to enable the option <code>Autoformat Dictionary Objects SQL</code> as in the screenshot below:</p>



<figure class="wp-block-image"><a href="https://www.salvis.com/blog/wp-content/uploads/2022/10/auoformat_ddl-2.png"><img loading="lazy" decoding="async" width="1898" height="356" src="https://www.salvis.com/blog/wp-content/uploads/2022/10/auoformat_ddl-2.png" alt="Autoformat DDL" class="wp-image-11818" srcset="https://www.salvis.com/blog/wp-content/uploads/2022/10/auoformat_ddl-2.png 1898w, https://www.salvis.com/blog/wp-content/uploads/2022/10/auoformat_ddl-2-300x56.png 300w, https://www.salvis.com/blog/wp-content/uploads/2022/10/auoformat_ddl-2-1024x192.png 1024w, https://www.salvis.com/blog/wp-content/uploads/2022/10/auoformat_ddl-2-768x144.png 768w, https://www.salvis.com/blog/wp-content/uploads/2022/10/auoformat_ddl-2-1536x288.png 1536w, https://www.salvis.com/blog/wp-content/uploads/2022/10/auoformat_ddl-2-260x49.png 260w, https://www.salvis.com/blog/wp-content/uploads/2022/10/auoformat_ddl-2-50x9.png 50w, https://www.salvis.com/blog/wp-content/uploads/2022/10/auoformat_ddl-2-150x28.png 150w" sizes="auto, (max-width:767px) 480px, (max-width:1898px) 100vw, 1898px" /></a></figure>



<p class="wp-block-paragraph">Here&#8217;s the result for the <code>deptsal</code> view using the&nbsp;<a href="https://github.com/Trivadis/plsql-formatter-settings">PL/SQL &amp; SQL Formatter Settings</a>:</p>



<figure class="wp-block-image is-resized"><a href="https://www.salvis.com/blog/wp-content/uploads/2022/10/autoformat_in_action-1.png"><img loading="lazy" decoding="async" width="1094" height="776" src="https://www.salvis.com/blog/wp-content/uploads/2022/10/autoformat_in_action-1.png" alt="Autoformat in Action" class="wp-image-11780" style="width:547px" srcset="https://www.salvis.com/blog/wp-content/uploads/2022/10/autoformat_in_action-1.png 1094w, https://www.salvis.com/blog/wp-content/uploads/2022/10/autoformat_in_action-1-300x213.png 300w, https://www.salvis.com/blog/wp-content/uploads/2022/10/autoformat_in_action-1-1024x726.png 1024w, https://www.salvis.com/blog/wp-content/uploads/2022/10/autoformat_in_action-1-768x545.png 768w, https://www.salvis.com/blog/wp-content/uploads/2022/10/autoformat_in_action-1-206x146.png 206w, https://www.salvis.com/blog/wp-content/uploads/2022/10/autoformat_in_action-1-50x35.png 50w, https://www.salvis.com/blog/wp-content/uploads/2022/10/autoformat_in_action-1-106x75.png 106w, https://www.salvis.com/blog/wp-content/uploads/2022/10/autoformat_in_action-1-1x1.png 1w" sizes="auto, (max-width:767px) 480px, (max-width:1094px) 100vw, 1094px" /></a></figure>



<p class="wp-block-paragraph">The identifiers in upper case were originally quoted identifiers. By default, we configure the formatter to keep the case of identifiers. This ensures that code using JSON dot notation is not affected by a formatting operation.</p>



<h2 class="wp-block-heading">Processing Many Files</h2>



<p class="wp-block-paragraph">SQL Developer is not suited to format many files. However, you can use the <a href="https://github.com/Trivadis/plsql-formatter-settings/blob/main/sqlcl/README.md">SQLcl script</a> or the <a href="https://github.com/Trivadis/plsql-formatter-settings/tree/main/standalone">standalone formatter</a> to format files in a directory tree. The formatter settings (path to the .xml and .arbori file) can be passed as parameters. I recommend using the standalone formatter. It uses the up-to-date and much faster JavaScript engine from GraalVM. Furthermore, the standalone formatter also works with JDK 17, which no longer contains a JavaScript engine.</p>



<p class="wp-block-paragraph">You can download the latest <code>tvdformat.jar</code> from <a href="https://github.com/Trivadis/plsql-formatter-settings/releases">here</a>. Run <code>java -jar tvdformat.jar</code> to show all command line options.</p>



<h2 class="wp-block-heading">Summary</h2>



<p class="wp-block-paragraph">If your code base contains generated code, then it probably also contains unnecessarily quoted identifiers. Especially if <code>dbms_metadata</code> was used to extract DDL statements. Removing these double quotes without breaking some code is not that easy. However, SQL Developer&#8217;s highly configurable formatter can do the job, even without actually formatting the code.</p>



<p class="wp-block-paragraph">I hope that some of the shortcomings of <code>dbms_metadata</code> will be addressed in an upcoming release of the Oracle Database. Supporting nonquoted identifiers as an additional non-default option should be easy and not so risky to implement.</p>



<p class="wp-block-paragraph">Anyway, instead of just detecting violations of <span class="md-ellipsis"><a href="https://trivadis.github.io/plsql-and-sql-coding-guidelines/v4.2/4-language-usage/2-variables-and-types/1-general/g-2180/">G-2180: Never use quoted identifiers</a></span>, it is a good idea to be able to correct them automatically.</p>



<p class="wp-block-paragraph">Please open a <a href="https://github.com/Trivadis/plsql-formatter-settings#issues">GitHub issue</a> if you encounter a bug in the formatter settings. Thank you.</p>
<p>The post <a href="https://www.salvis.com/blog/2022/10/11/quoted-identifiers-joelkallmanday/">Quoted Identifiers #JoelKallmanDay</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
