<?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>accessible_by_clause Archives - Philipp Salvisberg&#039;s Blog</title>
	<atom:link href="https://www.salvis.com/blog/tag/accessible_by_clause/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.salvis.com/blog/tag/accessible_by_clause/</link>
	<description>Database-centric development</description>
	<lastBuildDate>Wed, 08 Nov 2023 11:11:24 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.salvis.com/blog/wp-content/uploads/2014/04/favicon.png</url>
	<title>accessible_by_clause Archives - Philipp Salvisberg&#039;s Blog</title>
	<link>https://www.salvis.com/blog/tag/accessible_by_clause/</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/accessible_by_clause/feed/"/>
	<item>
		<title>Names Matter</title>
		<link>https://www.salvis.com/blog/2020/06/21/names-matter/</link>
					<comments>https://www.salvis.com/blog/2020/06/21/names-matter/#comments</comments>
		
		<dc:creator><![CDATA[Philipp Salvisberg]]></dc:creator>
		<pubDate>Sun, 21 Jun 2020 15:00:30 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[accessible_by_clause]]></category>
		<category><![CDATA[Decision Time]]></category>
		<category><![CDATA[Flashback]]></category>
		<category><![CDATA[Flashback Data Archive]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[PL/SQL Cop]]></category>
		<category><![CDATA[SonarQube]]></category>
		<category><![CDATA[Transaction Time]]></category>
		<category><![CDATA[Valid Time]]></category>
		<guid isPermaLink="false">https://www.salvis.com/blog/?p=9890</guid>

					<description><![CDATA[<p>This is one of my favourite quotes: There are only two hard things in Computer Science: cache invalidation and naming things.&#8212; Phil Karlton IT is my daily life. And this quote is so true. Lately, I&#8217;ve been thinking much more than usual about naming, and that names really matter. This led to<span class="excerpt-hellip"> […]</span></p>
<p>The post <a href="https://www.salvis.com/blog/2020/06/21/names-matter/">Names Matter</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>This is one of my favourite quotes:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>There are only two hard things in Computer Science: cache invalidation and naming things.<br />&#8212; Phil Karlton</p>
</blockquote>



<p>IT is my daily life. And this quote is so true. Lately, I&#8217;ve been thinking much more than usual about naming, and that names really matter. This led to some refactoring activities.</p>



<h2 class="wp-block-heading">Why Is Naming Important?</h2>



<p>When a person with German mother tongue hears the word &#8220;eagle&#8221;, she or he automatically associates it with a &#8220;hedgehog&#8221;. Simply because the German word for it (&#8220;Igel&#8221;) is pronounced exactly the same. Of course, language skills and the concrete context play a role. The point is, a wrong association is likely. When we give a name to a thing, we basically want to avoid such false associations. In the best case, they are not helpful. In the worst case, this leads to rejection, as the next example shows.</p>



<p>In 1982 Mitsubishi Motors launched a SUV with the name &#8220;Pajero&#8221;. This name had to be changed in some regions, because &#8220;pajero&#8221; means &#8220;wanker&#8221; in Spanish. This example also shows that it is more important what others think about a name than we do.</p>



<p>In IT we have to name many things. Databases, schemas, tables, columns, views, packages, triggers, variables, fields, methods, classes, modules, components, products, etc. etc. Using an established name with a known and accepted definition help others to understand it better.</p>



<p>When we use a name, it is actually associated with a definition and properties, whether we like it or not. When names have a common and widely accepted meaning, it simplifies the communication. For example &#8220;banana&#8221;. Everybody knows what it means. <a href="https://www.merriam-webster.com/dictionary/banana">Merriam-Webster&#8217;s definition</a> is:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>An elongated usually tapering tropical fruit with soft pulpy flesh enclosed in a soft usually yellow rind.</p>
</blockquote>



<p>And I am sure that each of us could add a few characteristics to this definition.</p>



<h2 class="wp-block-heading">Why Is Naming Difficult?</h2>



<p>A name must fulfil many characteristics. For example</p>



<ul class="wp-block-list">
<li>Short</li>



<li>Fitting (naturally relates to the intended meaning, and characteristics)</li>



<li>Easy to spell,&nbsp;pronounce, remember</li>



<li>Not associated with unwanted characteristics</li>



<li>Common and widely accepted meaning and definition, that fits the intention (for names without commercial value)</li>



<li>New, not used already (for marketable names)</li>
</ul>



<p>Depending on context there are some goal conflicts. However, even without a major conflict, it is difficult to name something adequately in the early stages. Because we do not know enough about the thing we want to name. Hence, we use an iterative approach. We name something (e.g. an entity, package or class) and while working on it we find out that the name does not fit (anymore) and we change it. Maybe we split the thing and have to name now two things, etc. etc.</p>



<p>Finding a fitting name means doing some research. How have others named that thing? What is the definition of it? Does it fit 100 percent? This is an interesting and instructive work. In any case, it takes time. And at the time we need a new name, we want it now (e.g. when a wizard asks for a name). We can always rename it later, right? &#8211; Technically yes. And often we do. But the longer we wait, the less likely we are renaming.</p>



<h2 class="wp-block-heading">Are Some Names More Important Than Others?</h2>



<p>Yes. The more visible a name is the more important it is.</p>



<p>For example, the names behind an API are very easy to change. We do not have to ask anyone before changing it. It&#8217;s no problem as long as the API provides the same results. That&#8217;s one of the reasons we strive for tight APIs, right? To get some leeway.</p>



<p>As soon as others are involved, we are not fully in control of the change anymore. For example, when I change a name in one of my blog posts, this change is visible immediately to everyone visiting my blog. But I cannot control the caches of others, like search engines, blog mirrors and other services that copy web content to third-party storages. Remember, cache invalidation is the other hard thing in IT.</p>



<p>As a consequence, before we release an artefact that becomes visible to others, we should take some time to verify the used names. We cannot take back what we&#8217;ve said (at least not completely). However, we are in control of what we say in the future.</p>



<h2 class="wp-block-heading">Banned Names on This Blog</h2>



<p>Some terms (names) were discussed recently (again) due to a series of sad events. I used these terms as well. I never really thought about them as &#8220;bad&#8221;. However, I&#8217;ve changed my mind. I&#8217;m part of the problem. And I do not like it. One thing I can do is to stop using terms, that a large group of people associate with slavery and racism. No big deal, right?</p>



<p>This is another quote I like very much:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>One cannot not communicate<br />&#8212; Paul Watzlawick</p>
</blockquote>



<p>It is difficult to draw a line for certain terms. However, I believe that &#8220;you cannot not decide&#8221;. You decide either explicitly or implicitly. Of course, very seldom something is purely black or white. It&#8217;s much more often a shade of grey. Some decision take some time. And that&#8217;s okay. But it is impossible to postpone a decision forever. At a certain point, it becomes a decision.</p>



<p>So, I decided to decommission some terms on this blog and introduce new ones. Here&#8217;s the list:</p>



<table id="tablepress-16" class="tablepress tablepress-id-16">
<thead>
<tr class="row-1">
	<th class="column-1">Current Term</th><th class="column-2">Decommissioned Term</th><th class="column-3">Context</th>
</tr>
</thead>
<tbody class="row-striping row-hover">
<tr class="row-2">
	<td class="column-1">accessible</td><td class="column-2"><del>white listed</del></td><td class="column-3">PL/SQL accessible_by clause</td>
</tr>
<tr class="row-3">
	<td class="column-1">agent</td><td class="column-2"><del>slave</del></td><td class="column-3">Jenkins</td>
</tr>
<tr class="row-4">
	<td class="column-1">exclusion list</td><td class="column-2"><del>blacklist</del></td><td class="column-3">PL/SQL Cop, PL/SQL accessible_by clause</td>
</tr>
<tr class="row-5">
	<td class="column-1">inclusion list</td><td class="column-2"><del>whitelist</del></td><td class="column-3">PL/SQL Cop, PL/SQL accessible_by clause</td>
</tr>
<tr class="row-6">
	<td class="column-1">main</td><td class="column-2"><del>master</del></td><td class="column-3">Git branch</td>
</tr>
<tr class="row-7">
	<td class="column-1">transaction structure data + enterprise structure data</td><td class="column-2"><del>master data</del></td><td class="column-3">Data modeling</td>
</tr>
<tr class="row-8">
	<td class="column-1">worker</td><td class="column-2"><del>slave</del></td><td class="column-3">Oracle DB background process </td>
</tr>
</tbody>
</table>
<!-- #tablepress-16 from cache -->


<p>Finding alternative names was surprisingly easy because others had already done the work and defined alternative names. They existed for years&#8230;</p>



<h3 class="wp-block-heading">Master Data</h3>



<p>However, finding an alternative for <a href="https://en.wikipedia.org/wiki/Master_data">master data</a> was harder. I reached out to my friends on Twitter. And got some helpful feedback. Finally, Robert Marti suggested having a look at <a href="https://www.linkedin.com/in/malcolmchisholm/">Malcolm Chisholm</a>&#8216;s book <a href="https://books.google.ch/books?id=WxtW5SUUAYAC&amp;printsec=frontcover#v=onepage&amp;q&amp;f=false">Managing Reference Data in Enterprise Databases</a>. On page <a href="https://books.google.ch/books?id=WxtW5SUUAYAC&amp;lpg=PP1&amp;pg=PA258#v=onepage&amp;q&amp;f=false">258ff</a> the different data classes are defined and explained. The book is from 2000. In the meantime Malcolm Chisholm has published revised definitions <a href="https://www.topquadrant.com/docs/whitepapers/TopBraid_ReferenceDataManagementWhitepaper-3-18-15.pdf">here</a> and <a href="https://www.topquadrant.com/resources/blogs/semantic-ecosystem-journal/docs/RefDataPrepMCRC-Final060215.pdf">here</a>.</p>



<p>In the next subchapter, I repeat the definition of the data groups defined by Malcolm Chisholm on slide 5 in <a href="https://www.topquadrant.com/resources/blogs/semantic-ecosystem-journal/docs/RefDataPrepMCRC-Final060215.pdf">this deck</a>. I like these definitions and plan to use them in the future.</p>



<h4 class="wp-block-heading">Metadata</h4>



<p>The data that describes all aspects of an enterprise’s information assets, and enables the enterprise to effectively use and manage these assets.</p>



<p><em>Here it is confined to the structure of databases. Found in a database’s system catalog. Sometimes included in database tables.</em></p>



<h4 class="wp-block-heading">Reference Data</h4>



<p>Any kind of data that is used solely to categorize other data found in a database, or solely for relating data in a database to information beyond the boundaries of the enterprise.</p>



<p><em>Codes and descriptions. Tables containing this data usually have just a few rows and columns.</em></p>



<h4 class="wp-block-heading">Transaction Structure Data</h4>



<p>Data that represents the direct participants in a transaction, and which must be present before a transaction fires.</p>



<p><em>The parties to the transactions of the enterprise. E.g. Customer, Product.</em></p>



<h4 class="wp-block-heading">Enterprise Structure Data</h4>



<p>Data that permits business activity to be reported and/or analyzed by business responsibility.</p>



<p><em>Typically, data that describes the structure of the enterprise. E.g. organizational or financial structure.</em></p>



<h4 class="wp-block-heading">Transaction Activity Data</h4>



<p>Data that represents the operations an enterprise carries out.</p>



<p><em>Traditional focus of IT – in many enterprises the only focus.</em></p>



<h4 class="wp-block-heading">Transaction Audit Data</h4>



<p>Data that tracks the life cycle of individual transactions.</p>



<p><em>Includes application logs, database logs, web server logs<span class="s1">.</span></em></p>



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



<p>You use a name to simplify communication. A name is a proxy for a longer definition and meaning. If the meaning is badly received by others and especially by the target community, this does not simplify communication. Using a different name sounds like a simple solution. Why not, if changing a name is simple enough?</p>



<p>In this case, I only had to edit a few blog posts. I handled them like typos. This means that I did not add any update information. I also had to register new URL redirects. That was straightforward. However, changing the branch name in 26 GitHub repositories was a bit more work than anticipated, because I also had to change URLs in several related files. For certain GitHub pages, I had to keep a non-default master branch. I suppose that sooner or later GitHub will allow me to get rid of them as well. If I had to change more repositories, I would probably automate this task.</p>



<p>Most of the time I spent finding an alternative name for &#8220;master data&#8221;. In the end, I learned something new and found good names and definitions. That will help me in the future.</p>
<p>The post <a href="https://www.salvis.com/blog/2020/06/21/names-matter/">Names Matter</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.salvis.com/blog/2020/06/21/names-matter/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Why and How Using the accessible_by_clause</title>
		<link>https://www.salvis.com/blog/2018/05/06/why-and-how-using-the-accessible_by_clause/</link>
					<comments>https://www.salvis.com/blog/2018/05/06/why-and-how-using-the-accessible_by_clause/#comments</comments>
		
		<dc:creator><![CDATA[Philipp Salvisberg]]></dc:creator>
		<pubDate>Sun, 06 May 2018 10:22:59 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[accessible_by_clause]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[utPLSQL]]></category>
		<guid isPermaLink="false">https://www.salvis.com/blog/?p=8276</guid>

					<description><![CDATA[<p>The accessible_by_clause was introduced in Oracle Database 12 Release 1 and extended in Release 2. If you don‘t know this feature, I suggest having a look at the documentation or reading Steven Feuerstein&#8217;s blog post. In this blog post, I talk about how to use this feature properly. Consider you have a<span class="excerpt-hellip"> […]</span></p>
<p>The post <a href="https://www.salvis.com/blog/2018/05/06/why-and-how-using-the-accessible_by_clause/">Why and How Using the accessible_by_clause</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>The <code>accessible_by_clause</code> was introduced in Oracle Database 12 Release 1 and extended in Release 2. If you don‘t know this feature, I suggest having a look at the documentation or reading <a href="http://stevenfeuersteinonplsql.blogspot.ch/2017/02/enhanced-whitelist-management-in-122.html">Steven Feuerstein&#8217;s blog post</a>.</p>



<p>In this blog post, I talk about how to use this feature properly.</p>



<p>Consider you have a schema <code>the_api</code> and there&#8217;s a package <code>math</code> with the following signature:</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) package math</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE PACKAGE the_api.math AS
   /**
   * Calculates the sum of all integers found in a string.
   *
   * @param in_integers string containing integers to be summarized
   * @returns sum, NULL if no integers are found
   */
   FUNCTION get_sum(
      in_integers IN VARCHAR2
   ) RETURN INTEGER DETERMINISTIC;

   /**
   * Calculates the digit sum of an integer.
   *
   * @param in_integer input integer to calculate cross sum from 
   * @returns cross sum, NULL if input is NULL
   */
   FUNCTION get_cross_sum(
      in_integer IN INTEGER
   ) RETURN INTEGER DETERMINISTIC;
END math;
/" 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">PACKAGE</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.math</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">   * Calculates the sum of all integers found in a string.</span></span>
<span class="line"><span style="color: #6A9955">   *</span></span>
<span class="line"><span style="color: #6A9955">   * @param in_integers string containing integers to be summarized</span></span>
<span class="line"><span style="color: #6A9955">   * @returns sum, NULL if no integers are found</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_sum</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_integers </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</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">INTEGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">   * Calculates the digit sum of an integer.</span></span>
<span class="line"><span style="color: #6A9955">   *</span></span>
<span class="line"><span style="color: #6A9955">   * @param in_integer input integer to calculate cross sum from </span></span>
<span class="line"><span style="color: #6A9955">   * @returns cross sum, NULL if input is NULL</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_cross_sum</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_integer </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTEGER</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">INTEGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> math;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p>The next query uses the provided functions <code>get_sum</code> and <code>get_cross_sum</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">2) using functions in package math</span><span role="button" tabindex="0" data-code="SELECT the_api.math.get_sum('What is the sum of 5, 7, 13 and 17?') AS the_sum,
       the_api.math.get_cross_sum(3456789) AS the_cross_sum
  FROM dual;

   THE_SUM THE_CROSS_SUM
---------- -------------
        42            42" 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"> the_api.math.get_sum(</span><span style="color: #CE9178">&#39;What is the sum of 5, 7, 13 and 17?&#39;</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> the_sum,</span></span>
<span class="line"><span style="color: #D4D4D4">       the_api.math.get_cross_sum(</span><span style="color: #B5CEA8">3456789</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> the_cross_sum</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>
<span class="line"><span style="color: #D4D4D4">   THE_SUM THE_CROSS_SUM</span></span>
<span class="line"><span style="color: #6A9955">---------- -------------</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #B5CEA8">42</span><span style="color: #D4D4D4">            </span><span style="color: #B5CEA8">42</span></span></code></pre></div>



<h2 class="wp-block-heading">No <code>accessible_by_clause</code></h2>



<p>In an Oracle Database 11g the package body might be implemented 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);--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) package body math</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE PACKAGE BODY the_api.math AS
   FUNCTION get_sum(
      in_integers IN sys.ora_mining_number_nt
   ) RETURN INTEGER DETERMINISTIC IS
      l_result INTEGER;
   BEGIN
      SELECT sum(column_value)
        INTO l_result
        FROM table(in_integers);
      RETURN l_result;
   END get_sum;

   FUNCTION to_int_table(
      in_integers IN VARCHAR2,
      in_pattern  IN VARCHAR2 DEFAULT '[0-9]+'
   ) RETURN sys.ora_mining_number_nt DETERMINISTIC IS
      l_result sys.ora_mining_number_nt := sys.ora_mining_number_nt();
      l_pos    INTEGER := 1;
      l_int    INTEGER;
   BEGIN
      <<integer_tokens&gt;&gt;
      LOOP
         l_int := to_number(regexp_substr(in_integers, in_pattern, 1, l_pos));
         EXIT integer_tokens WHEN l_int IS NULL;
         l_result.EXTEND;
         l_result(l_pos) := l_int;
         l_pos := l_pos + 1;
      END LOOP integer_tokens;
      RETURN l_result;
   END to_int_table;

   FUNCTION get_sum(
      in_integers IN VARCHAR2
   ) RETURN INTEGER DETERMINISTIC IS
   BEGIN
      RETURN get_sum(to_int_table(in_integers));
   END get_sum;

   FUNCTION get_cross_sum(
      in_integer IN INTEGER
   ) RETURN INTEGER DETERMINISTIC IS
   BEGIN
      RETURN get_sum(to_int_table(to_char(in_integer), '[0-9]'));       
   END get_cross_sum;
END math;
/" 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">PACKAGE BODY</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.math</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_sum</span><span style="color: #D4D4D4">(</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">      in_integers </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> sys.ora_mining_number_nt</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: #569CD6">INTEGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">l_result</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">;</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: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">sum</span><span style="color: #D4D4D4">(column_value)</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_result</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">table</span><span style="color: #D4D4D4">(in_integers);</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">l_result</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> get_sum;</span></span>
<span class="line"></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">to_int_table</span><span style="color: #D4D4D4">(</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">      in_integers </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">      in_pattern  </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">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;[0-9]+&#39;</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">   ) </span><span style="color: #C586C0">RETURN</span><span style="color: #D4D4D4"> sys.ora_mining_number_nt </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">l_result</span><span style="color: #D4D4D4"> sys.ora_mining_number_nt := sys.ora_mining_number_nt();</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">l_pos</span><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INTEGER</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">l_int</span><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;&lt;integer_tokens&gt;&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">LOOP</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #9CDCFE">l_int</span><span style="color: #D4D4D4"> := </span><span style="color: #DCDCAA">to_number</span><span style="color: #D4D4D4">(regexp_substr(in_integers, in_pattern, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">l_pos</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">EXIT</span><span style="color: #D4D4D4"> integer_tokens </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">l_int</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS NULL</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #9CDCFE">l_result</span><span style="color: #DCDCAA">.EXTEND</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #9CDCFE">l_result</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">l_pos</span><span style="color: #D4D4D4">) := </span><span style="color: #9CDCFE">l_int</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #9CDCFE">l_pos</span><span style="color: #D4D4D4"> := </span><span style="color: #9CDCFE">l_pos</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">END LOOP</span><span style="color: #D4D4D4"> integer_tokens;</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">l_result</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> to_int_table;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_sum</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_integers </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</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">INTEGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</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: #C586C0">RETURN</span><span style="color: #D4D4D4"> get_sum(to_int_table(in_integers));</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> get_sum;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_cross_sum</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_integer </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTEGER</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">INTEGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</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: #C586C0">RETURN</span><span style="color: #D4D4D4"> get_sum(to_int_table(</span><span style="color: #DCDCAA">to_char</span><span style="color: #D4D4D4">(in_integer), </span><span style="color: #CE9178">&#39;[0-9]&#39;</span><span style="color: #D4D4D4">));       </span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> get_cross_sum;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> math;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p>The private functions <code>get_sum</code> and <code>to_int_table</code> are doing the real work. Here are some issues with this code</p>



<p><strong>1. Use of undocumented collection type&nbsp;<code>sys.ora_mining_number_nt</code></strong></p>



<p>The private functions avoid the use of their own type, something like CREATE TYPE t_integer_type IS TABLE OF INTEGER. This shortcut is hidden and not part of the API. It is not super elegant, but quite common and easy to fix when Oracle decides to remove this collection type in a future release or to protect it with an <code>accessible_by_clause</code>. So I do not consider this a real problem and will not deal with it in this blog post.</p>



<p><strong>2. Private function definitions must be ordered according its usage</strong></p>



<p>The private functions are listed at the top of the package body, hence no forward declarations are necessary. Forward declarations lead to some confusion since IDEs do not distinguish between declarations and definitions in the outline window and you often end up selecting the wrong one. However, without forward declaration you have to order your private functions according its usage, which might break your domain-specific ordering logic.</p>



<p><strong>3. Private functions are not documented</strong></p>



<p>I usually document the signature of a PL/SQL unit in the package specification only, that&#8217;s supported by <a href="http://pldoc.sourceforge.net/maven-site/">PLDoc</a>. Hence the private functions are treated like second-class citizens and left undocumented.</p>



<p><strong>4. Private functions cannot be unit-tested</strong></p>



<p>I&#8217;m not really a testing advocate. But as a developer, I&#8217;d like to know if my code works. I have to run it somehow. Usually more than once to get a working result. Hence I create scripts or unit tests. It is not possible to unit test the private functions directly. They have to be tested through public functions <code>get_sum</code> and <code>get_cross_sum</code>. In this case I&#8217;d like to test the private function <code>to_int_table</code> directly.</p>



<p>The <code>accessible_by_clause</code>&nbsp;can address issues 2, 3 and 4 without implicitly extending the API.</p>



<h2 class="wp-block-heading">Package-Level <code>accessible_by_clause</code></h2>



<p>In Oracle Database 12c Release 1, the accessible_by_clause was introduced on the package level. This allows us to move the private functions from the package <code>math</code> into a dedicated package <code>math_internal</code> with restricted access.  Here&#8217;s the refactoring 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">4) using accessible_by_clause on package level</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE PACKAGE the_api.math_internal  
   ACCESSIBLE BY (PACKAGE the_api.math, PACKAGE the_api.test_math_internal) 
AS
   /**
   * Calculates the sum of all integers in a collection.
   *
   * @param in_integers collection of integers to be summarized
   * @returns sum, NULL if collection is empty
   */
   FUNCTION get_sum(
     in_integers IN sys.ora_mining_number_nt
   ) RETURN INTEGER DETERMINISTIC;

   /**
   * Finds integer tokens in string.
   *
   * @param in_integers string containing integers to be tokenized
   * @param in_pattern regular expression for integers
   * @returns table of integers
   */
    FUNCTION to_int_table(
      in_integers IN VARCHAR2,
      in_pattern  IN VARCHAR2 DEFAULT '[0-9]+'
   ) RETURN sys.ora_mining_number_nt DETERMINISTIC;
END math_internal;
/

CREATE OR REPLACE PACKAGE the_api.math AS
   /**
   * Calculates the sum of all integers found in a string.
   *
   * @param in_integers string containing integers to be summarized
   * @returns sum, NULL if no integers are found
   */
   FUNCTION get_sum(
      in_integers IN VARCHAR2
   ) RETURN INTEGER DETERMINISTIC;

   /**
   * Calculates the digit sum of an integer.
   *
   * @param in_integer input integer to calculate cross sum from 
   * @returns cross sum, NULL if input is NULL
   */
   FUNCTION get_cross_sum(
      in_integer IN INTEGER
   ) RETURN INTEGER DETERMINISTIC;
END math;
/
" 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">PACKAGE</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.math_internal</span><span style="color: #D4D4D4">  </span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">   ACCESSIBLE BY (</span><span style="color: #569CD6">PACKAGE</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.math,</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">PACKAGE</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.test_math_internal)</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #569CD6">AS</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">   * Calculates the sum of all integers in a collection.</span></span>
<span class="line"><span style="color: #6A9955">   *</span></span>
<span class="line"><span style="color: #6A9955">   * @param in_integers collection of integers to be summarized</span></span>
<span class="line"><span style="color: #6A9955">   * @returns sum, NULL if collection is empty</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_sum</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">     in_integers </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> sys.ora_mining_number_nt</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">INTEGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">   * Finds integer tokens in string.</span></span>
<span class="line"><span style="color: #6A9955">   *</span></span>
<span class="line"><span style="color: #6A9955">   * @param in_integers string containing integers to be tokenized</span></span>
<span class="line"><span style="color: #6A9955">   * @param in_pattern regular expression for integers</span></span>
<span class="line"><span style="color: #6A9955">   * @returns table of integers</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">to_int_table</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_integers </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      in_pattern  </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">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;[0-9]+&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">   ) </span><span style="color: #C586C0">RETURN</span><span style="color: #D4D4D4"> sys.ora_mining_number_nt </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> math_internal;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">PACKAGE</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.math</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">   * Calculates the sum of all integers found in a string.</span></span>
<span class="line"><span style="color: #6A9955">   *</span></span>
<span class="line"><span style="color: #6A9955">   * @param in_integers string containing integers to be summarized</span></span>
<span class="line"><span style="color: #6A9955">   * @returns sum, NULL if no integers are found</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_sum</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_integers </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</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">INTEGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">   * Calculates the digit sum of an integer.</span></span>
<span class="line"><span style="color: #6A9955">   *</span></span>
<span class="line"><span style="color: #6A9955">   * @param in_integer input integer to calculate cross sum from </span></span>
<span class="line"><span style="color: #6A9955">   * @returns cross sum, NULL if input is NULL</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_cross_sum</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_integer </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTEGER</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">INTEGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> math;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span></code></pre></div>



<p>The <code>accessible_by_clause</code> defined on line 2 restricts access to the package <code>math</code> and the package <code>test_math_internal</code>.  It is important to note that the units referenced in the <code>accessible_by_clause</code> are not checked for existence when compiling PL/SQL definitions, hence it is perfectly fine to list PL/SQL units in the <code>accessible_by_clause</code> which might not exist in a production environment, such as the utPLSQL unit test package <code>test_math_internal</code>.</p>



<p>With this change, I address the previously mentioned issues 2, 3 and 4.</p>



<ul class="wp-block-list">
<li>There are no private functions anymore, hence the order in the code is irrelevant</li>



<li>All functions are documented</li>



<li>All functions can be unit-tested</li>
</ul>



<p>Looks good, right? Yes and no. This change created some new issues.</p>



<p><strong>5. Splitting code that belongs together</strong></p>



<p>The original <code>math</code> the package was reasonably small and contained the whole processing logic. Now the package is divided into two packages and the code is spread into 4 files in the VCS (2 package specification files and 2 package body files).  This accessiblity_clause is driving my PL/SQL code structure. This might be good in some cases, but in this case, I do not like it.</p>



<p><strong>6. Accessibility per package leads to more code splitting</strong></p>



<p>Remember I just wanted to unit-test the function to_int_table. Now I can also unit-test the function <code>get_sum</code> since it is defined in the same package. It would look incomplete, if my unit tests would not cover <code>get_sum</code>, right? So, if I want to express that <code>get_sum</code> does not need an explicit unit test, I have to split the package <code>math_internal</code> further. For example into <code>math_internal1</code> and <code>math_internal2</code> and only the one containing the function <code>to_int_table</code> will have an accessor for the test package. This clearly shows that the granularity of the <code>accessible_by_clause</code> is too coarse-grained.</p>



<p> We can address these issues with an <code>accessible_by_clause</code> on the unit level.</p>



<h2 class="wp-block-heading">Unit-Level <code>accessible_by_clause</code></h2>



<p>Since Oracle Database 12c Release 2 the <code>accessible_by_clause</code> can be defined per package suprogram. This allows us to keep all subprograms in one package while addressing all previously described issues.&nbsp;Here&#8217;s the refactoring 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) using accessible_by_clause on unit level (specification)</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE PACKAGE the_api.math AS
   /**
   * Calculates the sum of all integers found in a string.
   *
   * @param in_integers string containing integers to be summarized
   * @returns sum, NULL if no integers are found
   */
   FUNCTION get_sum(
      in_integers IN VARCHAR2
   ) RETURN INTEGER DETERMINISTIC;

   /**
   * Calculates the digit sum of an integer.
   *
   * @param in_integer input integer to calculate cross sum from 
   * @returns cross sum, NULL if input is NULL
   */
   FUNCTION get_cross_sum(
      in_integer IN INTEGER
   ) RETURN INTEGER DETERMINISTIC;

   /**
   * Calculates the sum of all integers in a collection.
   *
   * @param in_integers collection of integers to be summarized
   * @returns sum, NULL if collection is empty
   */
   FUNCTION get_sum(
     in_integers IN sys.ora_mining_number_nt
   ) RETURN INTEGER DETERMINISTIC 
   ACCESSIBLE BY (PACKAGE the_api.math);

   /**
   * Finds integer tokens in string.
   *
   * @param in_integers string containing integers to be tokenized
   * @param in_pattern regular expression for integers
   * @returns table of integers
   */
    FUNCTION to_int_table(
      in_integers IN VARCHAR2,
      in_pattern  IN VARCHAR2 DEFAULT '[0-9]+'
   ) RETURN sys.ora_mining_number_nt DETERMINISTIC
   ACCESSIBLE BY (PACKAGE the_api.math, PACKAGE the_api.test_math);
END math;
/" 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">PACKAGE</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.math</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">   * Calculates the sum of all integers found in a string.</span></span>
<span class="line"><span style="color: #6A9955">   *</span></span>
<span class="line"><span style="color: #6A9955">   * @param in_integers string containing integers to be summarized</span></span>
<span class="line"><span style="color: #6A9955">   * @returns sum, NULL if no integers are found</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_sum</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_integers </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</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">INTEGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">   * Calculates the digit sum of an integer.</span></span>
<span class="line"><span style="color: #6A9955">   *</span></span>
<span class="line"><span style="color: #6A9955">   * @param in_integer input integer to calculate cross sum from </span></span>
<span class="line"><span style="color: #6A9955">   * @returns cross sum, NULL if input is NULL</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_cross_sum</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_integer </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTEGER</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">INTEGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">   * Calculates the sum of all integers in a collection.</span></span>
<span class="line"><span style="color: #6A9955">   *</span></span>
<span class="line"><span style="color: #6A9955">   * @param in_integers collection of integers to be summarized</span></span>
<span class="line"><span style="color: #6A9955">   * @returns sum, NULL if collection is empty</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_sum</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">     in_integers </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> sys.ora_mining_number_nt</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">INTEGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4"> </span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">   ACCESSIBLE BY (</span><span style="color: #569CD6">PACKAGE</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.math);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">   * Finds integer tokens in string.</span></span>
<span class="line"><span style="color: #6A9955">   *</span></span>
<span class="line"><span style="color: #6A9955">   * @param in_integers string containing integers to be tokenized</span></span>
<span class="line"><span style="color: #6A9955">   * @param in_pattern regular expression for integers</span></span>
<span class="line"><span style="color: #6A9955">   * @returns table of integers</span></span>
<span class="line"><span style="color: #6A9955">   */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">to_int_table</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_integers </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      in_pattern  </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">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;[0-9]+&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">   ) </span><span style="color: #C586C0">RETURN</span><span style="color: #D4D4D4"> sys.ora_mining_number_nt </span><span style="color: #569CD6">DETERMINISTIC</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">   ACCESSIBLE BY (</span><span style="color: #569CD6">PACKAGE</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.math,</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">PACKAGE</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.test_math);</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> math;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p>On line 31 the access to the overloaded function <code>get_sum</code> is restricted to this package. It&#8217;s semantically clear that this function cannot be unit-tested. On line 44 access to the function to_int_table is restricted to this package and the package test_math. Hence it is possible to unit-test this function in the package test_math.  The package math is not split up and the access to the original private functions is properly protected.</p>



<p>The package body looks quite similar to the original one. I&#8217;ve just put the access-restricted units at the bottom, to match the order and the signature in the specification.</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">6) using accessible_by_clause on unit level (body)</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE PACKAGE BODY the_api.math AS
   FUNCTION get_sum(in_integers IN VARCHAR2) RETURN INTEGER DETERMINISTIC IS
   BEGIN
      RETURN math.get_sum(math.to_int_table(in_integers));
   END get_sum;

   FUNCTION get_cross_sum(in_integer IN INTEGER) RETURN INTEGER DETERMINISTIC IS
   BEGIN
      RETURN math.get_sum(math.to_int_table(to_char(in_integer), '[0-9]'));       
   END get_cross_sum;

   FUNCTION get_sum(
      in_integers IN sys.ora_mining_number_nt
   ) RETURN INTEGER DETERMINISTIC
      ACCESSIBLE BY (PACKAGE the_api.math)
   IS
      l_result INTEGER;
   BEGIN
      SELECT sum(column_value)
        INTO l_result
        FROM table(in_integers);
      RETURN l_result;
   END get_sum;

   FUNCTION to_int_table(
      in_integers IN VARCHAR2,
      in_pattern  IN VARCHAR2 DEFAULT '[0-9]+'
   ) RETURN sys.ora_mining_number_nt DETERMINISTIC 
      ACCESSIBLE BY (PACKAGE the_api.math, PACKAGE the_api.test_math)
   IS
      l_result sys.ora_mining_number_nt := sys.ora_mining_number_nt();
      l_pos    INTEGER := 1;
      l_int    INTEGER;
   BEGIN
      <<integer_tokens&gt;&gt;
      LOOP
         l_int := to_number(regexp_substr(in_integers, in_pattern, 1, l_pos));
         EXIT integer_tokens WHEN l_int IS NULL;
         l_result.EXTEND;
         l_result(l_pos) := l_int;
         l_pos := l_pos + 1;
      END LOOP integer_tokens;
      RETURN l_result;
   END to_int_table;
END math;
/" 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">PACKAGE BODY</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.math</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">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_sum</span><span style="color: #D4D4D4">(in_integers </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: #C586C0">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</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: #C586C0">RETURN</span><span style="color: #D4D4D4"> math.get_sum(math.to_int_table(in_integers));</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> get_sum;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_cross_sum</span><span style="color: #D4D4D4">(in_integer </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">) </span><span style="color: #C586C0">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</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: #C586C0">RETURN</span><span style="color: #D4D4D4"> math.get_sum(math.to_int_table(</span><span style="color: #DCDCAA">to_char</span><span style="color: #D4D4D4">(in_integer), </span><span style="color: #CE9178">&#39;[0-9]&#39;</span><span style="color: #D4D4D4">));       </span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> get_cross_sum;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_sum</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_integers </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> sys.ora_mining_number_nt</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">INTEGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">DETERMINISTIC</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">      ACCESSIBLE BY (</span><span style="color: #569CD6">PACKAGE</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.math)</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">l_result</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">;</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: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">sum</span><span style="color: #D4D4D4">(column_value)</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_result</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">table</span><span style="color: #D4D4D4">(in_integers);</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">l_result</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> get_sum;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">to_int_table</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_integers </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      in_pattern  </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">DEFAULT</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;[0-9]+&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">   ) </span><span style="color: #C586C0">RETURN</span><span style="color: #D4D4D4"> sys.ora_mining_number_nt </span><span style="color: #569CD6">DETERMINISTIC</span><span style="color: #D4D4D4"> </span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">      ACCESSIBLE BY (</span><span style="color: #569CD6">PACKAGE</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.math,</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">PACKAGE</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.test_math)</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">l_result</span><span style="color: #D4D4D4"> sys.ora_mining_number_nt := sys.ora_mining_number_nt();</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">l_pos</span><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INTEGER</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">l_int</span><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;&lt;integer_tokens&gt;&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">LOOP</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #9CDCFE">l_int</span><span style="color: #D4D4D4"> := </span><span style="color: #DCDCAA">to_number</span><span style="color: #D4D4D4">(regexp_substr(in_integers, in_pattern, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">l_pos</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">EXIT</span><span style="color: #D4D4D4"> integer_tokens </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">l_int</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS NULL</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #9CDCFE">l_result</span><span style="color: #DCDCAA">.EXTEND</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #9CDCFE">l_result</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">l_pos</span><span style="color: #D4D4D4">) := </span><span style="color: #9CDCFE">l_int</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #9CDCFE">l_pos</span><span style="color: #D4D4D4"> := </span><span style="color: #9CDCFE">l_pos</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">END LOOP</span><span style="color: #D4D4D4"> integer_tokens;</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">l_result</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> to_int_table;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> math;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p>Taking about unit testing without showing a unit test is a bit inauthentic. So, here is the utPLSQL test package:</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">7) utPLSQL unit tests</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE PACKAGE the_api.test_math IS
   --%suite

   --%test
   PROCEDURE get_sum_1;

   --%test
   PROCEDURE get_sum_2;
 
   --%test
   PROCEDURE get_cross_sum_1;

   --%test
   PROCEDURE get_cross_sum_2;

   --%test
   PROCEDURE to_int_table_1;

   --%test
   PROCEDURE to_int_table_2;
END test_math;
/

CREATE OR REPLACE PACKAGE BODY the_api.test_math IS
   PROCEDURE get_sum_1 IS
   BEGIN
      ut.expect(42).to_equal(the_api.math.get_sum('What is the sum of 5, 7, 13 and 17?'));
   END get_sum_1;
   
   PROCEDURE get_sum_2 IS
   BEGIN
      ut.expect(CAST(NULL AS INTEGER)).to_equal(the_api.math.get_sum('What is the sum?'));
   END get_sum_2; 

   PROCEDURE get_cross_sum_1 IS
   BEGIN
      ut.expect(42).to_equal(the_api.math.get_cross_sum(3456789));
   END get_cross_sum_1;
   
   PROCEDURE get_cross_sum_2 IS
   BEGIN
      ut.expect(CAST(NULL AS INTEGER)).to_equal(the_api.math.get_cross_sum(NULL));
   END get_cross_sum_2;

   PROCEDURE to_int_table_1 IS
      l_expected sys.ora_mining_number_nt;
      l_actual   sys.ora_mining_number_nt;
   BEGIN
      l_expected := sys.ora_mining_number_nt(5, 7, 13, 17);
      l_actual := math.to_int_table('What is the sum of 5, 7, 13 and 17?');
      ut.expect(anydata.convertCollection(l_expected)).to_equal(anydata.convertCollection(l_actual));
   END to_int_table_1;

   PROCEDURE to_int_table_2 IS
      l_expected sys.ora_mining_number_nt;
      l_actual   sys.ora_mining_number_nt;
   BEGIN
      l_expected := sys.ora_mining_number_nt();
      l_actual := math.to_int_table(NULL);
      ut.expect(anydata.convertCollection(l_expected)).to_equal(anydata.convertCollection(l_actual));
   END to_int_table_2;
END test_math;
/" 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">PACKAGE</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.test_math</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--%suite</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--%test</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_sum_1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--%test</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_sum_2</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: #6A9955">--%test</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_cross_sum_1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--%test</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_cross_sum_2</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--%test</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">to_int_table_1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--%test</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">to_int_table_2</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> test_math;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">PACKAGE BODY</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">the_api.test_math</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_sum_1</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">      ut.expect(</span><span style="color: #B5CEA8">42</span><span style="color: #D4D4D4">).to_equal(the_api.math.get_sum(</span><span style="color: #CE9178">&#39;What is the sum of 5, 7, 13 and 17?&#39;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> get_sum_1;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_sum_2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">      ut.expect(</span><span style="color: #DCDCAA">CAST</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">)).to_equal(the_api.math.get_sum(</span><span style="color: #CE9178">&#39;What is the sum?&#39;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> get_sum_2; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_cross_sum_1</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">      ut.expect(</span><span style="color: #B5CEA8">42</span><span style="color: #D4D4D4">).to_equal(the_api.math.get_cross_sum(</span><span style="color: #B5CEA8">3456789</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> get_cross_sum_1;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_cross_sum_2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">      ut.expect(</span><span style="color: #DCDCAA">CAST</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">)).to_equal(the_api.math.get_cross_sum(</span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> get_cross_sum_2;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">to_int_table_1</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">l_expected</span><span style="color: #D4D4D4"> sys.ora_mining_number_nt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">l_actual</span><span style="color: #D4D4D4">   sys.ora_mining_number_nt;</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: #9CDCFE">l_expected</span><span style="color: #D4D4D4"> := sys.ora_mining_number_nt(</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">13</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">17</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">l_actual</span><span style="color: #D4D4D4"> := math.to_int_table(</span><span style="color: #CE9178">&#39;What is the sum of 5, 7, 13 and 17?&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      ut.expect(anydata.convertCollection(</span><span style="color: #9CDCFE">l_expected</span><span style="color: #D4D4D4">)).to_equal(anydata.convertCollection(</span><span style="color: #9CDCFE">l_actual</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> to_int_table_1;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">to_int_table_2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">l_expected</span><span style="color: #D4D4D4"> sys.ora_mining_number_nt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">l_actual</span><span style="color: #D4D4D4">   sys.ora_mining_number_nt;</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: #9CDCFE">l_expected</span><span style="color: #D4D4D4"> := sys.ora_mining_number_nt();</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">l_actual</span><span style="color: #D4D4D4"> := math.to_int_table(</span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      ut.expect(anydata.convertCollection(</span><span style="color: #9CDCFE">l_expected</span><span style="color: #D4D4D4">)).to_equal(anydata.convertCollection(</span><span style="color: #9CDCFE">l_actual</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> to_int_table_2;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> test_math;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p>Running utPLSQL tests is easy, see:</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">8) running utPLSQL tests</span><span role="button" tabindex="0" data-code="SET SERVEROUTPUT ON SIZE UNLIMITED
EXECUTE ut.run('THE_API.TEST_MATH');

test_math
  get_sum_1 [.004 sec]
  get_sum_2 [.004 sec]
  get_cross_sum_1 [.004 sec]
  get_cross_sum_2 [.004 sec]
  to_int_table_1 [.009 sec]
  to_int_table_2 [.007 sec]
 
Finished in .034975 seconds
6 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)
 


PL/SQL procedure successfully completed." 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"> SERVEROUTPUT </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> SIZE UNLIMITED</span></span>
<span class="line"><span style="color: #D4D4D4">EXECUTE ut.run(</span><span style="color: #CE9178">&#39;THE_API.TEST_MATH&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">test_math</span></span>
<span class="line"><span style="color: #D4D4D4">  get_sum_1 [.</span><span style="color: #B5CEA8">004</span><span style="color: #D4D4D4"> sec]</span></span>
<span class="line"><span style="color: #D4D4D4">  get_sum_2 [.</span><span style="color: #B5CEA8">004</span><span style="color: #D4D4D4"> sec]</span></span>
<span class="line"><span style="color: #D4D4D4">  get_cross_sum_1 [.</span><span style="color: #B5CEA8">004</span><span style="color: #D4D4D4"> sec]</span></span>
<span class="line"><span style="color: #D4D4D4">  get_cross_sum_2 [.</span><span style="color: #B5CEA8">004</span><span style="color: #D4D4D4"> sec]</span></span>
<span class="line"><span style="color: #D4D4D4">  to_int_table_1 [.</span><span style="color: #B5CEA8">009</span><span style="color: #D4D4D4"> sec]</span></span>
<span class="line"><span style="color: #D4D4D4">  to_int_table_2 [.</span><span style="color: #B5CEA8">007</span><span style="color: #D4D4D4"> sec]</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">Finished </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> .</span><span style="color: #B5CEA8">034975</span><span style="color: #D4D4D4"> seconds</span></span>
<span class="line"><span style="color: #B5CEA8">6</span><span style="color: #D4D4D4"> tests, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> failed, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> errored, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> disabled, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> warning(s)</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">PL/</span><span style="color: #569CD6">SQL</span><span style="color: #D4D4D4"> procedure successfully completed.</span></span></code></pre></div>



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



<p>Start using the <code>accessible_by_clause</code>. But using the <code>accessible_by_clause</code> should not drive the way you structure your PL/SQL code. It certainly should not lead to a code-splitting avalanche. Hence I favour the definition of the <code>accessible_by_clause</code> on the subprogram level.</p>
<p>The post <a href="https://www.salvis.com/blog/2018/05/06/why-and-how-using-the-accessible_by_clause/">Why and How Using the accessible_by_clause</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.salvis.com/blog/2018/05/06/why-and-how-using-the-accessible_by_clause/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Accessible PL/SQL Programs in Oracle Database 18c</title>
		<link>https://www.salvis.com/blog/2018/04/30/accessible-pl-sql-programs-in-oracle-database-18c/</link>
		
		<dc:creator><![CDATA[Philipp Salvisberg]]></dc:creator>
		<pubDate>Mon, 30 Apr 2018 16:10:41 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[accessible_by_clause]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">https://www.salvis.com/blog/?p=8230</guid>

					<description><![CDATA[<p>I&#8217;ve recently installed plscope-utils&#160;in an Oracle Database 18c instance. A package body using the SYS.UTL_XML.ParseQuery&#160;function failed to compile. The error message was: PLS-00306: wrong number or types of arguments in call to &#8216;PARSEQUERY&#8217;. Fixing that was easy. I just had to pass the new mandatory currUid parameter. But then I&#8217;ve got the<span class="excerpt-hellip"> […]</span></p>
<p>The post <a href="https://www.salvis.com/blog/2018/04/30/accessible-pl-sql-programs-in-oracle-database-18c/">Accessible PL/SQL Programs in Oracle Database 18c</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>I&#8217;ve recently installed <a href="https://github.com/PhilippSalvisberg/plscope-utils">plscope-utils</a>&nbsp;in an Oracle Database 18c instance. A package body using the <code>SYS.UTL_XML.ParseQuery</code>&nbsp;function failed to compile. The error message was: PLS-00306: wrong number or types of arguments in call to &#8216;PARSEQUERY&#8217;. Fixing that was easy. I just had to pass the new mandatory <code>currUid</code> parameter. But then I&#8217;ve got the next error message.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>PLS-00904: insufficient privilege to access object PARSEQUERY.</p>
</blockquote>



<p>The excerpt of the <code>SYS.UTL_XML</code> package specification reveals the cause of this error.</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">Excerpt from SYS.UTL_XML</span><span role="button" tabindex="0" data-code="-- PARSEQUERY: Parse a SQL query and return in a CLOB as XML
-- PARAMS:
--      currUid         - UID of current user
--      schema          - schem to use for parse
--      sqltext         - the text of the query
--      lobloc          - a LOB locator to receive the parsed value

PROCEDURE parseQuery   (currUid IN NUMBER,
                        schema  IN VARCHAR2,
                        sqltext IN CLOB,
                        lobloc  IN OUT NOCOPY CLOB
                       )
  ACCESSIBLE BY (PACKAGE SYS.DBMS_METADATA);" 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: #6A9955">-- PARSEQUERY: Parse a SQL query and return in a CLOB as XML</span></span>
<span class="line"><span style="color: #6A9955">-- PARAMS:</span></span>
<span class="line"><span style="color: #6A9955">--      currUid         - UID of current user</span></span>
<span class="line"><span style="color: #6A9955">--      schema          - schem to use for parse</span></span>
<span class="line"><span style="color: #6A9955">--      sqltext         - the text of the query</span></span>
<span class="line"><span style="color: #6A9955">--      lobloc          - a LOB locator to receive the parsed value</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">parseQuery</span><span style="color: #D4D4D4">   (currUid </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NUMBER</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                        schema  </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                        sqltext </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">CLOB</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                        lobloc  </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">OUT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NOCOPY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">CLOB</span></span>
<span class="line"><span style="color: #D4D4D4">                       )</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">  ACCESSIBLE BY (</span><span style="color: #569CD6">PACKAGE</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">SYS.DBMS_METADATA);</span></span></code></pre></div>



<p>The <code><a href="https://docs.oracle.com/en/database/oracle/oracle-database/18/lnpls/ACCESSIBLE-BY-clause.html#GUID-9720619C-9862-4123-96E7-3E85F240FF36">accessible_by_clause</a></code>&nbsp;on line 13 restricts the access of the procedure <code>parseQuery</code> to the package <code>SYS.DBMS_METADATA</code>. It looks like Oracle started to use this 12.1 feature in 12.2 and is tightening its APIs with new releases.</p>



<p>That&#8217;s good. For me, an accessor is comparable to a constraint in a data model. A constraint describes a part of a model in a machine-readable way so that it can be enforced and visualized efficiently. An accessor is just a constraint for a named PL/SQL unit. The accessible-by-lists help plan upgrade projects, validate role concepts/implementations or support development tasks such as generating <a href="https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/10">utPLSQL</a> unit test stubs for a PL/SQL package (ignoring inaccessible subprograms).</p>



<p>However, currently, it is not that easy to get information about PL/SQL units and subprograms which are restricted by an accessible_by_clause.  There is no Oracle data dictionary view or API exposing this data. The Oracle enhancement request 27871459 addresses this issue. If you have an Oracle support account, please open an SR and add your CSI to this enhancement request. This should be a well-known task for an Oracle support engineer.</p>



<p>I&#8217;ve created a script named <code><a href="https://gist.github.com/PhilippSalvisberg/33ed7740d767a23b5b5d34ac79ee1a73#file-procedure_accessors-sql">procedure_accessors.sql</a></code> to query accessors for all PL/SQL units and their subprograms in Oracle-maintained schemas of an Oracle Database instance. The result has the granularity of the Oracle data dictionary view dba_procedures. Usually, I would use the result of the named query <code>procedure_accessors</code> directly, but for this blog post, I&#8217;ve done some aggregation and introduced the column accessor_list containing a comma-separated list of all accessors of a procedure.</p>



<p>Please note, that this query requires an Oracle Database 12c Release 2 (12.2) instance or newer.</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);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">Query Accessors (procedure_accessors.sql)</span><span role="button" tabindex="0" data-code="WITH
   --
   -- remove multi-line comments from source
   --
   FUNCTION remove_ml_comments (in_source IN CLOB) RETURN CLOB IS
   BEGIN 
      RETURN regexp_replace(in_source, '/\*.*?\*/', NULL, 1, 0, 'n');
   END remove_ml_comments;
   --
   -- remove single-line comments from source
   --
   FUNCTION remove_sl_comments (in_source IN CLOB) RETURN CLOB IS
   BEGIN 
      RETURN regexp_replace(in_source, '--.*');
   END remove_sl_comments;
   --
   -- remove simple string literals from source
   --
   FUNCTION remove_simple_string_literals (in_source IN CLOB) RETURN CLOB IS
   BEGIN 
      RETURN regexp_replace(in_source, q'['.*?']', NULL, 1, 0, 'n');
   END remove_simple_string_literals;
   --
   -- remove quoted string literals from source
   -- supporting the following quote_delimiter pairs only: (), {}, [], <&gt;, $, ##, @@, ££, &quot;&quot;, //, ||, !!, ++, ~~
   --
   FUNCTION remove_quoted_string_literals (
      in_source IN CLOB
   ) RETURN CLOB IS
      co_pattern CONSTANT VARCHAR2(200) :=
         q'[n?q'((\(.*?\))|(\{.*?\})|(\[.*?\])|(<.*?&gt;)|(\$.*?\$)|(#.*?#)|(@.*?@)|(£.*?£)|(&quot;.*?&quot;)|(/.*?/)|(\|.*?\|)|(!.*?!)|(\+.*?\+)|(~.*?~))']';
   BEGIN
      RETURN regexp_replace(in_source, co_pattern, NULL, 1, 0, 'in');
   END remove_quoted_string_literals;
   --
   -- remove all string literals and comments from source
   --
   FUNCTION remove_all (in_source IN CLOB) RETURN CLOB IS
      l_clob CLOB := in_source;
   BEGIN 
      l_clob := remove_sl_comments(l_clob);
      l_clob := remove_quoted_string_literals(l_clob);
      l_clob := remove_simple_string_literals(l_clob);
      l_clob := remove_ml_comments(l_clob);
      return l_clob;
   END remove_all;
   --
   -- get subprogram associated with the accessible_by_clause in JSON format, e.g.
   --    {
   --       &quot;id&quot;: 5,
   --       &quot;type&quot;: &quot;PROCEDURE&quot;,
   --       &quot;name&quot;: &quot;parseQuery&quot;,
   --    }
   --
   -- return NULL if accessible_by_clause is for the PL/SQL unit
   --
   FUNCTION get_subprogram(
      in_object_type VARCHAR2,
      in_source      CLOB,
      in_pos         INTEGER
   ) RETURN VARCHAR2 IS
      l_subprogram json_object_t;
      co_pattern   CONSTANT VARCHAR2(100 CHAR) := '(function|procedure)(\s+)(&quot;?[a-zA-Z0-9_#$]+&quot;?)';
      l_source     CLOB;
      l_count      INTEGER;
      l_match      VARCHAR2(4000 CHAR);
   BEGIN
      l_subprogram := json_object_t();
      IF in_object_type NOT IN ('FUNCTION', 'PROCEDURE') THEN
         l_source := regexp_replace(substr(in_source, 1, in_pos - 1), 'accessible\s+by\s*\(.*?\)', NULL, 1, 0, 'in');
         l_count := regexp_count(l_source, co_pattern, 1, 'in');
         IF l_count &gt; 0 THEN
            l_match := regexp_substr(l_source, co_pattern, 1, l_count, 'in');
            l_subprogram.put('id', l_count);
            l_subprogram.put('type', regexp_substr(l_match, co_pattern, 1, 1, 'in', 1));
            l_subprogram.put('name', regexp_substr(l_match, co_pattern, 1, 1, 'in', 3));
         END IF;
      END IF;
      RETURN l_subprogram.to_string();
   END get_subprogram;
   --
   -- get the list of subprograms and its accessors as JSON array, e.g.
   --    [
   --        {
   --            &quot;id&quot;: 5,
   --            &quot;type&quot;: &quot;PROCEDURE&quot;,
   --            &quot;name&quot;: &quot;parseQuery&quot;,
   --            &quot;accessors&quot;: [
   --                {
   --                    &quot;unit_kind&quot;: &quot;PACKAGE&quot;,
   --                    &quot;schema&quot;: &quot;SYS&quot;,
   --                    &quot;unit_name&quot;: &quot;DBMS_METADATA&quot;
   --                }
   --            ]
   --        }
   --    ]
   --
   FUNCTION get_accessors(
      in_object_type          VARCHAR2,
      in_source               CLOB,
      in_accessible_by_count  INTEGER
   ) RETURN CLOB IS
      co_full_clause_pattern CONSTANT VARCHAR2(100 CHAR) := 'accessible\s+by\s*\(.*?\)';
      co_accessor_pattern    CONSTANT VARCHAR2(200 CHAR) := 
         '(\(|,)(\s*)(function|procedure|package|trigger|type)?(\s*)(&quot;?[a-zA-Z0-9_#$]+&quot;?\s*\.)?(&quot;?[a-zA-Z0-9_#$]+&quot;?)';
      l_subprograms          json_array_t;
      l_subprogram           json_object_t;
      l_full_clause          VARCHAR2(4000 CHAR);
      l_accessors            json_array_t;
      l_accessor             json_object_t;
      l_pos                  INTEGER;
      l_accessor_count       INTEGER;
   BEGIN
      l_subprograms := json_array_t();
      <<accessible_by_clauses&gt;&gt;
      FOR i in 1 .. in_accessible_by_count LOOP
         l_pos := regexp_instr(in_source, co_full_clause_pattern, 1, i, 0, 'in');
         l_subprogram := json_object_t.parse(get_subprogram(in_object_type, in_source, l_pos));
         l_full_clause := regexp_substr(in_source, co_full_clause_pattern, 1, i, 'in');
         l_accessor_count := regexp_count(l_full_clause, co_accessor_pattern, 1, 'in');
         l_accessors := json_array_t();
         <<accessors&gt;&gt;
         FOR j in 1 .. l_accessor_count LOOP
            l_accessor := json_object_t();
            l_accessor.put('unit_kind', regexp_substr(l_full_clause, co_accessor_pattern, 1, j, 'in', 3));
            l_accessor.put('schema', replace(regexp_substr(l_full_clause, co_accessor_pattern, 1, j, 'in', 5),'.'));
            l_accessor.put('unit_name', regexp_substr(l_full_clause, co_accessor_pattern, 1, j, 'in', 6));
            l_accessors.append(l_accessor);
         END LOOP accessors;
         l_subprogram.put('accessors', l_accessors);
         l_subprograms.append(l_subprogram);
      END LOOP accessible_by_clauses;
      return l_subprograms.to_clob();
   END get_accessors;
   --
   -- ensure identifier matches case sensitive name in Orace data dictionary 
   --
   FUNCTION fix_identifier (in_identifier IN VARCHAR2) RETURN VARCHAR2 IS
      l_identifier VARCHAR2(128 CHAR);
   BEGIN
      IF in_identifier LIKE '&quot;%&quot;' THEN
         l_identifier := substr(in_identifier, 2, length(in_identifier) - 2);
      ELSE
         l_identifier := upper(in_identifier);
      END IF;
      RETURN l_identifier;
   END fix_identifier;
   --
   -- possible PL/SQL units with an accessible_by_clause (optimization step)
   -- false positives when keyword 'accessible' is not used in a accessible_by_clause
   --
   candidates AS (
      SELECT /*+ no_merge */ 
             s.owner, s.type AS object_type, s.name AS object_name, u.oracle_maintained
        FROM dba_users u
        JOIN dba_source s
          ON u.username = s.owner
       WHERE s.type IN ('FUNCTION', 'PROCEDURE', 'PACKAGE', 'TYPE')
         AND lower(text) LIKE '%accessible%'
       GROUP BY s.owner, s.type, s.name, u.oracle_maintained
   ),
   --
   -- extend result with source code (unmodified)
   --
   original_sources AS (
      SELECT owner, object_type, object_name, oracle_maintained,
             sys.dbms_metadata.get_ddl(
                schema      =&gt; owner,
                object_type =&gt; CASE object_type
                                  WHEN 'PACKAGE' THEN
                                     'PACKAGE_SPEC'
                                  WHEN 'TYPE' THEN
                                     'TYPE_SPEC'
                                  ELSE 
                                     object_type
                               END,
                name        =&gt; object_name
             ) AS source_code
        FROM candidates 
   ),
   --
   -- remove comments and string literals from source code to simplify parsing
   --
   reduced_sources AS (
      SELECT owner, 
             object_type, 
             object_name,
             oracle_maintained,
             remove_all(source_code) AS source_code
        FROM original_sources
   ),
   --
   -- extend result with number of accessible_by_clauses in source
   --
   counts AS (
      SELECT owner, 
             object_type, 
             object_name, 
             source_code,
             oracle_maintained,
             regexp_count(source_code, 'accessible\s+by\s*\(.*?\)', 1, 'in') accessible_by_count
        FROM reduced_sources
   ),
   --
   -- produce a row for every accessor and extend results by accessor related columns
   --
   procedure_accessors AS (
      SELECT c.owner,
             c.object_type,
             c.object_name,
             c.oracle_maintained,
             upper(a.subprogram_type)             AS subprogram_type,
             fix_identifier(a.subprogram_name)    AS procedure_name,
             coalesce(a.subprogram_id, 0)         AS subprogram_id,
             upper(a.accessor_unit_kind)          AS accessor_unit_kind,
             fix_identifier(a.accessor_schema)    AS accessor_schema,
             fix_identifier(a.accessor_unit_name) AS accessor_unit_name
        FROM counts c
       CROSS JOIN JSON_TABLE(
                get_accessors(c.object_type, c.source_code, c.accessible_by_count), 
                '$[*]' columns (
                   subprogram_type VARCHAR2(30 CHAR)  PATH '$.type',
                   subprogram_name VARCHAR2(128 CHAR) PATH '$.name',
                   subprogram_id   INTEGER            PATH '$.id',
                   nested path '$.accessors[*]' columns (
                      accessor_unit_kind VARCHAR2(30 CHAR)  PATH '$.unit_kind',
                      accessor_schema    VARCHAR2(128 CHAR) PATH '$.schema',
                      accessor_unit_name VARCHAR2(128 CHAR) PATH '$.unit_name'
                   )
                )
             ) a
       WHERE c.accessible_by_count &gt; 0 
   ),
   --
   -- produce compact accessor column, remove duplicates from overloaded subprograms
   --
   aggr_procedure_accessors_base AS (
      SELECT DISTINCT 
             owner, 
             object_type, 
             object_name, 
             procedure_name,
             accessor_unit_kind,
             accessor_schema,
             accessor_unit_name,
             CASE
                WHEN accessor_unit_kind IS NOT NULL THEN
                   accessor_unit_kind || ' '
             END || 
             CASE
                WHEN accessor_schema IS NOT NULL THEN
                   accessor_schema || '.'
             END ||
             accessor_unit_name AS accessor,
             oracle_maintained
        FROM procedure_accessors
   ),
   --
   -- aggregated result per subprogram with accessor_list containing comma separated list of all accessors
   --
   aggr_procedure_accessors AS (
      SELECT owner, 
             object_type, 
             object_name, 
             procedure_name, 
             listagg (accessor, ', ') WITHIN GROUP(ORDER BY accessor) AS accessor_list 
        FROM aggr_procedure_accessors_base
       WHERE oracle_maintained = 'Y'
       GROUP BY owner, object_type, object_name, procedure_name
       ORDER BY owner, object_type, object_name, procedure_name
   )
-- main
SELECT *
  FROM aggr_procedure_accessors
/" 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: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- remove multi-line comments from source</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> remove_ml_comments (in_source </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> CLOB) </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">   </span><span style="color: #569CD6">BEGIN</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4"> regexp_replace(in_source, </span><span style="color: #CE9178">&#39;/\*.*?\*/&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</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: #569CD6">END</span><span style="color: #D4D4D4"> remove_ml_comments;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- remove single-line comments from source</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> remove_sl_comments (in_source </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> CLOB) </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">   </span><span style="color: #569CD6">BEGIN</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4"> regexp_replace(in_source, </span><span style="color: #CE9178">&#39;--.*&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> remove_sl_comments;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- remove simple string literals from source</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> remove_simple_string_literals (in_source </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> CLOB) </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">   </span><span style="color: #569CD6">BEGIN</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4"> regexp_replace(in_source, q</span><span style="color: #CE9178">&#39;[&#39;</span><span style="color: #D4D4D4">.*?</span><span style="color: #CE9178">&#39;]&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</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: #569CD6">END</span><span style="color: #D4D4D4"> remove_simple_string_literals;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- remove quoted string literals from source</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- supporting the following quote_delimiter pairs only: (), {}, [], &lt;&gt;, $, ##, @@, ££, &quot;&quot;, //, ||, !!, ++, ~~</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> remove_quoted_string_literals (</span></span>
<span class="line"><span style="color: #D4D4D4">      in_source </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> CLOB</span></span>
<span class="line"><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">      co_pattern CONSTANT </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">) :=</span></span>
<span class="line"><span style="color: #D4D4D4">         q</span><span style="color: #CE9178">&#39;[n?q&#39;</span><span style="color: #D4D4D4">((\(.*?\))|(\{.*?\})|(\[.*?\])|(&lt;.*?&gt;)|(\$.*?\$)|(#.*?#)|(@.*?@)|(£.*?£)|(</span><span style="color: #CE9178">&quot;.*?&quot;</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 style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4"> regexp_replace(in_source, co_pattern, </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;in&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> remove_quoted_string_literals;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- remove all string literals and comments from source</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> remove_all (in_source </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> CLOB) </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_clob CLOB := in_source;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">BEGIN</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">      l_clob := remove_sl_comments(l_clob);</span></span>
<span class="line"><span style="color: #D4D4D4">      l_clob := remove_quoted_string_literals(l_clob);</span></span>
<span class="line"><span style="color: #D4D4D4">      l_clob := remove_simple_string_literals(l_clob);</span></span>
<span class="line"><span style="color: #D4D4D4">      l_clob := remove_ml_comments(l_clob);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> l_clob;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> remove_all;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- get subprogram associated with the accessible_by_clause in JSON format, e.g.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--    {</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--       &quot;id&quot;: 5,</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--       &quot;type&quot;: &quot;PROCEDURE&quot;,</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--       &quot;name&quot;: &quot;parseQuery&quot;,</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--    }</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- return NULL if accessible_by_clause is for the PL/SQL unit</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> get_subprogram(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_object_type </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      in_source      CLOB,</span></span>
<span class="line"><span style="color: #D4D4D4">      in_pos         </span><span style="color: #569CD6">INTEGER</span></span>
<span class="line"><span style="color: #D4D4D4">   ) </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">      l_subprogram json_object_t;</span></span>
<span class="line"><span style="color: #D4D4D4">      co_pattern   CONSTANT </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 style="color: #CE9178">&#39;(function|procedure)(\s+)(&quot;?[a-zA-Z0-9_#$]+&quot;?)&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_source     CLOB;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_count      </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_match      </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">4000</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: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">      l_subprogram := json_object_t();</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> in_object_type </span><span style="color: #569CD6">NOT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> (</span><span style="color: #CE9178">&#39;FUNCTION&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;PROCEDURE&#39;</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">         l_source := regexp_replace(substr(in_source, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, in_pos - </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">), </span><span style="color: #CE9178">&#39;accessible\s+by\s*\(.*?\)&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">NULL</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;in&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">         l_count := regexp_count(l_source, co_pattern, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;in&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> l_count &gt; </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">            l_match := regexp_substr(l_source, co_pattern, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, l_count, </span><span style="color: #CE9178">&#39;in&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            l_subprogram.put(</span><span style="color: #CE9178">&#39;id&#39;</span><span style="color: #D4D4D4">, l_count);</span></span>
<span class="line"><span style="color: #D4D4D4">            l_subprogram.put(</span><span style="color: #CE9178">&#39;type&#39;</span><span style="color: #D4D4D4">, regexp_substr(l_match, co_pattern, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;in&#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">            l_subprogram.put(</span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">, regexp_substr(l_match, co_pattern, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;in&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4"> l_subprogram.to_string();</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> get_subprogram;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- get the list of subprograms and its accessors as JSON array, e.g.</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--    [</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--        {</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--            &quot;id&quot;: 5,</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--            &quot;type&quot;: &quot;PROCEDURE&quot;,</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--            &quot;name&quot;: &quot;parseQuery&quot;,</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--            &quot;accessors&quot;: [</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--                {</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--                    &quot;unit_kind&quot;: &quot;PACKAGE&quot;,</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--                    &quot;schema&quot;: &quot;SYS&quot;,</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--                    &quot;unit_name&quot;: &quot;DBMS_METADATA&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--                }</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--            ]</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--        }</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--    ]</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> get_accessors(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_object_type          </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      in_source               CLOB,</span></span>
<span class="line"><span style="color: #D4D4D4">      in_accessible_by_count  </span><span style="color: #569CD6">INTEGER</span></span>
<span class="line"><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">      co_full_clause_pattern CONSTANT </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 style="color: #CE9178">&#39;accessible\s+by\s*\(.*?\)&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      co_accessor_pattern    CONSTANT </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">200</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: #CE9178">&#39;(\(|,)(\s*)(function|procedure|package|trigger|type)?(\s*)(&quot;?[a-zA-Z0-9_#$]+&quot;?\s*\.)?(&quot;?[a-zA-Z0-9_#$]+&quot;?)&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_subprograms          json_array_t;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_subprogram           json_object_t;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_full_clause          </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">4000</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">      l_accessors            json_array_t;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_accessor             json_object_t;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_pos                  </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      l_accessor_count       </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">      l_subprograms := json_array_t();</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;&lt;accessible_by_clauses&gt;&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">FOR</span><span style="color: #D4D4D4"> i </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> .. in_accessible_by_count </span><span style="color: #569CD6">LOOP</span></span>
<span class="line"><span style="color: #D4D4D4">         l_pos := regexp_instr(in_source, co_full_clause_pattern, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, i, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;in&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">         l_subprogram := json_object_t.parse(get_subprogram(in_object_type, in_source, l_pos));</span></span>
<span class="line"><span style="color: #D4D4D4">         l_full_clause := regexp_substr(in_source, co_full_clause_pattern, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, i, </span><span style="color: #CE9178">&#39;in&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">         l_accessor_count := regexp_count(l_full_clause, co_accessor_pattern, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;in&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">         l_accessors := json_array_t();</span></span>
<span class="line"><span style="color: #D4D4D4">         &lt;&lt;accessors&gt;&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">FOR</span><span style="color: #D4D4D4"> j </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> .. l_accessor_count </span><span style="color: #569CD6">LOOP</span></span>
<span class="line"><span style="color: #D4D4D4">            l_accessor := json_object_t();</span></span>
<span class="line"><span style="color: #D4D4D4">            l_accessor.put(</span><span style="color: #CE9178">&#39;unit_kind&#39;</span><span style="color: #D4D4D4">, regexp_substr(l_full_clause, co_accessor_pattern, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, j, </span><span style="color: #CE9178">&#39;in&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">            l_accessor.put(</span><span style="color: #CE9178">&#39;schema&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #DCDCAA">replace</span><span style="color: #D4D4D4">(regexp_substr(l_full_clause, co_accessor_pattern, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, j, </span><span style="color: #CE9178">&#39;in&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">5</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">            l_accessor.put(</span><span style="color: #CE9178">&#39;unit_name&#39;</span><span style="color: #D4D4D4">, regexp_substr(l_full_clause, co_accessor_pattern, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, j, </span><span style="color: #CE9178">&#39;in&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">6</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">            l_accessors.append(l_accessor);</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">LOOP</span><span style="color: #D4D4D4"> accessors;</span></span>
<span class="line"><span style="color: #D4D4D4">         l_subprogram.put(</span><span style="color: #CE9178">&#39;accessors&#39;</span><span style="color: #D4D4D4">, l_accessors);</span></span>
<span class="line"><span style="color: #D4D4D4">         l_subprograms.append(l_subprogram);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">LOOP</span><span style="color: #D4D4D4"> accessible_by_clauses;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> l_subprograms.to_clob();</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> get_accessors;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- ensure identifier matches case sensitive name in Orace data dictionary </span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">FUNCTION</span><span style="color: #D4D4D4"> fix_identifier (in_identifier </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"> </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IS</span></span>
<span class="line"><span style="color: #D4D4D4">      l_identifier </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</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: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4"> in_identifier </span><span style="color: #569CD6">LIKE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;&quot;%&quot;&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">         l_identifier := substr(in_identifier, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">length</span><span style="color: #D4D4D4">(in_identifier) - </span><span style="color: #B5CEA8">2</span><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">         l_identifier := </span><span style="color: #DCDCAA">upper</span><span style="color: #D4D4D4">(in_identifier);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">RETURN</span><span style="color: #D4D4D4"> l_identifier;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> fix_identifier;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- possible PL/SQL units with an accessible_by_clause (optimization step)</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- false positives when keyword &#39;accessible&#39; is not used in a accessible_by_clause</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   candidates </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"> </span><span style="color: #6A9955">/*+ no_merge */</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">             s.owner, s.type </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> object_type, s.name </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> object_name, u.oracle_maintained</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> dba_users u</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">JOIN</span><span style="color: #D4D4D4"> dba_source s</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> u.username = s.owner</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> s.type </span><span style="color: #569CD6">IN</span><span style="color: #D4D4D4"> (</span><span style="color: #CE9178">&#39;FUNCTION&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;PROCEDURE&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;PACKAGE&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;TYPE&#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"> </span><span style="color: #DCDCAA">lower</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">LIKE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;%accessible%&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">GROUP BY</span><span style="color: #D4D4D4"> s.owner, s.type, s.name, u.oracle_maintained</span></span>
<span class="line"><span style="color: #D4D4D4">   ),</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- extend result with source code (unmodified)</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   original_sources </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"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, object_type, object_name, oracle_maintained,</span></span>
<span class="line"><span style="color: #D4D4D4">             sys.dbms_metadata.get_ddl(</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">schema</span><span style="color: #D4D4D4">      =&gt; </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                object_type =&gt; </span><span style="color: #569CD6">CASE</span><span style="color: #D4D4D4"> object_type</span></span>
<span class="line"><span style="color: #D4D4D4">                                  </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;PACKAGE&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">                                     </span><span style="color: #CE9178">&#39;PACKAGE_SPEC&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">                                  </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;TYPE&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">                                     </span><span style="color: #CE9178">&#39;TYPE_SPEC&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">                                  </span><span style="color: #569CD6">ELSE</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">                                     object_type</span></span>
<span class="line"><span style="color: #D4D4D4">                               </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">name</span><span style="color: #D4D4D4">        =&gt; object_name</span></span>
<span class="line"><span style="color: #D4D4D4">             ) </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> source_code</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> candidates </span></span>
<span class="line"><span style="color: #D4D4D4">   ),</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- remove comments and string literals from source code to simplify parsing</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   reduced_sources </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"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">             object_type, </span></span>
<span class="line"><span style="color: #D4D4D4">             object_name,</span></span>
<span class="line"><span style="color: #D4D4D4">             oracle_maintained,</span></span>
<span class="line"><span style="color: #D4D4D4">             remove_all(source_code) </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> source_code</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> original_sources</span></span>
<span class="line"><span style="color: #D4D4D4">   ),</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- extend result with number of accessible_by_clauses in source</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   counts </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"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">             object_type, </span></span>
<span class="line"><span style="color: #D4D4D4">             object_name, </span></span>
<span class="line"><span style="color: #D4D4D4">             source_code,</span></span>
<span class="line"><span style="color: #D4D4D4">             oracle_maintained,</span></span>
<span class="line"><span style="color: #D4D4D4">             regexp_count(source_code, </span><span style="color: #CE9178">&#39;accessible\s+by\s*\(.*?\)&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;in&#39;</span><span style="color: #D4D4D4">) accessible_by_count</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> reduced_sources</span></span>
<span class="line"><span style="color: #D4D4D4">   ),</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- produce a row for every accessor and extend results by accessor related columns</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   procedure_accessors </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"> c.owner,</span></span>
<span class="line"><span style="color: #D4D4D4">             c.object_type,</span></span>
<span class="line"><span style="color: #D4D4D4">             c.object_name,</span></span>
<span class="line"><span style="color: #D4D4D4">             c.oracle_maintained,</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #DCDCAA">upper</span><span style="color: #D4D4D4">(a.subprogram_type)             </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> subprogram_type,</span></span>
<span class="line"><span style="color: #D4D4D4">             fix_identifier(a.subprogram_name)    </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">procedure_name</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #DCDCAA">coalesce</span><span style="color: #D4D4D4">(a.subprogram_id, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">)         </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> subprogram_id,</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #DCDCAA">upper</span><span style="color: #D4D4D4">(a.accessor_unit_kind)          </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> accessor_unit_kind,</span></span>
<span class="line"><span style="color: #D4D4D4">             fix_identifier(a.accessor_schema)    </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> accessor_schema,</span></span>
<span class="line"><span style="color: #D4D4D4">             fix_identifier(a.accessor_unit_name) </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> accessor_unit_name</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> counts c</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">CROSS JOIN</span><span style="color: #D4D4D4"> JSON_TABLE(</span></span>
<span class="line"><span style="color: #D4D4D4">                get_accessors(c.object_type, c.source_code, c.accessible_by_count), </span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;$[*]&#39;</span><span style="color: #D4D4D4"> columns (</span></span>
<span class="line"><span style="color: #D4D4D4">                   subprogram_type </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">30</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">CHAR</span><span style="color: #D4D4D4">)  </span><span style="color: #569CD6">PATH</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;$.type&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                   subprogram_name </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">CHAR</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">PATH</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;$.name&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                   subprogram_id   </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">            </span><span style="color: #569CD6">PATH</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;$.id&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                   nested </span><span style="color: #569CD6">path</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;$.accessors[*]&#39;</span><span style="color: #D4D4D4"> columns (</span></span>
<span class="line"><span style="color: #D4D4D4">                      accessor_unit_kind </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">30</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">CHAR</span><span style="color: #D4D4D4">)  </span><span style="color: #569CD6">PATH</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;$.unit_kind&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                      accessor_schema    </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">CHAR</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">PATH</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;$.schema&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                      accessor_unit_name </span><span style="color: #569CD6">VARCHAR2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">CHAR</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">PATH</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;$.unit_name&#39;</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">             ) a</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> c.accessible_by_count &gt; </span><span style="color: #B5CEA8">0</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: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- produce compact accessor column, remove duplicates from overloaded subprograms</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   aggr_procedure_accessors_base </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 DISTINCT</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">             object_type, </span></span>
<span class="line"><span style="color: #D4D4D4">             object_name, </span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #569CD6">procedure_name</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">             accessor_unit_kind,</span></span>
<span class="line"><span style="color: #D4D4D4">             accessor_schema,</span></span>
<span class="line"><span style="color: #D4D4D4">             accessor_unit_name,</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><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"> accessor_unit_kind </span><span style="color: #569CD6">IS NOT NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">                   accessor_unit_kind || </span><span style="color: #CE9178">&#39; &#39;</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> || </span></span>
<span class="line"><span style="color: #D4D4D4">             </span><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"> accessor_schema </span><span style="color: #569CD6">IS NOT NULL</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">                   accessor_schema || </span><span style="color: #CE9178">&#39;.&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4"> ||</span></span>
<span class="line"><span style="color: #D4D4D4">             accessor_unit_name </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> accessor,</span></span>
<span class="line"><span style="color: #D4D4D4">             oracle_maintained</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> procedure_accessors</span></span>
<span class="line"><span style="color: #D4D4D4">   ),</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">-- aggregated result per subprogram with accessor_list containing comma separated list of all accessors</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #6A9955">--</span></span>
<span class="line"><span style="color: #D4D4D4">   aggr_procedure_accessors </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"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">             object_type, </span></span>
<span class="line"><span style="color: #D4D4D4">             object_name, </span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #569CD6">procedure_name</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">             listagg (accessor, </span><span style="color: #CE9178">&#39;, &#39;</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">WITHIN</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">GROUP</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">ORDER BY</span><span style="color: #D4D4D4"> accessor) </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> accessor_list </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> aggr_procedure_accessors_base</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> oracle_maintained = </span><span style="color: #CE9178">&#39;Y&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">GROUP BY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, object_type, object_name, </span><span style="color: #569CD6">procedure_name</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">ORDER BY</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">owner</span><span style="color: #D4D4D4">, object_type, object_name, </span><span style="color: #569CD6">procedure_name</span></span>
<span class="line"><span style="color: #D4D4D4">   )</span></span>
<span class="line"><span style="color: #6A9955">-- main</span></span>
<span class="line"><span style="color: #569CD6">SELECT</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"> aggr_procedure_accessors</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p><a name="result-table"></a>The following result is based on an Oracle Database 18c installation. Use the search box to filter the result table, e.g. for <code>UTL_XML</code> only 3 result rows are shown. I hope it&#8217;s helpful.</p>



<table id="tablepress-11" class="tablepress tablepress-id-11">
<thead>
<tr class="row-1">
	<th class="column-1">Owner</th><th class="column-2">Object Type</th><th class="column-3">Object Name</th><th class="column-4">Procedure Name</th><th class="column-5">Accessor List</th>
</tr>
</thead>
<tbody class="row-striping row-hover">
<tr class="row-2">
	<td class="column-1">APEX_050100</td><td class="column-2">PACKAGE</td><td class="column-3">WWV_FLOW_ADVISOR_CHECKS_INT</td><td class="column-4"></td><td class="column-5">WWV_FLOW_ADVISOR_CHECKS_API</td>
</tr>
<tr class="row-3">
	<td class="column-1">APEX_050100</td><td class="column-2">PACKAGE</td><td class="column-3">WWV_FLOW_APP_INSTALL_INT</td><td class="column-4"></td><td class="column-5">WWV_FLOW_IMP_PARSER, WWV_FLOW_PKG_APP_PARSER</td>
</tr>
<tr class="row-4">
	<td class="column-1">APEX_050100</td><td class="column-2">PACKAGE</td><td class="column-3">WWV_FLOW_REGION_LIST</td><td class="column-4"></td><td class="column-5">WWV_FLOW_REGION_NATIVE</td>
</tr>
<tr class="row-5">
	<td class="column-1">APEX_050100</td><td class="column-2">PACKAGE</td><td class="column-3">WWV_FLOW_SPATIAL_INT</td><td class="column-4"></td><td class="column-5">WWV_FLOW_SPATIAL_API</td>
</tr>
<tr class="row-6">
	<td class="column-1">CTXSYS</td><td class="column-2">PACKAGE</td><td class="column-3">DRIACCHELP</td><td class="column-4"></td><td class="column-5">PACKAGE DRIACC</td>
</tr>
<tr class="row-7">
	<td class="column-1">CTXSYS</td><td class="column-2">PACKAGE</td><td class="column-3">DRIUTL</td><td class="column-4">PARSE_OBJECT_NAME</td><td class="column-5">PACKAGE DRVUTL, PROCEDURE PARSE_OBJECT_NAME</td>
</tr>
<tr class="row-8">
	<td class="column-1">CTXSYS</td><td class="column-2">PACKAGE</td><td class="column-3">DRVODM</td><td class="column-4">SVM_TRAIN</td><td class="column-5">CTXSYS.CTX_CLS</td>
</tr>
<tr class="row-9">
	<td class="column-1">DVSYS</td><td class="column-2">PACKAGE</td><td class="column-3">CONFIGURE_DV_INTERNAL</td><td class="column-4"></td><td class="column-5">PROCEDURE SYS.CONFIGURE_DV</td>
</tr>
<tr class="row-10">
	<td class="column-1">GSMADMIN_INTERNAL</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_GSM_COMMON</td><td class="column-4">GETDBPARAMETERNUM</td><td class="column-5">PACKAGE DBMS_GSM_CLOUDADMIN, PACKAGE DBMS_GSM_COMMON, PACKAGE DBMS_GSM_DBADMIN, PACKAGE DBMS_GSM_POOLADMIN, PACKAGE DBMS_GSM_UTILITY, PACKAGE GGSYS.GGSHARDING, PROCEDURE EXECUTEDDL</td>
</tr>
<tr class="row-11">
	<td class="column-1">GSMADMIN_INTERNAL</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_GSM_COMMON</td><td class="column-4">GETDBPARAMETERSTR</td><td class="column-5">PACKAGE DBMS_GSM_CLOUDADMIN, PACKAGE DBMS_GSM_COMMON, PACKAGE DBMS_GSM_DBADMIN, PACKAGE DBMS_GSM_POOLADMIN, PACKAGE GGSYS.GGSHARDING</td>
</tr>
<tr class="row-12">
	<td class="column-1">GSMADMIN_INTERNAL</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_GSM_COMMON</td><td class="column-4">RESETDBPARAMETER</td><td class="column-5">PACKAGE DBMS_GSM_CLOUDADMIN, PACKAGE DBMS_GSM_COMMON, PACKAGE DBMS_GSM_DBADMIN, PACKAGE DBMS_GSM_POOLADMIN, PACKAGE GGSYS.GGSHARDING</td>
</tr>
<tr class="row-13">
	<td class="column-1">GSMADMIN_INTERNAL</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_GSM_COMMON</td><td class="column-4">SETDBPARAMETER</td><td class="column-5">PACKAGE DBMS_GSM_CLOUDADMIN, PACKAGE DBMS_GSM_COMMON, PACKAGE DBMS_GSM_DBADMIN, PACKAGE DBMS_GSM_POOLADMIN, PACKAGE GGSYS.GGSHARDING</td>
</tr>
<tr class="row-14">
	<td class="column-1">GSMADMIN_INTERNAL</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_GSM_UTILITY</td><td class="column-4">GENERATECHANGELOGENTRY</td><td class="column-5">PACKAGE DBMS_GSM_CLOUDADMIN, PACKAGE DBMS_GSM_COMMON, PACKAGE DBMS_GSM_DBADMIN, PACKAGE DBMS_GSM_POOLADMIN, PACKAGE GGSYS.GGSHARDING</td>
</tr>
<tr class="row-15">
	<td class="column-1">GSMADMIN_INTERNAL</td><td class="column-2">PACKAGE</td><td class="column-3">EXCHANGE</td><td class="column-4"></td><td class="column-5">PACKAGE GSMADMIN_INTERNAL.DBMS_GSM_DBADMIN, PACKAGE SYS.EXCH_TEST</td>
</tr>
<tr class="row-16">
	<td class="column-1">SYS</td><td class="column-2">FUNCTION</td><td class="column-3">ISXMLTYPETABLE_INTERNAL</td><td class="column-4"></td><td class="column-5">ISXMLTYPETABLE</td>
</tr>
<tr class="row-17">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">CDBVIEW_INTERNAL</td><td class="column-4"></td><td class="column-5">PACKAGE SYS.CDBVIEW</td>
</tr>
<tr class="row-18">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_AQADM_INV</td><td class="column-4"></td><td class="column-5">PACKAGE SYS.DBMS_AQADM, SYS.DBMS_AQADM_SYS, SYS.DBMS_AQJMS, SYS.DBMS_AQ_SYS_IMP_INTERNAL, SYS.DBMS_PRVTAQIM, SYS.DBMS_PRVTAQIS, SYS.DBMS_PRVTSQDS, SYS.DBMS_PRVTSQIS</td>
</tr>
<tr class="row-19">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_AQADM_SYSCALLS</td><td class="column-4"></td><td class="column-5">PACKAGE SYS.DBMS_AQADM, SYS.DBMS_AQ, SYS.DBMS_AQADM_INV, SYS.DBMS_AQADM_SYS, SYS.DBMS_AQJMS, SYS.DBMS_AQJMS_INTERNAL, SYS.DBMS_AQ_IMPORT_INTERNAL, SYS.DBMS_AQ_IMP_ZECURITY, SYS.DBMS_AQ_SYS_EXP_INTERNAL, SYS.DBMS_AQ_SYS_IMP_INTERNAL, SYS.DBMS_PRVTAQIM, SYS.DBMS_PRVTAQIP, SYS.DBMS_PRVTAQIS, SYS.DBMS_PRVTSQDS, SYS.DBMS_PRVTSQIS, SYS.DBMS_RULEADM_INTERNAL, SYS.DBMS_RULE_ADM, SYS.DBMS_STREAMS_CONTROL_ADM</td>
</tr>
<tr class="row-20">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_AWR_PROTECTED</td><td class="column-4"></td><td class="column-5">DBMS_AWR_REPORT_LAYOUT, DBMS_SWRF_REPORT_INTERNAL</td>
</tr>
<tr class="row-21">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_EXPORT_EXTENSION_I</td><td class="column-4"></td><td class="column-5">PACKAGE SYS.DBMS_EXPORT_EXTENSION</td>
</tr>
<tr class="row-22">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_ISCHED_CHAIN_CONDITION</td><td class="column-4">DELETE_STEP_NAME_TABLE</td><td class="column-5">PACKAGE DBMS_ISCHED</td>
</tr>
<tr class="row-23">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_JSON0</td><td class="column-4"></td><td class="column-5">PACKAGE XDB.DBMS_JSON</td>
</tr>
<tr class="row-24">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_METADATA_UTIL</td><td class="column-4">SET_MARKER</td><td class="column-5">PACKAGE SYS.DBMS_METADATA_INT</td>
</tr>
<tr class="row-25">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_MVIEW_STATS_INTERNAL</td><td class="column-4"></td><td class="column-5">DBMS_MVIEW_STATS</td>
</tr>
<tr class="row-26">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_PCLXUTIL_INTERNAL</td><td class="column-4"></td><td class="column-5">PACKAGE SYS.DBMS_PCLXUTIL</td>
</tr>
<tr class="row-27">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_PLUGTS</td><td class="column-4">PLTS_NEWDATAFILE</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-28">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_RAT_MASK_INTERNAL</td><td class="column-4"></td><td class="column-5">SYS.DBMS_RAT_MASK</td>
</tr>
<tr class="row-29">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_RECO_SCRIPT_INT</td><td class="column-4"></td><td class="column-5">EXTENDED_DATATYPE_SUPPORT, SYS.DBMS_RECOVERABLE_SCRIPT, SYS.DBMS_RECO_SCRIPT_INVOK, SYS.DBMS_STREAMS, SYS.DBMS_STREAMS_ADM, SYS.DBMS_STREAMS_ADM_IVK, SYS.DBMS_STREAMS_ADM_UTL, SYS.DBMS_STREAMS_ADM_UTL_INVOK, SYS.DBMS_STREAMS_MC, SYS.DBMS_STREAMS_MT, SYS.DBMS_STREAMS_RPC</td>
</tr>
<tr class="row-30">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_RESULT_CACHE_INTERNAL</td><td class="column-4"></td><td class="column-5">DBMS_NETWORK_ACL_ADMIN, RC_INTERNAL_TEST</td>
</tr>
<tr class="row-31">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_SNAPSHOT_KKXRCA</td><td class="column-4"></td><td class="column-5">PACKAGE DBMS_SNAPSHOT</td>
</tr>
<tr class="row-32">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_SODA_UTIL</td><td class="column-4"></td><td class="column-5">PACKAGE SYS.DBMS_SODA, PACKAGE XDB.DBMS_SODA_ADMIN, PACKAGE XDB.DBMS_SODA_DML, PACKAGE XDB.DBMS_SODA_DOM</td>
</tr>
<tr class="row-33">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_SQLTUNE_INTERNAL</td><td class="column-4">EXEC_EMX_TUNING_TASK_CALLOUT</td><td class="column-5">TYPE SYS.WRI$_REPT_SQLT</td>
</tr>
<tr class="row-34">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_SQLTUNE_INTERNAL</td><td class="column-4">I_PROCESS_SQL</td><td class="column-5">PACKAGE SYS.DBMS_SQLDIAG, PACKAGE SYS.DBMS_SQLTCB_INTERNAL, PACKAGE SYS.DBMS_STATS_INTERNAL, PACKAGE SYS.DBMS_WORKLOAD_REPLAY_I, PACKAGE SYS.DBMS_XPLAN</td>
</tr>
<tr class="row-35">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_SQLTUNE_INTERNAL</td><td class="column-4">TEST_PROCESS_SQLSET</td><td class="column-5">PACKAGE SYS.DBMS_STATS</td>
</tr>
<tr class="row-36">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_SQLTUNE_UTIL0</td><td class="column-4">CHECK_DV_ACCESS</td><td class="column-5">PACKAGE SYS.DBMS_SQLTUNE</td>
</tr>
<tr class="row-37">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_SQLTUNE_UTIL1</td><td class="column-4">GET_SEQ_REMOTE</td><td class="column-5">PACKAGE SYS.DBMS_SQLTUNE_INTERNAL</td>
</tr>
<tr class="row-38">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_STATS_INTERNAL</td><td class="column-4">CREATE_TEMP</td><td class="column-5">PACKAGE DBMS_STATS</td>
</tr>
<tr class="row-39">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_STATS_INTERNAL</td><td class="column-4">POPULATE_TEMP_INSERT</td><td class="column-5">PACKAGE DBMS_STATS</td>
</tr>
<tr class="row-40">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_STATS_INTERNAL_AGG</td><td class="column-4"></td><td class="column-5">PACKAGE DBMS_STATS, PACKAGE DBMS_STATS_INTERNAL</td>
</tr>
<tr class="row-41">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_STREAMS_ADM_UTL_INT</td><td class="column-4"></td><td class="column-5">SYS.DBMS_STREAMS_ADM_UTL, SYS.DBMS_STREAMS_MT</td>
</tr>
<tr class="row-42">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_STREAMS_RPC</td><td class="column-4">REMOVE_FILE_RC</td><td class="column-5">REMOVE_FILE</td>
</tr>
<tr class="row-43">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_STREAMS_TBS_INT</td><td class="column-4"></td><td class="column-5">DBMS_FILE_GROUP_UTL_INVOK, DBMS_STREAMS_ADM_UTL, DBMS_STREAMS_MT, DBMS_STREAMS_RPC, DBMS_STREAMS_TABLESPACE_ADM, DBMS_STREAMS_TBS_INT_INVOK</td>
</tr>
<tr class="row-44">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_SUMVDM</td><td class="column-4"></td><td class="column-5">DBMS_DIMENSION, DBMS_SUMMARY</td>
</tr>
<tr class="row-45">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_SYNC_REFRESH_INTERNAL</td><td class="column-4"></td><td class="column-5">DBMS_SYNC_REFRESH</td>
</tr>
<tr class="row-46">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_TRANSFORM_INTERNAL</td><td class="column-4"></td><td class="column-5">PACKAGE SYS.DBMS_TRANSFORM, SYS.DBMS_AQADM, SYS.DBMS_TRANSFORM_EXIMP, SYS.DBMS_TRANSFORM_EXIMP_INTERNAL</td>
</tr>
<tr class="row-47">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_TTS</td><td class="column-4">CONVERTENCRYPTEDDATAFILECOPY</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-48">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_TTS</td><td class="column-4">GET_AFN_DBID</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-49">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_TTS</td><td class="column-4">GET_AFN_DBIDXENDIAN</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-50">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_TTS</td><td class="column-4">PUT_PROTECTED_TSE_KEY</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-51">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_UMF_PROTECTED</td><td class="column-4"></td><td class="column-5">DBMS_ASH_INTERNAL, DBMS_AWR_REPORT_LAYOUT, DBMS_SWRF_REPORT_INTERNAL, DBMS_WORKLOAD_REPOSITORY</td>
</tr>
<tr class="row-52">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_WRR_PROTECTED</td><td class="column-4"></td><td class="column-5">DBMS_RAT_MASK_INTERNAL, DBMS_WORKLOAD_CAPTURE, DBMS_WORKLOAD_REPLAY, DBMS_WORKLOAD_REPLAY_I</td>
</tr>
<tr class="row-53">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_XDB_UTIL</td><td class="column-4"></td><td class="column-5">PACKAGE SYS.XDB_MIGRATESCHEMA, PACKAGE XDB.DBMS_CLOBUTIL, PACKAGE XDB.DBMS_RESCONFIG, PACKAGE XDB.DBMS_XDBZ, PACKAGE XDB.DBMS_XDBZ0, PACKAGE XDB.DBMS_XDB_ADMIN, PACKAGE XDB.DBMS_XEVENT, PACKAGE XDB.DBMS_XMLDOM</td>
</tr>
<tr class="row-54">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_XDS_INT</td><td class="column-4"></td><td class="column-5">PACKAGE SYS.DBMS_XDS</td>
</tr>
<tr class="row-55">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPC$QUEUE_INT</td><td class="column-4">PREPARE_QUEUE_TABLE</td><td class="column-5">PACKAGE SYS.KUPV$FT_INT</td>
</tr>
<tr class="row-56">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPC$QUEUE_INT</td><td class="column-4">SET_DEBUG</td><td class="column-5">PACKAGE SYS.KUPP$PROC</td>
</tr>
<tr class="row-57">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPC$QUE_INT</td><td class="column-4">PREPARE_QUEUE_TABLE</td><td class="column-5">PACKAGE SYS.KUPC$QUEUE_INT</td>
</tr>
<tr class="row-58">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPC$QUE_INT</td><td class="column-4">SET_DEBUG</td><td class="column-5">PACKAGE SYS.KUPC$QUEUE_INT</td>
</tr>
<tr class="row-59">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPD$DATA</td><td class="column-4">SET_DEBUG</td><td class="column-5">PACKAGE SYS.KUPP$PROC</td>
</tr>
<tr class="row-60">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPD$DATA_INT</td><td class="column-4">GET_OPT_PARAM</td><td class="column-5">PACKAGE KUPD$DATA</td>
</tr>
<tr class="row-61">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">ADD_DEVICE</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-62">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">ADD_FILE</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-63">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">ALLOCATE_DEVICE</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-64">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">CHECK_FATAL_ERROR</td><td class="column-5">PACKAGE SYS.KUPD$DATA</td>
</tr>
<tr class="row-65">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">CLOSE_CONTEXT</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-66">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">DELETE_UNUSED_FILE_REFS</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-67">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">FILE_REQUEST</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-68">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">FILE_REQUEST_NAK</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-69">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">FLUSH_LOB</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-70">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">GET_BLKBUF_SIZES</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-71">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">GET_DEFAULT_FILENAME</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-72">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">GET_DUMPFILE_INFO</td><td class="column-5">PACKAGE SYS.DBMS_DATAPUMP</td>
</tr>
<tr class="row-73">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">GET_FILE_LIST</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-74">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">GET_FORMATTED_TIME</td><td class="column-5">PACKAGE SYS.DBMS_DATAPUMP, PACKAGE SYS.DBMS_DATAPUMP_INT, PACKAGE SYS.DBMS_DATAPUMP_UTL, PACKAGE SYS.DBMS_METADATA, PACKAGE SYS.DBMS_METADATA_INT, PACKAGE SYS.DBMS_METADATA_UTIL, PACKAGE SYS.KUPC$QUEUE_INT, PACKAGE SYS.KUPC$QUE_INT, PACKAGE SYS.KUPD$DATA, PACKAGE SYS.KUPD$DATA_INT, PACKAGE SYS.KUPM$MCP, PACKAGE SYS.KUPP$PROC, PACKAGE SYS.KUPU$UTILITIES, PACKAGE SYS.KUPU$UTILITIES_INT, PACKAGE SYS.KUPV$FT, PACKAGE SYS.KUPV$FT_INT, PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-75">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">GET_FULL_FILENAME</td><td class="column-5">PACKAGE SYS.DBMS_DATAPUMP, PACKAGE SYS.DBMS_DATAPUMP_INT, PACKAGE SYS.DBMS_DATAPUMP_UTL</td>
</tr>
<tr class="row-76">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">GET_MAX_CSWIDTH</td><td class="column-5">PACKAGE SYS.DBMS_DATAPUMP, PACKAGE SYS.DBMS_DATAPUMP_INT, PACKAGE SYS.DBMS_DATAPUMP_UTL, PACKAGE SYS.DBMS_METADATA, PACKAGE SYS.DBMS_METADATA_INT, PACKAGE SYS.DBMS_METADATA_UTIL, PACKAGE SYS.KUPC$QUEUE_INT, PACKAGE SYS.KUPC$QUE_INT, PACKAGE SYS.KUPD$DATA, PACKAGE SYS.KUPD$DATA_INT, PACKAGE SYS.KUPM$MCP, PACKAGE SYS.KUPP$PROC, PACKAGE SYS.KUPU$UTILITIES, PACKAGE SYS.KUPU$UTILITIES_INT, PACKAGE SYS.KUPV$FT, PACKAGE SYS.KUPV$FT_INT, PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-77">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">INIT</td><td class="column-5">PACKAGE SYS.KUPM$MCP, PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-78">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">INIT_TDX_STATS</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-79">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">IS_DUMPFILE_SET_CONSISTENT</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-80">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">JOB_MODES</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-81">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">LOCATE_MASTER</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-82">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">MARK_FILES_AS_UNUSABLE</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-83">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">MASTER_TABLE_UNLOAD_STARTED</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-84">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">OPEN_CONTEXT</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-85">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">READ_LOB</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-86">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">RELEASE_FILES</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-87">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">RESET_EOF</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-88">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">SET_DEBUG</td><td class="column-5">PACKAGE SYS.KUPP$PROC</td>
</tr>
<tr class="row-89">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">TERM</td><td class="column-5">PACKAGE SYS.KUPM$MCP, PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-90">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">TRACE</td><td class="column-5">PACKAGE SYS.DBMS_DATAPUMP, PACKAGE SYS.DBMS_DATAPUMP_INT, PACKAGE SYS.DBMS_DATAPUMP_UTL, PACKAGE SYS.DBMS_METADATA, PACKAGE SYS.DBMS_METADATA_INT, PACKAGE SYS.DBMS_METADATA_UTIL, PACKAGE SYS.DBMS_PLUGTS, PACKAGE SYS.DBMS_TTS, PACKAGE SYS.KUPC$QUEUE_INT, PACKAGE SYS.KUPC$QUE_INT, PACKAGE SYS.KUPD$DATA, PACKAGE SYS.KUPD$DATA_INT, PACKAGE SYS.KUPM$MCP, PACKAGE SYS.KUPP$PROC, PACKAGE SYS.KUPU$UTILITIES, PACKAGE SYS.KUPU$UTILITIES_INT, PACKAGE SYS.KUPV$FT, PACKAGE SYS.KUPV$FT_INT, PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-91">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">VERIFY_DUMPFILE_SET</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-92">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE</td><td class="column-4">WRITE_LOB</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-93">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">CLOSE_CONTEXT</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-94">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">CREATE_DUMP_FILE</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-95">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">CREATE_KEY_INFO</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-96">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">DELETE_DUMP_FILE</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-97">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">ENCODE_PWD</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-98">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">EXAMINE_DUMP_FILE</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-99">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">FLUSH_LOB</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-100">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">GET_BLKBUF_SIZES</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-101">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">GET_DEBUG_EVENT</td><td class="column-5">PACKAGE SYS.KUPF$FILE, PACKAGE SYS.UTL_XML</td>
</tr>
<tr class="row-102">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">GET_DEFAULT_CREDENTIAL</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-103">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">GET_DEFAULT_FILENAME</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-104">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">GET_ENCODED_PWD</td><td class="column-5">PACKAGE SYS.KUPF$FILE, PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-105">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">GET_FORMATTED_TIME</td><td class="column-5">PACKAGE SYS.DBMS_DATAPUMP, PACKAGE SYS.DBMS_DATAPUMP_INT, PACKAGE SYS.DBMS_DATAPUMP_UTL, PACKAGE SYS.DBMS_METADATA, PACKAGE SYS.DBMS_METADATA_INT, PACKAGE SYS.DBMS_METADATA_UTIL, PACKAGE SYS.KUPC$QUEUE_INT, PACKAGE SYS.KUPC$QUE_INT, PACKAGE SYS.KUPD$DATA, PACKAGE SYS.KUPD$DATA_INT, PACKAGE SYS.KUPF$FILE, PACKAGE SYS.KUPM$MCP, PACKAGE SYS.KUPP$PROC, PACKAGE SYS.KUPU$UTILITIES, PACKAGE SYS.KUPU$UTILITIES_INT, PACKAGE SYS.KUPV$FT, PACKAGE SYS.KUPV$FT_INT, PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-106">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">GET_FULL_FILENAME</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-107">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">GET_MAX_CSWIDTH</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-108">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">GTOP</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-109">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">INIT</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-110">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">IS_DUMPFILE_A_RESTFILE</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-111">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">OPEN_CONTEXT</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-112">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">PARSE_FILENAME</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-113">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">READ_LOB</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-114">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">RELEASE_FILES</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-115">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">SET_DEBUG</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-116">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">SET_TRANS_PARAMS</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-117">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">TERM</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-118">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">VERIFY_KEY_INFO</td><td class="column-5">PACKAGE SYS.KUPF$FILE, PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-119">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPF$FILE_INT</td><td class="column-4">WRITE_LOB</td><td class="column-5">PACKAGE SYS.KUPF$FILE</td>
</tr>
<tr class="row-120">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPM$MCP</td><td class="column-4">CLOSE_JOB</td><td class="column-5">PACKAGE SYS.DBMS_DATAPUMP</td>
</tr>
<tr class="row-121">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPM$MCP</td><td class="column-4">DISPATCH</td><td class="column-5">PACKAGE SYS.KUPC$QUEUE</td>
</tr>
<tr class="row-122">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPM$MCP</td><td class="column-4">SET_DEBUG</td><td class="column-5">PACKAGE SYS.KUPP$PROC</td>
</tr>
<tr class="row-123">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPP$PROC</td><td class="column-4">CREATE_MASTER_PROCESS</td><td class="column-5">PACKAGE SYS.KUPV$FT</td>
</tr>
<tr class="row-124">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPP$PROC</td><td class="column-4">CREATE_WORKER_PROCESSES</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-125">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPU$UTILITIES</td><td class="column-4">GET_REMOTE_DBLINK_USER</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-126">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPU$UTILITIES</td><td class="column-4">REPLACE_XML_VALUES</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-127">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPU$UTILITIES_INT</td><td class="column-4">CHECK_TBS_FOR_TDECOL_TABS</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-128">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPU$UTILITIES_INT</td><td class="column-4">CREATE_DIRECTORY</td><td class="column-5">PACKAGE SYS.DBMS_DATAPUMP_UTL</td>
</tr>
<tr class="row-129">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPU$UTILITIES_INT</td><td class="column-4">DEBUG</td><td class="column-5">PACKAGE SYS.KUPU$UTILITIES</td>
</tr>
<tr class="row-130">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPU$UTILITIES_INT</td><td class="column-4">DIRECTORY_SCAN</td><td class="column-5">PACKAGE SYS.DBMS_PLUGTS, PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-131">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPU$UTILITIES_INT</td><td class="column-4">GET_DP_UPDATE_LOCK</td><td class="column-5">PACKAGE SYS.DBMS_METADATA, PACKAGE SYS.DBMS_METADATA_DIFF, PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-132">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPU$UTILITIES_INT</td><td class="column-4">GET_PARAMETER_VALUE</td><td class="column-5">PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-133">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPU$UTILITIES_INT</td><td class="column-4">GET_REMOTE_DBLINK_USER</td><td class="column-5">PACKAGE SYS.KUPU$UTILITIES</td>
</tr>
<tr class="row-134">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPU$UTILITIES_INT</td><td class="column-4">INTALGCONV</td><td class="column-5">PACKAGE SYS.DBMS_METADATA_UTIL, PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-135">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPU$UTILITIES_INT</td><td class="column-4">RELEASE_DP_UPDATE_LOCK</td><td class="column-5">PACKAGE SYS.DBMS_METADATA, PACKAGE SYS.DBMS_METADATA_DIFF, PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-136">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPU$UTILITIES_INT</td><td class="column-4">SET_DEBUG</td><td class="column-5">PACKAGE SYS.KUPP$PROC</td>
</tr>
<tr class="row-137">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPV$FT</td><td class="column-4">ATTACH_JOB</td><td class="column-5">PACKAGE SYS.DBMS_DATAPUMP, PACKAGE SYS.KUPM$MCP, PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-138">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPV$FT</td><td class="column-4">OPEN_JOB</td><td class="column-5">PACKAGE SYS.DBMS_DATAPUMP</td>
</tr>
<tr class="row-139">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPV$FT_INT</td><td class="column-4">ACTIVE_CLIENT_COUNT</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-140">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPV$FT_INT</td><td class="column-4">BUILD_MTABLE_INDEXES</td><td class="column-5">PACKAGE SYS.KUPM$MCP</td>
</tr>
<tr class="row-141">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPV$FT_INT</td><td class="column-4">CREATE_NEW_JOB</td><td class="column-5">PACKAGE SYS.KUPV$FT</td>
</tr>
<tr class="row-142">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPV$FT_INT</td><td class="column-4">DEBUG_ENABLED</td><td class="column-5">PACKAGE SYS.KUPV$FT</td>
</tr>
<tr class="row-143">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPV$FT_INT</td><td class="column-4">GET_DEBUG_INFO</td><td class="column-5">PACKAGE SYS.KUPV$FT</td>
</tr>
<tr class="row-144">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPV$FT_INT</td><td class="column-4">ON_BEHALF</td><td class="column-5">PACKAGE SYS.KUPV$FT</td>
</tr>
<tr class="row-145">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPV$FT_INT</td><td class="column-4">SET_DEBUG</td><td class="column-5">PACKAGE SYS.KUPP$PROC</td>
</tr>
<tr class="row-146">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPV$FT_INT</td><td class="column-4">SET_EVENT</td><td class="column-5">PACKAGE SYS.KUPC$QUE_INT, PACKAGE SYS.KUPD$DATA, PACKAGE SYS.KUPP$PROC, PACKAGE SYS.KUPW$WORKER</td>
</tr>
<tr class="row-147">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">KUPW$WORKER</td><td class="column-4">SET_DEBUG</td><td class="column-5">PACKAGE SYS.KUPP$PROC</td>
</tr>
<tr class="row-148">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">OUTLN_PKG_INTERNAL</td><td class="column-4"></td><td class="column-5">PACKAGE SYS.OUTLN_PKG</td>
</tr>
<tr class="row-149">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">PRVT_ACCESS_ADVISOR</td><td class="column-4">SETUP_USER</td><td class="column-5">PACKAGE PRVT_ADVISOR</td>
</tr>
<tr class="row-150">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">UTL_XML</td><td class="column-4">PARSEEXPR</td><td class="column-5">PACKAGE SYS.DBMS_METADATA</td>
</tr>
<tr class="row-151">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">UTL_XML</td><td class="column-4">PARSEQUERY</td><td class="column-5">PACKAGE SYS.DBMS_METADATA</td>
</tr>
<tr class="row-152">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">WWV_DBMS_SQL_APEX_050100</td><td class="column-4"></td><td class="column-5">APEX_050100.WWV_FLOW_DYNAMIC_EXEC, APEX_050100.WWV_FLOW_SESSION_RAS, APEX_050100.WWV_FLOW_UPGRADE</td>
</tr>
<tr class="row-153">
	<td class="column-1">SYS</td><td class="column-2">PACKAGE</td><td class="column-3">XS_DATA_SECURITY_UTIL_INT</td><td class="column-4"></td><td class="column-5">PACKAGE XS_DATA_SECURITY_UTIL</td>
</tr>
<tr class="row-154">
	<td class="column-1">SYS</td><td class="column-2">PROCEDURE</td><td class="column-3">EXECASUSER</td><td class="column-4"></td><td class="column-5">PACKAGE GGSYS.GGSHARDING, PACKAGE GSMADMIN_INTERNAL.DBMS_GSM_CLOUDADMIN, PACKAGE GSMADMIN_INTERNAL.DBMS_GSM_COMMON, PACKAGE GSMADMIN_INTERNAL.DBMS_GSM_DBADMIN, PACKAGE GSMADMIN_INTERNAL.DBMS_GSM_POOLADMIN, PACKAGE GSMADMIN_INTERNAL.DBMS_GSM_UTILITY, PROCEDURE GSMADMIN_INTERNAL.EXECUTEDDL</td>
</tr>
<tr class="row-155">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTADM</td><td class="column-4"></td><td class="column-5">PACKAGE OWM_IEXP_PKG, PACKAGE WMSYS.LT, PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.LTPRIV, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.LTUTIL, PACKAGE WMSYS.LT_CTX_PKG, PACKAGE WMSYS.LT_EXPORT_PKG, PACKAGE WMSYS.OWM_BULK_LOAD_PKG, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_DML_PKG, PACKAGE WMSYS.OWM_DYNSQL_ACCESS, PACKAGE WMSYS.OWM_MIG_PKG, PACKAGE WMSYS.OWM_MP_PKG, PACKAGE WMSYS.UD_TRIGS, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-156">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTAQ</td><td class="column-4"></td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-157">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTDDL</td><td class="column-4"></td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.LTUTIL, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-158">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTDTRG</td><td class="column-4"></td><td class="column-5">PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.OWM_DYNSQL_ACCESS, PACKAGE WMSYS.UD_TRIGS, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-159">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTPRIV</td><td class="column-4"></td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-160">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTRIC</td><td class="column-4">GETVARIABLE_C</td><td class="column-5">PACKAGE WMSYS.OWM_DYNSQL_ACCESS</td>
</tr>
<tr class="row-161">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTRIC</td><td class="column-4">SETVARIABLE</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-162">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTRIC</td><td class="column-4"></td><td class="column-5">PACKAGE OWM_MP_PKG, PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.OWM_BULK_LOAD_PKG, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_DYNSQL_ACCESS, PACKAGE WMSYS.OWM_IEXP_PKG, PACKAGE WMSYS.OWM_MIG_PKG, PACKAGE WMSYS.UD_TRIGS, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-163">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ADDUSERDEFINEDHINT</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-164">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ADDWCP</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-165">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ALLOCATE_UNIQUE</td><td class="column-5">PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.OWM_BULK_LOAD_PKG, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_MIG_PKG, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-166">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ALLOWROWLEVELLOCKING</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-167">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">CHECKADDTOPOGEOLAYERERRORS</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-168">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">CHECKDELTOPOGEOLAYERERRORS</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-169">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">CHECKDOMAININDEXPRIVS</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-170">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">CLEANUPBDDL</td><td class="column-5">PACKAGE WMSYS.OWM_DDL_PKG</td>
</tr>
<tr class="row-171">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">CLEANUPCDDL</td><td class="column-5">PACKAGE WMSYS.OWM_DDL_PKG</td>
</tr>
<tr class="row-172">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">CLEANUPDV</td><td class="column-5">PACKAGE WMSYS.LTDDL</td>
</tr>
<tr class="row-173">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">CLEANUPEV</td><td class="column-5">PACKAGE WMSYS.LTDDL</td>
</tr>
<tr class="row-174">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">CLEANUPMETADATA</td><td class="column-5">PACKAGE WMSYS.LTDDL</td>
</tr>
<tr class="row-175">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">CLEANUPMETADATABYUSER</td><td class="column-5">PACKAGE WMSYS.LTADM, PACKAGE WMSYS.OWM_DYNSQL_ACCESS</td>
</tr>
<tr class="row-176">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">CLEANUPSTALEMETADATA</td><td class="column-5">PACKAGE WMSYS.LT_EXPORT_PKG, PACKAGE WMSYS.OWM_DYNSQL_ACCESS</td>
</tr>
<tr class="row-177">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">CREATEINLISTFROMQUERY</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.OWM_DYNSQL_ACCESS, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-178">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">CREATEPKWHERECLAUSE</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTRIC</td>
</tr>
<tr class="row-179">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">DELETEFULLROLLBACKMARKER</td><td class="column-5">PACKAGE WMSYS.LT_CTX_PKG</td>
</tr>
<tr class="row-180">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">DELETEUNDOCODE</td><td class="column-5">PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.OWM_BULK_LOAD_PKG, PACKAGE WMSYS.OWM_DDL_PKG</td>
</tr>
<tr class="row-181">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">DELETEUNDOCODECHECKPOINTS</td><td class="column-5">PACKAGE WMSYS.LT_CTX_PKG</td>
</tr>
<tr class="row-182">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">DELETEUNDOCODERANGE</td><td class="column-5">PACKAGE WMSYS.LTDDL</td>
</tr>
<tr class="row-183">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">DISALLOWIFWITHVT</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-184">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">EXECEVUNDO</td><td class="column-5">PACKAGE WMSYS.LTDDL</td>
</tr>
<tr class="row-185">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">EXECLOG</td><td class="column-5">PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-186">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">EXECUTESQLLOG</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LT_EXPORT_PKG, PACKAGE WMSYS.OWM_MIG_PKG</td>
</tr>
<tr class="row-187">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">EXISTSBIR</td><td class="column-5">PACKAGE WMSYS.LTRIC</td>
</tr>
<tr class="row-188">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">EXISTSBUR</td><td class="column-5">PACKAGE WMSYS.LTRIC</td>
</tr>
<tr class="row-189">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">EXISTSCONSTRAINT</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-190">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">EXISTSFULLROLLBACKMARKER</td><td class="column-5">PACKAGE WMSYS.LTDDL</td>
</tr>
<tr class="row-191">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">EXISTSTOPOLOGY</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-192">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">FIXTOPOLOGYIMPORT</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-193">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">FIXVTAB_COMPRESS</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-194">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">FIXVTAB_REFRESH</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-195">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">FIXVTAB_ROLLBACK</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-196">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GENFIXCRNONSEQNFRESHINS</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-197">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GENWMCOLSUPDATESTMNT</td><td class="column-5">PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-198">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETBASETABLENAME</td><td class="column-5">PACKAGE WMSYS.LTADM, PACKAGE WMSYS.OWM_IEXP_PKG, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-199">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETBATCHWHERECLAUSES</td><td class="column-5">PACKAGE WMSYS.LTADM, PACKAGE WMSYS.OWM_DYNSQL_ACCESS</td>
</tr>
<tr class="row-200">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETCOLINFO</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.OWM_IEXP_PKG</td>
</tr>
<tr class="row-201">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETCOLLIST</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-202">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETCOLSTR</td><td class="column-5">PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.OWM_BULK_LOAD_PKG, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_IEXP_PKG, PACKAGE WMSYS.UD_TRIGS, PACKAGE WMSYS.WM_DDL_UTIL, WMSYS.OWM_MIG_PKG</td>
</tr>
<tr class="row-203">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETCOLUMNPLUSEXPRESSION</td><td class="column-5">PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-204">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETCRSTATUS</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.OWM_BULK_LOAD_PKG</td>
</tr>
<tr class="row-205">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETCURRENTLOCKINGMODE</td><td class="column-5">PACKAGE WMSYS.LT_CTX_PKG</td>
</tr>
<tr class="row-206">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETCURVER</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.OWM_IEXP_PKG</td>
</tr>
<tr class="row-207">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETDISTINCTOBJECT</td><td class="column-5">PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_MIG_PKG, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-208">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETDISVER</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.OWM_MIG_PKG, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-209">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETHISTOPTION</td><td class="column-5">PACKAGE OWM_IEXP_PKG, PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.OWM_BULK_LOAD_PKG, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-210">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETINDEXTABLE</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTDTRG</td>
</tr>
<tr class="row-211">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETINDEXTABLESPACE</td><td class="column-5">PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.OWM_MIG_PKG, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-212">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETNESTEDCOLUMNVIEW</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-213">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETNESTEDTABLECOLSTR</td><td class="column-5">PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-214">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETNESTEDTABLEMETADATACOLUMNS</td><td class="column-5">PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-215">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETNESTEDTABLETYPE</td><td class="column-5">PACKAGE WMSYS.OWM_DDL_PKG</td>
</tr>
<tr class="row-216">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETNEXTVERSION</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-217">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETNOTNULLCONSTRAINT</td><td class="column-5">PACKAGE WMSYS.OWM_DDL_PKG</td>
</tr>
<tr class="row-218">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETNTPKEYCOLS</td><td class="column-5">PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_MP_PKG</td>
</tr>
<tr class="row-219">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETPKEYINFO</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-220">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETPKEYINFO_VT</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-221">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETPKINDEXINFO</td><td class="column-5">PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.OWM_MIG_PKG, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-222">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETRLSWHERECLAUSE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-223">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETSEQUENCEOPTIONS</td><td class="column-5">PACKAGE WMSYS.OWM_DDL_PKG</td>
</tr>
<tr class="row-224">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETSID</td><td class="column-5">PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LT_CTX_PKG</td>
</tr>
<tr class="row-225">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETSNO</td><td class="column-5">PACKAGE WMSYS.LT_CTX_PKG</td>
</tr>
<tr class="row-226">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETSPACEUSAGE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-227">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETTABLETABLESPACE</td><td class="column-5">PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.OWM_DDL_PKG, WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-228">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETTOPOFEATURETABINFO</td><td class="column-5">PACKAGE WMSYS.LTDTRG</td>
</tr>
<tr class="row-229">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETTOPOINFO</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-230">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETTRIGGERS</td><td class="column-5">PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDTRG</td>
</tr>
<tr class="row-231">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETUDHINT</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.OWM_BULK_LOAD_PKG, PACKAGE WMSYS.OWM_DYNSQL_ACCESS, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-232">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETUNDOCODECLOB</td><td class="column-5">PACKAGE WMSYS.OWM_BULK_LOAD_PKG</td>
</tr>
<tr class="row-233">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETVALIDTIMEOPTION</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_MIG_PKG, PACKAGE WMSYS.OWM_MP_PKG, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-234">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETVARIABLE_R</td><td class="column-5">PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-235">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETVERINDEXNAME</td><td class="column-5">PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_IEXP_PKG, PACKAGE WMSYS.OWM_MP_PKG</td>
</tr>
<tr class="row-236">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETVTID</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_IEXP_PKG, PACKAGE WMSYS.WM_DDL_UTIL, TRIGGER WMSYS.WM$BCT_I_TRIG, TRIGGER WMSYS.WM$CC_I_TRIG, TRIGGER WMSYS.WM$CP_D_TRIG, TRIGGER WMSYS.WM$CP_I_TRIG, TRIGGER WMSYS.WM$CP_U_TRIG, TRIGGER WMSYS.WM$CT_I_TRIG, TRIGGER WMSYS.WM$CT_U_TRIG, TRIGGER WMSYS.WM$HT_I_TRIG, TRIGGER WMSYS.WM$LI_I_TRIG, TRIGGER WMSYS.WM$MT_I_TRIG, TRIGGER WMSYS.WM$NCT_I_TRIG, TRIGGER WMSYS.WM$RLT_I_TRIG, TRIGGER WMSYS.WM$RTT_I_TRIG, TRIGGER WMSYS.WM$RT_D_TRIG, TRIGGER WMSYS.WM$RT_I_TRIG, TRIGGER WMSYS.WM$UDP_I_TRIG, TRIGGER WMSYS.WM$UD_U_TRIG, TRIGGER WMSYS.WM$UI_I_TRIG, TRIGGER WMSYS.WM$VET_I_TRIG, TRIGGER WMSYS.WM$VET_U_TRIG</td>
</tr>
<tr class="row-237">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETWHERECLAUSESTR</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.LT_EXPORT_PKG, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_MIG_PKG, PACKAGE WMSYS.OWM_MP_PKG, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-238">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETWORKSPACELOCKID</td><td class="column-5">PACKAGE WMSYS.LTADM, TRIGGER WMSYS.WM$BCT_I_TRIG, TRIGGER WMSYS.WM$LI_I_TRIG, TRIGGER WMSYS.WM$MGWT_I_TRIG, TRIGGER WMSYS.WM$MPWT_I_TRIG, TRIGGER WMSYS.WM$MT_I_TRIG, TRIGGER WMSYS.WM$MW_I_TRIG, TRIGGER WMSYS.WM$NT_I_TRIG, TRIGGER WMSYS.WM$RWT_I_TRIG, TRIGGER WMSYS.WM$VHT_I_TRIG, TRIGGER WMSYS.WM$VT_I_TRIG, TRIGGER WMSYS.WM$WPT_D_TRIG, TRIGGER WMSYS.WM$WPT_I_TRIG, TRIGGER WMSYS.WM$WPT_U_TRIG, TRIGGER WMSYS.WM$WST_I_TRIG, TRIGGER WMSYS.WM$WT_I_TRIG, WMSYS.LT_CTX_PKG</td>
</tr>
<tr class="row-239">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GETWORKSPACELOCKMODE</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-240">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GET_EXPANDED_NEXTVERS_NP</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-241">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">GRANTOLSPRIVS</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-242">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">HASCRCHILD</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTRIC</td>
</tr>
<tr class="row-243">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">HASDEFERREDCHILD</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-244">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">HASFEATURETABLE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-245">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">HASNESTEDTABLECOLUMN</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-246">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">HASOLSPOLICY</td><td class="column-5">PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-247">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">HASRICCASCADINGCONSTRAINT</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-248">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">HASRICSETNULLCONSTRAINT</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-249">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">HASVIRTUALCOLUMN</td><td class="column-5">PACKAGE WMSYS.LTDTRG</td>
</tr>
<tr class="row-250">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">HASWOOVERWRITEOPTION</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTRIC</td>
</tr>
<tr class="row-251">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">HISTWITHDATETYPE</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDTRG</td>
</tr>
<tr class="row-252">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">HISTWITHDATETYPEEV</td><td class="column-5">PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-253">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">INSERTFULLROLLBACKMARKER</td><td class="column-5">PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.LT_CTX_PKG</td>
</tr>
<tr class="row-254">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">INVERSIONEDSTATE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-255">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ISIMPLICITSP</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-256">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ISLEAFSTATE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-257">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ISMODIFIED</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-258">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ISMODIFIEDINSUBTREE</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.OWM_DYNSQL_ACCESS</td>
</tr>
<tr class="row-259">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ISOBJECTTABLE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-260">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ISSPATIALINSTALLED</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.LT_EXPORT_PKG, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_MIG_PKG</td>
</tr>
<tr class="row-261">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ISSPLITINSUBTREE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-262">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ISTOPOFEATURETABLE</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDTRG</td>
</tr>
<tr class="row-263">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ISTOPOLOGYINDEXTABLE</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.LT_EXPORT_PKG</td>
</tr>
<tr class="row-264">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ISTOPOLOGYRELATIONTABLE</td><td class="column-5">PACKAGE WMSYS.LTDTRG</td>
</tr>
<tr class="row-265">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ISVERSIONEDTABLE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-266">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ISVERSIONENABLEDTOPOLOGY</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-267">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">ISWORKSPACEOWNER</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-268">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">MOVEWMMETADATA</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-269">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">NEEDTOEXECUTETRIGGERS</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-270">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">NUMTRIGGERSTOEXECUTE</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-271">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">PARSESTRINGLIST</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-272">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">POPULATEROWIDRANGES</td><td class="column-5">PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-273">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">PREFIXSTR</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.OWM_DYNSQL_ACCESS, PACKAGE WMSYS.OWM_MIG_PKG, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-274">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">QB_BLOCK_REPLACE</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-275">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">REMOVEUSERDEFINEDHINT</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-276">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">RENAMESAVEPOINT</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-277">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">RENAMEWORKSPACE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-278">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">REQUIRESTRIGGERSONTOPVIEW</td><td class="column-5">PACKAGE WMSYS.LTDTRG</td>
</tr>
<tr class="row-279">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">RESETALLSEQUENCES</td><td class="column-5">PACKAGE WMSYS.LT_EXPORT_PKG</td>
</tr>
<tr class="row-280">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">RESOLVESYNONYM</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTRIC</td>
</tr>
<tr class="row-281">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">RESTARTSEQUENCE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-282">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">SEPARATECLOBINTO2PARTS</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-283">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">SETVARIABLE</td><td class="column-5">PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-284">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">TOPOTABLECHECK</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-285">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">TO_CLOB_</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-286">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">UPDATESDOTOPOMETADATADV</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-287">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">UPDATESDOTOPOMETADATAEV</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-288">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">WM$GETDBCOMPATIBLESTR</td><td class="column-5">PACKAGE WMSYS.OWM_IEXP_PKG</td>
</tr>
<tr class="row-289">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LTUTIL</td><td class="column-4">WRITETOLOG</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.OWM_BULK_LOAD_PKG, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_IEXP_PKG, PACKAGE WMSYS.OWM_MIG_PKG, PACKAGE WMSYS.OWM_MP_PKG, PACKAGE WMSYS.UD_TRIGS, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-290">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">ALLOWDDLOPERATION</td><td class="column-5">PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_DYNSQL_ACCESS</td>
</tr>
<tr class="row-291">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">CHVLTL</td><td class="column-5">PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-292">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">GETLTTABLENAME</td><td class="column-5">WMSYS.LTDTRG</td>
</tr>
<tr class="row-293">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">GETMULTIWORKSPACES</td><td class="column-5">WMSYS.LT</td>
</tr>
<tr class="row-294">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">GETPURGEOPTION</td><td class="column-5">PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-295">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">GETSESSIONATTRIBUTES</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LT_EXPORT_PKG</td>
</tr>
<tr class="row-296">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">GETVARIABLE_B</td><td class="column-5">PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.OWM_DYNSQL_ACCESS</td>
</tr>
<tr class="row-297">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">GETVARIABLE_N</td><td class="column-5">PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.LTUTIL, PACKAGE WMSYS.OWM_DYNSQL_ACCESS</td>
</tr>
<tr class="row-298">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">GETVARIABLE_V</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTAQ, PACKAGE WMSYS.LTUTIL</td>
</tr>
<tr class="row-299">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">GETVTTABLENAME</td><td class="column-5">WMSYS.LTDTRG</td>
</tr>
<tr class="row-300">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETACTIVETIMEFORDML</td><td class="column-5">WMSYS.LT</td>
</tr>
<tr class="row-301">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETCALLSTACKASINVALID</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTUTIL, PACKAGE WMSYS.LT_EXPORT_PKG, PACKAGE WMSYS.OWM_DYNSQL_ACCESS, PACKAGE WMSYS.OWM_MIG_PKG</td>
</tr>
<tr class="row-302">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETCALLSTACKASVALID</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTUTIL, PACKAGE WMSYS.LT_EXPORT_PKG, PACKAGE WMSYS.OWM_DYNSQL_ACCESS, PACKAGE WMSYS.OWM_MIG_PKG</td>
</tr>
<tr class="row-303">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETCOMMITVARS</td><td class="column-5">WMSYS.LT</td>
</tr>
<tr class="row-304">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETCOMPRESSWORKSPACE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-305">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETCONFLICTSTATE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-306">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETCOPYVARS</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-307">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETDIFFVERS</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-308">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETFLIPVERSIONONREFRESH</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-309">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETFREEZESTATUS</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-310">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETIMPORTVARS</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.OWM_DYNSQL_ACCESS</td>
</tr>
<tr class="row-311">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETINSTANT</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.OWM_IEXP_PKG</td>
</tr>
<tr class="row-312">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETLOCKMODE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-313">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETMPROOT</td><td class="column-5">PACKAGE WMSYS.OWM_MP_PKG</td>
</tr>
<tr class="row-314">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETMPWORKSPACE</td><td class="column-5">PACKAGE WMSYS.OWM_MP_PKG</td>
</tr>
<tr class="row-315">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETMULTIWORKSPACES</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-316">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETNEWMPVARS</td><td class="column-5">PACKAGE WMSYS.OWM_MP_PKG</td>
</tr>
<tr class="row-317">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETNEWROOTANCVERSION</td><td class="column-5">PACKAGE WMSYS.OWM_MP_PKG</td>
</tr>
<tr class="row-318">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETOPCONTEXT</td><td class="column-5">PACKAGE WMSYS.LTUTIL</td>
</tr>
<tr class="row-319">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETPOSTVARS</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-320">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETROWLOCKSTATUS</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-321">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETSAVEPOINT</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-322">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETSTATEATTRIBUTES</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-323">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETTABMRGWOREMOVEEVENT</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-324">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETTABMRGWREMOVEEVENT</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-325">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETTABREFRESHEVENT</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-326">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETTRIGGEREVENT</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-327">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETTSINSTANT</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-328">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETUSER</td><td class="column-5">PACKAGE WMSYS.LTPRIV</td>
</tr>
<tr class="row-329">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETVALIDTIME</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-330">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETVALIDTIMEFILTEROFF</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-331">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETVALIDTIMEFILTERON</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-332">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETVARIABLE</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTUTIL, PACKAGE WMSYS.OWM_IEXP_PKG</td>
</tr>
<tr class="row-333">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETVERAFTINSTANT</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-334">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETVERBEFINSTANT</td><td class="column-5">PACKAGE WMSYS.LTADM</td>
</tr>
<tr class="row-335">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETVERSION</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.OWM_IEXP_PKG</td>
</tr>
<tr class="row-336">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETVERSIONANDSTATE</td><td class="column-5">PACKAGE WMSYS.OWM_IEXP_PKG</td>
</tr>
<tr class="row-337">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETWRITERSTATE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-338">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETWSPCMRGWOREMOVEEVENT</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-339">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">SETWSPCMRGWREMOVEEVENT</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-340">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">TO_TIMESTAMP_TZ_</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-341">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">UNSETCOMMITVARS</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-342">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">UNSETCOPYVARS</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-343">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">UNSETIMPORTVARS</td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.OWM_DYNSQL_ACCESS</td>
</tr>
<tr class="row-344">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_CTX_PKG</td><td class="column-4">UNSETPOSTVARS</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-345">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">LT_EXPORT_PKG</td><td class="column-4">EXPORT_SCHEMAS</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-346">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">OWM_ASSERT_PKG</td><td class="column-4"></td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.LTUTIL, PACKAGE WMSYS.LT_EXPORT_PKG, PACKAGE WMSYS.OWM_BULK_LOAD_PKG, PACKAGE WMSYS.OWM_CPKG_PKG, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_DYNSQL_ACCESS, PACKAGE WMSYS.OWM_IEXP_PKG, PACKAGE WMSYS.OWM_MIG_PKG, PACKAGE WMSYS.OWM_MP_PKG, PACKAGE WMSYS.OWM_VSCRIPT_PKG, PACKAGE WMSYS.UD_TRIGS, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-347">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">OWM_BULK_LOAD_PKG</td><td class="column-4"></td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.OWM_DYNSQL_ACCESS</td>
</tr>
<tr class="row-348">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">OWM_CPKG_PKG</td><td class="column-4"></td><td class="column-5">PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.OWM_DYNSQL_ACCESS, PACKAGE WMSYS.OWM_MIG_PKG</td>
</tr>
<tr class="row-349">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">OWM_DDL_PKG</td><td class="column-4"></td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.LTUTIL, PACKAGE WMSYS.LT_EXPORT_PKG, PACKAGE WMSYS.OWM_BULK_LOAD_PKG, PACKAGE WMSYS.OWM_DYNSQL_ACCESS, PACKAGE WMSYS.OWM_MIG_PKG, PACKAGE WMSYS.OWM_MP_PKG, PACKAGE WMSYS.UD_TRIGS, PACKAGE WMSYS.WM_DDL_UTIL</td>
</tr>
<tr class="row-350">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">OWM_DML_PKG</td><td class="column-4"></td><td class="column-5">TRIGGER WMSYS.WM$CP_I_TRIG, TRIGGER WMSYS.WM$CP_U_TRIG, TRIGGER WMSYS.WM$CT_I_TRIG, TRIGGER WMSYS.WM$CT_U_TRIG, TRIGGER WMSYS.WM$EI_I_TRIG, TRIGGER WMSYS.WM$EI_U_TRIG, TRIGGER WMSYS.WM$EV_I_TRIG, TRIGGER WMSYS.WM$HT_I_TRIG, TRIGGER WMSYS.WM$MGWT_I_TRIG, TRIGGER WMSYS.WM$MPWT_I_TRIG, TRIGGER WMSYS.WM$RT_I_TRIG, TRIGGER WMSYS.WM$RWT_I_TRIG, TRIGGER WMSYS.WM$SAV_I_TRIG, TRIGGER WMSYS.WM$UDP_I_TRIG, TRIGGER WMSYS.WM$UD_U_TRIG, TRIGGER WMSYS.WM$UI_I_TRIG, TRIGGER WMSYS.WM$VET_I_TRIG, TRIGGER WMSYS.WM$VET_U_TRIG, TRIGGER WMSYS.WM$VTH_I_TRIG, TRIGGER WMSYS.WM$VTH_U_TRIG, TRIGGER WMSYS.WM$WPT_D_TRIG, TRIGGER WMSYS.WM$WPT_I_TRIG, TRIGGER WMSYS.WM$WPT_U_TRIG, TRIGGER WMSYS.WM$WST_I_TRIG, TRIGGER WMSYS.WM$WT_I_TRIG, TRIGGER WMSYS.WM$WT_U_TRIG</td>
</tr>
<tr class="row-351">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">OWM_IEXP_PKG</td><td class="column-4"></td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.OWM_DYNSQL_ACCESS</td>
</tr>
<tr class="row-352">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">OWM_MIG_PKG</td><td class="column-4">RECOVERMIGRATINGTABLE</td><td class="column-5">PACKAGE WMSYS.LT</td>
</tr>
<tr class="row-353">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">OWM_MP_PKG</td><td class="column-4"></td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTPRIV, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_DYNSQL_ACCESS</td>
</tr>
<tr class="row-354">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">OWM_VSCRIPT_PKG</td><td class="column-4">STARTQUEUE</td><td class="column-5">PACKAGE WMSYS.LT_EXPORT_PKG</td>
</tr>
<tr class="row-355">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">OWM_VSCRIPT_PKG</td><td class="column-4">STOPQUEUE</td><td class="column-5">PACKAGE WMSYS.LT_EXPORT_PKG</td>
</tr>
<tr class="row-356">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">OWM_VSCRIPT_PKG</td><td class="column-4">WM$CONVERTVERSIONSTR</td><td class="column-5">PACKAGE WMSYS.LTUTIL</td>
</tr>
<tr class="row-357">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">OWM_VSCRIPT_PKG</td><td class="column-4">WM$GETDBPARAMETER</td><td class="column-5">PACKAGE WMSYS.LT_CTX_PKG</td>
</tr>
<tr class="row-358">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">UD_TRIGS</td><td class="column-4"></td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.LTDTRG, PACKAGE WMSYS.LTRIC, PACKAGE WMSYS.LTUTIL, PACKAGE WMSYS.LT_EXPORT_PKG, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_DML_PKG, PACKAGE WMSYS.OWM_DYNSQL_ACCESS, PACKAGE WMSYS.OWM_MIG_PKG</td>
</tr>
<tr class="row-359">
	<td class="column-1">WMSYS</td><td class="column-2">PACKAGE</td><td class="column-3">WM_DDL_UTIL</td><td class="column-4"></td><td class="column-5">PACKAGE WMSYS.LT, PACKAGE WMSYS.LTADM, PACKAGE WMSYS.LTDDL, PACKAGE WMSYS.LTUTIL, PACKAGE WMSYS.OWM_DDL_PKG, PACKAGE WMSYS.OWM_DYNSQL_ACCESS, PACKAGE WMSYS.OWM_IEXP_PKG, PACKAGE WMSYS.OWM_MIG_PKG</td>
</tr>
<tr class="row-360">
	<td class="column-1">XDB</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_CLOBUTIL</td><td class="column-4"></td><td class="column-5">PACKAGE XDB.DBMS_XMLDOM, PACKAGE XDB.DBMS_XMLPARSER, PACKAGE XDB.DBMS_XSLPROCESSOR</td>
</tr>
<tr class="row-361">
	<td class="column-1">XDB</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_JSON_INT</td><td class="column-4"></td><td class="column-5">PACKAGE XDB.DBMS_JSON</td>
</tr>
<tr class="row-362">
	<td class="column-1">XDB</td><td class="column-2">PACKAGE</td><td class="column-3">DBMS_SODA_DML</td><td class="column-4"></td><td class="column-5">PACKAGE XDB.DBMS_SODA_ADMIN</td>
</tr>
</tbody>
</table>
<!-- #tablepress-11 from cache -->


<p><em>Updated on 2018-05-01: amended query to produce no subprogram name for standalone procedures and functions (was SYS in two cases); included complete query (procedure_accessors.sql); updated result table.</em></p>



<p><em>Updated on 2018-05-02: amended query to improve multi-line comments and string literals handling (thanks to Jacek Gębal)</em></p>
<p>The post <a href="https://www.salvis.com/blog/2018/04/30/accessible-pl-sql-programs-in-oracle-database-18c/">Accessible PL/SQL Programs in Oracle Database 18c</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
