doc-exports/docs/dws/dev/dws_06_0163.html
Lu, Huayi e6fa411af0 DWS DEV 830.201 version
Reviewed-by: Pruthi, Vineet <vineet.pruthi@t-systems.com>
Co-authored-by: Lu, Huayi <luhuayi@huawei.com>
Co-committed-by: Lu, Huayi <luhuayi@huawei.com>
2024-05-16 07:24:04 +00:00

319 lines
62 KiB
HTML

<a name="EN-US_TOPIC_0000001188110530"></a><a name="EN-US_TOPIC_0000001188110530"></a>
<h1 class="topictitle1">CREATE FUNCTION</h1>
<div id="body8662426"><div class="section" id="EN-US_TOPIC_0000001188110530__sf19a6e4a7497449cb9fdc5a08a7790c4"><h4 class="sectiontitle">Function</h4><p id="EN-US_TOPIC_0000001188110530__a5ea88426f8c04ace96e689cca5adf21e"><strong id="EN-US_TOPIC_0000001188110530__b19912154717328">CREATE FUNCTION</strong> creates a function.</p>
</div>
<div class="section" id="EN-US_TOPIC_0000001188110530__s24b163fdea96420e942036603aa49f8b"><h4 class="sectiontitle">Precautions</h4><ul id="EN-US_TOPIC_0000001188110530__u4acb5866c2ff40a7b583816fe81f66d8"><li id="EN-US_TOPIC_0000001188110530__lb6f46f882b8a40c0911463fb5f93fbd5">The precision values (if any) of the parameters or return values of a function are not checked.</li><li id="EN-US_TOPIC_0000001188110530__li222922262617">When creating a function, you are advised to explicitly specify the schemas of tables in the function definition. Otherwise, the function may fail to be executed.</li><li id="EN-US_TOPIC_0000001188110530__li188401824102819"><strong id="EN-US_TOPIC_0000001188110530__b842352706134759">current_schema</strong> and <strong id="EN-US_TOPIC_0000001188110530__b84235270613482">search_path</strong> specified by <strong id="EN-US_TOPIC_0000001188110530__b842352706135036">SET</strong> during function creation are invalid. <strong id="EN-US_TOPIC_0000001188110530__b842352706135116">search_path</strong> and <strong id="EN-US_TOPIC_0000001188110530__b842352706135121">current_schema</strong> before and after function execution should be the same.</li><li id="EN-US_TOPIC_0000001188110530__lcf7e0d0aa1c545b3861ae5622d08009a">If a function has output parameters, the <strong id="EN-US_TOPIC_0000001188110530__b968751954214">SELECT</strong> statement uses the default values of the output parameters when calling the function. When the <strong id="EN-US_TOPIC_0000001188110530__b66314305428">CALL</strong> statement calls the function, it requires that the output parameter values are adapted to Oracle. When the <strong id="EN-US_TOPIC_0000001188110530__b12883115754217">CALL</strong> statement calls an overloaded PACKAGE function, it can use the default values of the output parameters. For details, see examples in <a href="dws_06_0229.html">CALL</a>.</li><li id="EN-US_TOPIC_0000001188110530__li1395712107414">Only the functions compatible with PostgreSQL or those with the <strong id="EN-US_TOPIC_0000001188110530__b17648163014419">PACKAGE</strong> attribute can be overloaded. After <strong id="EN-US_TOPIC_0000001188110530__b7709112564520">REPLACE</strong> is specified, a new function is created instead of replacing a function if the number of parameters, parameter type, or return value is different.</li><li id="EN-US_TOPIC_0000001188110530__lb4fa34c61fab40309fac66554020e967">You can use the <strong id="EN-US_TOPIC_0000001188110530__b2227170114614">SELECT</strong> statement to specify different parameters using identical functions, but cannot use the <strong id="EN-US_TOPIC_0000001188110530__b1529211395468">CALL</strong> statement to call identical functions without the <strong id="EN-US_TOPIC_0000001188110530__b19884826204710">PACKAGE</strong> attribute because <strong id="EN-US_TOPIC_0000001188110530__b148611349184614">CALL</strong> aligns with Oracle syntax.</li><li id="EN-US_TOPIC_0000001188110530__le2e5d4da767a4587a2ecf41cc6212518">When you create a function, you cannot insert other agg functions out of the avg function or other functions.</li><li id="EN-US_TOPIC_0000001188110530__li1485125135314">In non-logical cluster mode, return values, parameters, and variables cannot be set to the tables of the Node Groups that are not installed in the system by default. The internal statements of SQL functions cannot be executed on such tables.</li><li id="EN-US_TOPIC_0000001188110530__li209850570559">In logical cluster mode, if return values and parameters of the function are user tables, all the tables must be in the same logical cluster. If the function body involves operations on multiple logical cluster tables, the function cannot be set to <strong id="EN-US_TOPIC_0000001188110530__b7847101785115">IMMUTABLE</strong> or <strong id="EN-US_TOPIC_0000001188110530__b3586192018512">SHIPPABLE</strong>, preventing the function from being pushed down to a DN.</li><li id="EN-US_TOPIC_0000001188110530__li594954118412">In logical cluster mode, the parameters and return values of the function cannot use the <strong id="EN-US_TOPIC_0000001188110530__b14102131716529">%type</strong> to reference a table column type. Otherwise, the function will fail to be created.</li><li id="EN-US_TOPIC_0000001188110530__li15356112711020">By default, the permissions to execute new functions are granted to <strong id="EN-US_TOPIC_0000001188110530__b13287441153110">PUBLIC</strong>. For details, see <a href="dws_06_0250.html">GRANT</a>. You can revoke the default execution permissions from <strong id="EN-US_TOPIC_0000001188110530__b7867193953311">PUBLIC</strong> and grant them to other users as needed. To avoid the time window during which new functions can be accessed by all users, create functions in transactions and set function execution permissions.</li></ul>
</div>
<div class="section" id="EN-US_TOPIC_0000001188110530__s87343d68f529414c8cb2d1270b38590f"><h4 class="sectiontitle">Syntax</h4><ul id="EN-US_TOPIC_0000001188110530__uff4cbf6be0b84790a6b0a60fdb773610"><li id="EN-US_TOPIC_0000001188110530__l399327b743c54968ac7aff7616471793">Syntax (compatible with PostgreSQL) for creating a user-defined function:<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188110530__s2bea187b10b64d8cbafc68758c9dab7d"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="k">OR</span><span class="w"> </span><span class="k">REPLACE</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="n">function_name</span><span class="w"> </span>
<span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="err">{</span><span class="w"> </span><span class="n">argname</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="n">argmode</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="n">argtype</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="err">{</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="p">:</span><span class="o">=</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="err">}</span><span class="w"> </span><span class="n">expression</span><span class="w"> </span><span class="p">]</span><span class="err">}</span><span class="w"> </span><span class="p">[,</span><span class="w"> </span><span class="p">...]</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">)</span>
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="k">RETURNS</span><span class="w"> </span><span class="n">rettype</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="k">DETERMINISTIC</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">RETURNS</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="err">{</span><span class="w"> </span><span class="k">column_name</span><span class="w"> </span><span class="n">column_type</span><span class="w"> </span><span class="err">}</span><span class="w"> </span><span class="p">[,</span><span class="w"> </span><span class="p">...]</span><span class="w"> </span><span class="p">)]</span>
<span class="w"> </span><span class="k">LANGUAGE</span><span class="w"> </span><span class="n">lang_name</span><span class="w"> </span>
<span class="w"> </span><span class="p">[</span><span class="w"> </span>
<span class="w"> </span><span class="err">{</span><span class="k">IMMUTABLE</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">STABLE</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">VOLATILE</span><span class="w"> </span><span class="err">}</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="err">{</span><span class="n">SHIPPABLE</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="n">SHIPPABLE</span><span class="err">}</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">WINDOW</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="n">LEAKPROOF</span><span class="w"> </span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="err">{</span><span class="k">CALLED</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="k">INPUT</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">RETURNS</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="k">INPUT</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">STRICT</span><span class="w"> </span><span class="err">}</span><span class="w"> </span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="err">{</span><span class="p">[</span><span class="w"> </span><span class="k">EXTERNAL</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="k">SECURITY</span><span class="w"> </span><span class="k">INVOKER</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="k">EXTERNAL</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="k">SECURITY</span><span class="w"> </span><span class="k">DEFINER</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">AUTHID</span><span class="w"> </span><span class="k">DEFINER</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">AUTHID</span><span class="w"> </span><span class="k">CURRENT_USER</span><span class="err">}</span><span class="w"> </span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="err">{</span><span class="n">FENCED</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="n">FENCED</span><span class="err">}</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="err">{</span><span class="n">PACKAGE</span><span class="err">}</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">COST</span><span class="w"> </span><span class="n">execution_cost</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">ROWS</span><span class="w"> </span><span class="n">result_rows</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">SET</span><span class="w"> </span><span class="n">configuration_parameter</span><span class="w"> </span><span class="err">{</span><span class="w"> </span><span class="err">{</span><span class="k">TO</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">=</span><span class="err">}</span><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">CURRENT</span><span class="w"> </span><span class="err">}}</span>
<span class="w"> </span><span class="p">][...]</span>
<span class="w"> </span><span class="err">{</span>
<span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="s1">'definition'</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="s1">'obj_file'</span><span class="p">,</span><span class="w"> </span><span class="s1">'link_symbol'</span>
<span class="w"> </span><span class="err">}</span>
</pre></div></td></tr></table></div>
</div>
</li><li id="EN-US_TOPIC_0000001188110530__lcb612048e92843939473c5ce44795c46">Oracle syntax of creating a customized function:<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188110530__s37acc7d6c14448ff9cb1c3d1dbfe2b9d"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="k">OR</span><span class="w"> </span><span class="k">REPLACE</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="n">function_name</span><span class="w"> </span>
<span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="err">{</span><span class="w"> </span><span class="n">argname</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="n">argmode</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="n">argtype</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="err">{</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="p">:</span><span class="o">=</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="err">}</span><span class="w"> </span><span class="n">expression</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="err">}</span><span class="w"> </span><span class="p">[,</span><span class="w"> </span><span class="p">...]</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">)</span>
<span class="w"> </span><span class="k">RETURN</span><span class="w"> </span><span class="n">rettype</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="k">DETERMINISTIC</span><span class="w"> </span><span class="p">]</span>
<span class="w"> </span><span class="p">[</span><span class="w"> </span>
<span class="w"> </span><span class="err">{</span><span class="k">IMMUTABLE</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">STABLE</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">VOLATILE</span><span class="w"> </span><span class="err">}</span><span class="w"> </span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="err">{</span><span class="n">SHIPPABLE</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="n">SHIPPABLE</span><span class="err">}</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="err">{</span><span class="n">PACKAGE</span><span class="err">}</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="err">{</span><span class="n">FENCED</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="n">FENCED</span><span class="err">}</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="n">LEAKPROOF</span><span class="w"> </span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="err">{</span><span class="k">CALLED</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="k">INPUT</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">RETURNS</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="k">INPUT</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">STRICT</span><span class="w"> </span><span class="err">}</span><span class="w"> </span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="err">{</span><span class="p">[</span><span class="w"> </span><span class="k">EXTERNAL</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="k">SECURITY</span><span class="w"> </span><span class="k">INVOKER</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="k">EXTERNAL</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="k">SECURITY</span><span class="w"> </span><span class="k">DEFINER</span><span class="w"> </span><span class="o">|</span>
<span class="n">AUTHID</span><span class="w"> </span><span class="k">DEFINER</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">AUTHID</span><span class="w"> </span><span class="k">CURRENT_USER</span>
<span class="err">}</span><span class="w"> </span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">COST</span><span class="w"> </span><span class="n">execution_cost</span><span class="w"> </span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">ROWS</span><span class="w"> </span><span class="n">result_rows</span><span class="w"> </span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">SET</span><span class="w"> </span><span class="n">configuration_parameter</span><span class="w"> </span><span class="err">{</span><span class="w"> </span><span class="err">{</span><span class="k">TO</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">=</span><span class="err">}</span><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">CURRENT</span>
<span class="w"> </span><span class="p">][...]</span><span class="w"> </span>
<span class="w"> </span><span class="err">{</span><span class="w"> </span>
<span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">AS</span>
<span class="err">}</span><span class="w"> </span><span class="n">plsql_body</span>
<span class="o">/</span>
</pre></div></td></tr></table></div>
</div>
</li></ul>
</div>
<div class="section" id="EN-US_TOPIC_0000001188110530__se31d7da8d3c14a418bbb88a3e987d0e7"><h4 class="sectiontitle">Parameter Description</h4><ul id="EN-US_TOPIC_0000001188110530__u480476222ea14505aac91962ea2fdacf"><li id="EN-US_TOPIC_0000001188110530__l77288a7aa397435c93c55f8691710264"><strong id="EN-US_TOPIC_0000001188110530__a41a1c69b855d4da281c36dabb92a341b">OR REPLACE</strong><p id="EN-US_TOPIC_0000001188110530__ad7e4a6c18cee4009921ce4df59b9f1a3">Redefines an existing function.</p>
</li><li id="EN-US_TOPIC_0000001188110530__l014a2ecbae1e492096214306a226eb9c"><strong id="EN-US_TOPIC_0000001188110530__a97b70f79f6ef4540a5617a845471beaa">function_name</strong><p id="EN-US_TOPIC_0000001188110530__ad0850fc0dcda4d89ae77d2732826c56a">Indicates the name of the function to create (optionally schema-qualified).</p>
<p id="EN-US_TOPIC_0000001188110530__a90398004ab1845a58691b9fb84925551">Value range: a string. It must comply with the naming convention.</p>
<div class="note" id="EN-US_TOPIC_0000001188110530__note151921132614"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><p id="EN-US_TOPIC_0000001188110530__p818111113261">If the name of the function to be created is the same as that of a system function, you are advised to specify a schema. When invoking a user-defined function, you need to specify a schema. Otherwise, the system preferentially invokes the system function.</p>
</div></div>
</li><li id="EN-US_TOPIC_0000001188110530__l6783c7510644417a828d0fa3a22cfa8b"><strong id="EN-US_TOPIC_0000001188110530__a9d324aeb4aa041ad9b69f18fc0232a6d">argname</strong><p id="EN-US_TOPIC_0000001188110530__a933cd98d76ae4906bbfdfb61ad4ddffc">Indicates the name of a function parameter.</p>
<p id="EN-US_TOPIC_0000001188110530__a9595f45e3fd0435b9e7af5d063bc9145">Value range: a string. It must comply with the naming convention.</p>
</li><li id="EN-US_TOPIC_0000001188110530__l46c68c25713d43acb2440a2377f6faa6"><strong id="EN-US_TOPIC_0000001188110530__a7ca3c54fb4c64cdaa024cdd2254a7243">argmode</strong><p id="EN-US_TOPIC_0000001188110530__a3d60e0cccf7a42f9bbf681aeb010c301">Indicates the mode of a parameter.</p>
<p id="EN-US_TOPIC_0000001188110530__ab1b7a94e19264ed591ae92aa7343bdfc">Value range: <strong id="EN-US_TOPIC_0000001188110530__b205008405995236">IN</strong>, <strong id="EN-US_TOPIC_0000001188110530__b160558392295236">OUT</strong>, <strong id="EN-US_TOPIC_0000001188110530__b187041373495236">IN OUT</strong>, <strong id="EN-US_TOPIC_0000001188110530__b49447607895236">INOUT</strong>, and <strong id="EN-US_TOPIC_0000001188110530__b68946486595236">VARIADIC</strong>. The default value is <strong id="EN-US_TOPIC_0000001188110530__b52296831395231">IN</strong>. Only the parameter of <strong id="EN-US_TOPIC_0000001188110530__b84235270683019">OUT</strong> mode can be followed by <strong id="EN-US_TOPIC_0000001188110530__b84235270683025">VARIADIC</strong>. The parameters of <strong id="EN-US_TOPIC_0000001188110530__b842352706165619">OUT</strong> and <strong id="EN-US_TOPIC_0000001188110530__b842352706165622">INOUT</strong> cannot be used in function definition of <strong id="EN-US_TOPIC_0000001188110530__b842352706165614">RETURNS TABLE</strong>.</p>
<div class="note" id="EN-US_TOPIC_0000001188110530__n353c2be1dc21432983d3bd425a537ee2"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><p id="EN-US_TOPIC_0000001188110530__af7fc22e360fe4d9683d6dbd0196847b4"><strong id="EN-US_TOPIC_0000001188110530__b15901483463360">VARIADIC</strong> specifies parameters of array types.</p>
</div></div>
</li><li id="EN-US_TOPIC_0000001188110530__lbab41f2ba4874e209dd4e26f240ee656"><strong id="EN-US_TOPIC_0000001188110530__ae85abb4a6c014e3bae83f7108e58d7c6">argtype</strong><p id="EN-US_TOPIC_0000001188110530__a19e35b858fb14d22891513046772bff0">Indicates the data types of the function's parameters.</p>
</li><li id="EN-US_TOPIC_0000001188110530__l49a9aab4cd34408cb2fb9460bbb2c171"><strong id="EN-US_TOPIC_0000001188110530__ab724041d0f5e498a975cfcea9603b6f8">expression</strong><p id="EN-US_TOPIC_0000001188110530__a5002baece4ab4e988cc626acb4a626b3">Indicates the default expression of a parameter.</p>
</li><li id="EN-US_TOPIC_0000001188110530__l5b9dd42854e04c74b9e801d1592bc511"><strong id="EN-US_TOPIC_0000001188110530__adae99b1d498d4a61b1376d529f4aa530">rettype</strong><p id="EN-US_TOPIC_0000001188110530__af4720071c2714fc5a6377801b4d946de">Indicates the return data type.</p>
<p id="EN-US_TOPIC_0000001188110530__a6f3698c7a3c649f889efd08ad350833b">When there is <strong id="EN-US_TOPIC_0000001188110530__en-us_topic_0058965572_b119993609421">OUT</strong> or <strong id="EN-US_TOPIC_0000001188110530__en-us_topic_0058965572_b408853799421">IN OUT</strong> parameter, the <strong id="EN-US_TOPIC_0000001188110530__en-us_topic_0058965572_b324240959421">RETURNS</strong> clause can be omitted. If the clause exists, it must be the same as the result type indicated by the output parameter. If there are multiple output parameters, the value is <strong id="EN-US_TOPIC_0000001188110530__b84235270616529">RECORD</strong>. Otherwise, the value is the same as the type of a single output parameter.</p>
<p id="EN-US_TOPIC_0000001188110530__adeea2747822d44db8cb6380850d077d3">The <strong id="EN-US_TOPIC_0000001188110530__b91060639421">SETOF</strong> modifier indicates that the function will return a set of items, rather than a single item.</p>
</li><li id="EN-US_TOPIC_0000001188110530__l36a8255afaca4dea975e8b7ef176efba"><strong id="EN-US_TOPIC_0000001188110530__a2e33cf7467a342d2afc5fb0338736266">DETERMINISTIC</strong><p id="EN-US_TOPIC_0000001188110530__a643acbab66bf4bd99a36461f6576f2b2">Adapted to Oracle SQL syntax. You are not advised to use it.</p>
</li><li id="EN-US_TOPIC_0000001188110530__lccbceed0661644e1ac4f7fc0a982c481"><strong id="EN-US_TOPIC_0000001188110530__a2ce9641d9dce4d529b9b493cb45d89f4">column_name</strong><p id="EN-US_TOPIC_0000001188110530__a13dcdc666c3b4a97860938df308cfee0">Specifies the column name.</p>
</li><li id="EN-US_TOPIC_0000001188110530__l7b4fce3047fd42ad847d46ee37e695ec"><strong id="EN-US_TOPIC_0000001188110530__a5a69d876db43444797f1c7efb68a1301">column_type</strong><p id="EN-US_TOPIC_0000001188110530__a1e8f150124c34310a4506013af4feeec">Specifies the column type.</p>
</li><li id="EN-US_TOPIC_0000001188110530__l8c89624d86434b2997c878eeccfee4ed"><strong id="EN-US_TOPIC_0000001188110530__a9a0607dddf714bd98e05c040ae33a0dc">definition</strong><p id="EN-US_TOPIC_0000001188110530__a21dc9a0ae4a3457a88d4fe25f33366be">Specifies a string constant defining the function; the meaning depends on the language. It can be an internal function name, a path pointing to a target file, a SQL query, or text in a procedural language.</p>
</li><li id="EN-US_TOPIC_0000001188110530__lb0fa3e874dcc4f09b541b149564882f4"><strong id="EN-US_TOPIC_0000001188110530__a03189eedf2a846b69e9c68e9e6e7684b">LANGUAGE lang_name</strong><p id="EN-US_TOPIC_0000001188110530__a19c6bfc0240746d183a8d32a27089c43">Indicates the name of the language that is used to implement the function. It can be <strong id="EN-US_TOPIC_0000001188110530__b122942227114">SQL</strong>, <strong id="EN-US_TOPIC_0000001188110530__b7301162251110">internal</strong>, or the name of user-defined process language. To ensure downward compatibility, the name can use single quotation marks. Contents in single quotation marks must be capitalized.</p>
</li><li id="EN-US_TOPIC_0000001188110530__lcc76bcc9f3be4f9280aebb55a1c14bc6"><strong id="EN-US_TOPIC_0000001188110530__aff3313277a0646a9b41fcc4a73154f4d">WINDOW</strong><p id="EN-US_TOPIC_0000001188110530__ad40788179e0d4dc4a3643b86d1d81477">Indicates that the function is a window function. The WINDOW attribute cannot be changed when the function definition is replaced.</p>
<div class="notice" id="EN-US_TOPIC_0000001188110530__note17401824174719"><span class="noticetitle"><img src="public_sys-resources/notice_3.0-en-us.png"> </span><div class="noticebody"><p id="EN-US_TOPIC_0000001188110530__p124012240475">For a user-defined window function, the value of <strong id="EN-US_TOPIC_0000001188110530__b16204133118343">LANGUAGE</strong> can only be <strong id="EN-US_TOPIC_0000001188110530__b020512318344">internal</strong>, and the referenced internal function must be a window function.</p>
</div></div>
</li><li id="EN-US_TOPIC_0000001188110530__l05474f96cfb440028621977cba901261"><strong id="EN-US_TOPIC_0000001188110530__a1a6893db62b0466ea781f7db2448038b">IMMUTABLE</strong><p id="EN-US_TOPIC_0000001188110530__aacfd4f6738a44a6d993550121bdec5b1">Indicates that the function always returns the same result if the parameter values are the same.</p>
<p id="EN-US_TOPIC_0000001188110530__p71971628112112">If the input argument of the function is a constant, the function value is calculated at the optimizer stage. The advantage is that the expression value can be obtained as early as possible, so the cost estimation is more accurate and the execution plan generated is better.</p>
<p id="EN-US_TOPIC_0000001188110530__p183070521245">A user-defined <strong id="EN-US_TOPIC_0000001188110530__b112112415471">IMMUTABLE</strong> function is automatically pushed down to DNs for execution, which may cause potential risks. If a function is defined as <strong id="EN-US_TOPIC_0000001188110530__b1085481412477">IMMUTABLE</strong> but the function execution process is in fact not <strong id="EN-US_TOPIC_0000001188110530__b7463192024718">IMMUTABLE</strong>, serious problems such as result errors may occur. Therefore, exercise caution when defining the <strong id="EN-US_TOPIC_0000001188110530__b1338833015473">IMMUTABLE</strong> attribute for a function.</p>
<p id="EN-US_TOPIC_0000001188110530__p115722853016">Examples:</p>
<ol id="EN-US_TOPIC_0000001188110530__ol1641815200444"><li id="EN-US_TOPIC_0000001188110530__li144181920184412"><a name="EN-US_TOPIC_0000001188110530__li144181920184412"></a><a name="li144181920184412"></a>If a user-defined function references objects such as tables and views, the function cannot be defined as <strong id="EN-US_TOPIC_0000001188110530__b546315012479">IMMUTABLE</strong>, because the function may return different results when the data in a referenced table changes.</li><li id="EN-US_TOPIC_0000001188110530__li1341819203448"><a name="EN-US_TOPIC_0000001188110530__li1341819203448"></a><a name="li1341819203448"></a>If a user-defined function references a <strong id="EN-US_TOPIC_0000001188110530__b2756112104818">STABLE</strong> or <strong id="EN-US_TOPIC_0000001188110530__b99411742482">VOLATILE</strong> function, the function cannot be defined as IMMUTABLE.</li><li id="EN-US_TOPIC_0000001188110530__li34185206448">If a user-defined function contains factors that cannot be pushed down, the function cannot be defined as <strong id="EN-US_TOPIC_0000001188110530__b136551818184817">IMMUTABLE</strong>, because the <strong id="EN-US_TOPIC_0000001188110530__b1354232224811">IMMUTABLE</strong> attribute conflicts with factors that cannot be pushed down. Typical scenarios include functions and syntax that cannot be pushed down.</li><li id="EN-US_TOPIC_0000001188110530__li8418320174412">If a user-defined function contains an aggregation operation that will generate <strong id="EN-US_TOPIC_0000001188110530__b1131716421483">STREAM</strong> plans to complete the operation (meaning that DNs and CNs are involved for results calculation, such as the <strong id="EN-US_TOPIC_0000001188110530__b14892452134819">LISTAGG</strong> function), the function cannot be defined as <strong id="EN-US_TOPIC_0000001188110530__b157113576484">IMMUTABLE</strong>.</li></ol>
<p id="EN-US_TOPIC_0000001188110530__p17234232112718">To prevent possible problems, you can set <strong id="EN-US_TOPIC_0000001188110530__b79916512505">behavior_compat_options</strong> to <strong id="EN-US_TOPIC_0000001188110530__b951515104503">check_function_conflicts</strong> in the database to check definition conflicts. This method can identify the <a href="#EN-US_TOPIC_0000001188110530__li144181920184412">1</a> and <a href="#EN-US_TOPIC_0000001188110530__li1341819203448">2</a> scenarios described above.</p>
</li><li id="EN-US_TOPIC_0000001188110530__l8cc62d32c893455d90e51b727bdc1922"><strong id="EN-US_TOPIC_0000001188110530__a17d15a074bd7437c8a34389755b8ebc3">STABLE</strong><p id="EN-US_TOPIC_0000001188110530__a16741047d13c4ad5b28129cdd4359975">Indicates that the function cannot modify the database, and that within a single table scan it will consistently return the same result for the same parameter values, but that its result varies by SQL statements.</p>
</li><li id="EN-US_TOPIC_0000001188110530__l8907424a2b6242b589cbb3838350d5ab"><strong id="EN-US_TOPIC_0000001188110530__a9e75b0a45dd44027bcc5a2b90da2e878">VOLATILE</strong><p id="EN-US_TOPIC_0000001188110530__ab3ee7bd28d0246d99422a8211665aee9">Indicates that the function value can change even within a single table scan, so no optimizations can be made.</p>
</li><li id="EN-US_TOPIC_0000001188110530__li37194812496"><strong id="EN-US_TOPIC_0000001188110530__b1145335616485">SHIPPABLE</strong><p id="EN-US_TOPIC_0000001188110530__p1334571110490"><strong id="EN-US_TOPIC_0000001188110530__b1454819024919">NOT SHIPPABLE</strong></p>
<p id="EN-US_TOPIC_0000001188110530__p8312111104820">Indicates whether the function can be pushed down to DNs for execution.</p>
<ul id="EN-US_TOPIC_0000001188110530__ul1433317562299"><li id="EN-US_TOPIC_0000001188110530__li648719545292">Functions of the IMMUTABLE type can always be pushed down to the DNs.</li><li id="EN-US_TOPIC_0000001188110530__li050925442919">Functions of the STABLE or VOLATILE type can be pushed down to DNs only if their attribute is <strong id="EN-US_TOPIC_0000001188110530__b136845017275">SHIPPABLE</strong>.<p id="EN-US_TOPIC_0000001188110530__p119351241112917">Exercise caution when defining the <strong id="EN-US_TOPIC_0000001188110530__b18613171624910">SHIPPABLE</strong> attribute for a function. <strong id="EN-US_TOPIC_0000001188110530__b1431202813497">SHIPPABLE</strong> means that the entire function will be pushed down to DNs for execution. If the attribute is incorrectly set, serious problems such as result errors may occur.</p>
<p id="EN-US_TOPIC_0000001188110530__p20840184265114">Similar to the <strong id="EN-US_TOPIC_0000001188110530__b13205184217498">IMMUTABLE</strong> attribute, the <strong id="EN-US_TOPIC_0000001188110530__b109252044194911">SHIPPABLE</strong> attribute has use restrictions. The function cannot contain factors that do not allow the function to be pushed down for execution. If a function is pushed down to a single DN for execution, the function's calculation logic will depend only on the data set of the DN.</p>
<p id="EN-US_TOPIC_0000001188110530__p4854102213541">Examples:</p>
<ol id="EN-US_TOPIC_0000001188110530__ol92344457558"><li id="EN-US_TOPIC_0000001188110530__li10234144517556">If a function references a hash table, you cannot define the function as <strong id="EN-US_TOPIC_0000001188110530__b8903181165018">SHIPPABLE</strong>.</li><li id="EN-US_TOPIC_0000001188110530__li6235345115510">If a function contains factors, functions, or syntax that cannot be pushed down, the function cannot be defined as SHIPPABLE. For details, see Optimizing Statement Pushdown.</li><li id="EN-US_TOPIC_0000001188110530__li15235204555513">If a function's calculation process involves data across DNs, the function cannot be defined as <strong id="EN-US_TOPIC_0000001188110530__b1325583416501">SHIPPABLE</strong>. For example, some aggregation operations involve data across DNs.</li></ol>
</li></ul>
</li><li id="EN-US_TOPIC_0000001188110530__li48131611112918"><strong id="EN-US_TOPIC_0000001188110530__b9302204011349">PACKAGE</strong><div class="p" id="EN-US_TOPIC_0000001188110530__p8488510143011">Indicates whether the function can be overloaded. PostgreSQL-style functions can be overloaded, and this parameter is designed for Oracle-style functions.<ul id="EN-US_TOPIC_0000001188110530__ul16535202615353"><li id="EN-US_TOPIC_0000001188110530__li35351026163513">All PACKAGE and non-PACKAGE functions cannot be overloaded or replaced.</li><li id="EN-US_TOPIC_0000001188110530__li76654123517">PACKAGE functions do not support parameters of the VARIADIC type.</li><li id="EN-US_TOPIC_0000001188110530__li5417717174411">The PACKAGE attribute of functions cannot be modified.</li></ul>
</div>
</li><li id="EN-US_TOPIC_0000001188110530__le58f8d87813d4d9a9c3161d584e69d41"><strong id="EN-US_TOPIC_0000001188110530__a17ed0fd88b4b4dbc963df3133fea8af1">LEAKPROOF</strong><p id="EN-US_TOPIC_0000001188110530__af3e634d3ec5c4109ae22f0948b69e445">Indicates that the function has no side effects. <strong id="EN-US_TOPIC_0000001188110530__b3758831310408">LEAKPROOF</strong> can be set only by the system administrator.</p>
</li><li id="EN-US_TOPIC_0000001188110530__lfbd4a5a031d84731b739029d65ad8547"><strong id="EN-US_TOPIC_0000001188110530__ab4f304007d2c471e9d75b779b2f095a4">CALLED ON NULL INPUT</strong><p id="EN-US_TOPIC_0000001188110530__a7c7c7cb233094f568ce60879e54981fc">Declares that some parameters of the function can be invoked in normal mode if the parameter values are <strong id="EN-US_TOPIC_0000001188110530__b140546266017272">NULL</strong>. This parameter can be omitted.</p>
</li><li id="EN-US_TOPIC_0000001188110530__la79af23662b149599a0f244e332010b1"><strong id="EN-US_TOPIC_0000001188110530__a68ae7ad12b1b4173b32b87246c1b4355">RETURNS NULL ON NULL INPUT</strong><p id="EN-US_TOPIC_0000001188110530__a11e089cc98ac42319ce18236e9c94a6a"><strong id="EN-US_TOPIC_0000001188110530__aea46ed3ba90048c3a929693f6093a1bc">STRICT</strong></p>
<p id="EN-US_TOPIC_0000001188110530__ae10420bc5699455284dbfb8b948aa49a">Indicates that the function always returns <strong id="EN-US_TOPIC_0000001188110530__b595248359421">NULL</strong> whenever any of its parameters are <strong id="EN-US_TOPIC_0000001188110530__b659614749421">NULL</strong>. If this parameter is specified, the function is not executed when there are <strong id="EN-US_TOPIC_0000001188110530__b16231192875315">NULL</strong> parameters; instead a <strong id="EN-US_TOPIC_0000001188110530__b112321728115315">NULL</strong> result is returned automatically.</p>
<p id="EN-US_TOPIC_0000001188110530__a4cd589ae88c142beb6e99dda2425451e">The usage of <strong id="EN-US_TOPIC_0000001188110530__b10383682023361">RETURNS NULL ON NULL INPUT</strong> is the same as that of <strong id="EN-US_TOPIC_0000001188110530__b11902842333361">STRICT</strong>.</p>
</li><li id="EN-US_TOPIC_0000001188110530__lf14c2a2da7054a8fbf12fac43230caee"><strong id="EN-US_TOPIC_0000001188110530__a0b64202abd4c47c7b1596e43b1eb8a34">EXTERNAL</strong><p id="EN-US_TOPIC_0000001188110530__a1dabd51eec044c309d48cde7602d5dbd">The keyword EXTERNAL is allowed for SQL conformance, but it is optional since, unlike in SQL, this feature applies to all functions not only external ones.</p>
</li><li id="EN-US_TOPIC_0000001188110530__la52f72efac214652a7b98387e6f90120"><strong id="EN-US_TOPIC_0000001188110530__a5dcfad137d4442c89b0fef1ace86144e">SECURITY INVOKER</strong><p id="EN-US_TOPIC_0000001188110530__a9fb1ce1508e54388b9c2e7e184531179"><strong id="EN-US_TOPIC_0000001188110530__a83716c60b7bf4cada16bc0de17dd671b">AUTHID CURRENT_USER</strong></p>
<p id="EN-US_TOPIC_0000001188110530__aa911617d439443e790214b8c013e5637">Indicates that the function is to be executed with the permissions of the user that calls it. This parameter can be omitted.</p>
<p id="EN-US_TOPIC_0000001188110530__a1c8b83085ad84426be18cf93fb6dd427"><strong id="EN-US_TOPIC_0000001188110530__b0231759153417">SECURITY INVOKER</strong> and <strong id="EN-US_TOPIC_0000001188110530__b1024125917347">AUTHID CURRENT_USER</strong> have the same functions.</p>
</li><li id="EN-US_TOPIC_0000001188110530__lf60806348cc04abfa54836582791da24"><strong id="EN-US_TOPIC_0000001188110530__ae109df50b9764a7fb73589a1f96560da">SECURITY DEFINER</strong><p id="EN-US_TOPIC_0000001188110530__a7d90d27951af4fa0b52e1b86012bd4eb"><strong id="EN-US_TOPIC_0000001188110530__a3a3f000fd11b4e59b64fa4fdfcd09945">AUTHID DEFINER</strong></p>
<p id="EN-US_TOPIC_0000001188110530__a909b1017f2f34899934d213b79371e30">Specifies that the function is to be executed with the permissions of the user that created it.</p>
<p id="EN-US_TOPIC_0000001188110530__a493d4e60a28a4ba79879862158a567d4">The usage of <strong id="EN-US_TOPIC_0000001188110530__b5296950093526">AUTHID DEFINER</strong> is the same as that of <strong id="EN-US_TOPIC_0000001188110530__b696345793526">SECURITY DEFINER</strong>.</p>
</li><li id="EN-US_TOPIC_0000001188110530__li146822105536"><strong id="EN-US_TOPIC_0000001188110530__b14949155315112">FENCED</strong><p id="EN-US_TOPIC_0000001188110530__p437119283116"><strong id="EN-US_TOPIC_0000001188110530__b79791153218">NOT FENCED</strong></p>
<p id="EN-US_TOPIC_0000001188110530__p368714429110">(Effective only for C functions) Specifies whether functions are executed in fenced mode. In NOT FENCED mode, a function is executed in a CN or DN process. In FENCED mode, a function is executed in a new fork process, which does not affect CN or DN processes.</p>
<p id="EN-US_TOPIC_0000001188110530__p203237211537">Application scenarios:</p>
<ul id="EN-US_TOPIC_0000001188110530__ul778020011549"><li id="EN-US_TOPIC_0000001188110530__li1100181411556">Develop or debug a function in FENCED mode and execute it in NOT FENCED mode. This reduces the cost of the fork process and communication.</li><li id="EN-US_TOPIC_0000001188110530__li4714275511641">Perform complex OS operations, such as open a file, process signals and threads, in FENCED mode so that <span id="EN-US_TOPIC_0000001188110530__text1968436910">GaussDB(DWS)</span> running is not affected.</li><li id="EN-US_TOPIC_0000001188110530__li139698293718">The default value is <strong id="EN-US_TOPIC_0000001188110530__b842352706154913">FENCED</strong>.</li></ul>
</li><li id="EN-US_TOPIC_0000001188110530__ld1a182145e47490a9fbf0f944dfdcfb3"><strong id="EN-US_TOPIC_0000001188110530__a7f8a84423a2d457b98863328802f307e">COST execution_cost</strong><p id="EN-US_TOPIC_0000001188110530__a5c9ec3053fd0470995cb8dfa7427ed71">A positive number giving the estimated execution cost for the function.</p>
<p id="EN-US_TOPIC_0000001188110530__a45ed2ba6aa614d4591b7fc8cf2949919">The unit of <strong id="EN-US_TOPIC_0000001188110530__b1801909104051">execution_cost</strong> is cpu_operator_cost.</p>
<p id="EN-US_TOPIC_0000001188110530__a241634c11b9e43e0a5c00b5b093421ed">Value range: A positive number.</p>
</li><li id="EN-US_TOPIC_0000001188110530__lb01e83687c0a4a979d5a41822bfdbe67"><strong id="EN-US_TOPIC_0000001188110530__ae3adba3ca6344b2c9826c5ec923551dc">ROWS result_rows</strong><p id="EN-US_TOPIC_0000001188110530__a336a087555ea47088cfb4da8a68a1c34">Estimates the number of rows returned by the function. This is only allowed when the function is declared to return a set.</p>
<p id="EN-US_TOPIC_0000001188110530__a3c9b554c404b425ead170107e77bcc9e">Value range: A positive number. The default is 1000 rows.</p>
</li><li id="EN-US_TOPIC_0000001188110530__l73b6744d3fe5495c962f92616088e20a"><strong id="EN-US_TOPIC_0000001188110530__a3ae47d3dac494ef4b62de791a8cc4bb5">configuration_parameter</strong><ul id="EN-US_TOPIC_0000001188110530__u95763292670045f492122dba72185b4d"><li id="EN-US_TOPIC_0000001188110530__l1a067ba72b15475d94dd5da4719e815a"><strong id="EN-US_TOPIC_0000001188110530__a061620efde384620880f49fd8989a939">value</strong><p id="EN-US_TOPIC_0000001188110530__a26b54c4b67ae415499f8781ee5b840b8">Sets a specified database session parameter to a specified value. If the value is <strong id="EN-US_TOPIC_0000001188110530__b20137804343361">DEFAULT</strong> or <strong id="EN-US_TOPIC_0000001188110530__b6615831533361">RESET</strong>, the default setting is used in the new session. <strong id="EN-US_TOPIC_0000001188110530__b3657489183361">OFF</strong> closes the setting.</p>
<p id="EN-US_TOPIC_0000001188110530__a64673ed5081e4882afd2d6bb63daec5e">Value range: a string</p>
<ul id="EN-US_TOPIC_0000001188110530__u1eeb225c7b674a82bbaa40f49de12f0a"><li id="EN-US_TOPIC_0000001188110530__l5a1df459f586430c94c7caa7c94d37db">DEFAULT</li><li id="EN-US_TOPIC_0000001188110530__l8c9146bd6be5438989455a11ef2f08dc">OFF</li><li id="EN-US_TOPIC_0000001188110530__l70f51a8a48cb4ffe94765939f3508b13">RESET</li></ul>
<p id="EN-US_TOPIC_0000001188110530__aa956a3134362449c9888f4e3a6e1bd34">Specifies the default value.</p>
</li><li id="EN-US_TOPIC_0000001188110530__l775337b760c54a52b41e3dfb877289dd"><strong id="EN-US_TOPIC_0000001188110530__a1dc00749d0c24d51999c27dd41198739">from current</strong><p id="EN-US_TOPIC_0000001188110530__abec4fd14300f418b84778b110bc725e2">Uses the value of <strong id="EN-US_TOPIC_0000001188110530__b842352706205857">configuration_parameter</strong> of the current session.</p>
</li></ul>
</li><li id="EN-US_TOPIC_0000001188110530__lee2554e54e844878888fa9b6b03fe325"><strong id="EN-US_TOPIC_0000001188110530__a6efce39005fe472abddf55bd93a7ddf7">plsql_body</strong><p id="EN-US_TOPIC_0000001188110530__ae728963f0e194e8cad181e291d2507db">Indicates the PL/SQL stored procedure body.</p>
<div class="notice" id="EN-US_TOPIC_0000001188110530__n20e64c4ccf0d4240831d483cf307dc65"><span class="noticetitle"><img src="public_sys-resources/notice_3.0-en-us.png"> </span><div class="noticebody"><p id="EN-US_TOPIC_0000001188110530__a927b90a2f8fe404181283b7b389b09a6">When the function is creating users, the log will record unencrypted passwords. You are not advised to do it.</p>
</div></div>
</li></ul>
</div>
<div class="section" id="EN-US_TOPIC_0000001188110530__sf77ad23b39744458aa662aaa8989dec0"><h4 class="sectiontitle">Examples</h4><p id="EN-US_TOPIC_0000001188110530__p38851820143011">Create the function <strong id="EN-US_TOPIC_0000001188110530__b436492214428">func_add_sql</strong> as an SQL query.</p>
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188110530__screen1633517104408"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">DROP</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="k">IF</span><span class="w"> </span><span class="k">EXISTS</span><span class="w"> </span><span class="n">func_add_sql</span><span class="p">;</span>
<span class="k">CREATE</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="n">func_add_sql</span><span class="p">(</span><span class="nb">integer</span><span class="p">,</span><span class="w"> </span><span class="nb">integer</span><span class="p">)</span><span class="w"> </span><span class="k">RETURNS</span><span class="w"> </span><span class="nb">integer</span>
<span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="s1">'select $1 + $2;'</span>
<span class="w"> </span><span class="k">LANGUAGE</span><span class="w"> </span><span class="k">SQL</span>
<span class="w"> </span><span class="k">IMMUTABLE</span>
<span class="w"> </span><span class="k">RETURNS</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="k">INPUT</span><span class="p">;</span>
</pre></div></td></tr></table></div>
</div>
<p id="EN-US_TOPIC_0000001188110530__p161331434113518">Create the function <strong id="EN-US_TOPIC_0000001188110530__b2356435163610">func_increment_plsql</strong> that accepts a parameter name and returns an integer value that is one greater than the input.</p>
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188110530__screen58621348194118"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">DROP</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="k">IF</span><span class="w"> </span><span class="k">EXISTS</span><span class="w"> </span><span class="n">func_increment_plsql</span><span class="p">;</span>
<span class="k">CREATE</span><span class="w"> </span><span class="k">OR</span><span class="w"> </span><span class="k">REPLACE</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="n">func_increment_plsql</span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="nb">integer</span><span class="p">)</span><span class="w"> </span><span class="k">RETURNS</span><span class="w"> </span><span class="nb">integer</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="err">$$</span>
<span class="w"> </span><span class="k">BEGIN</span>
<span class="w"> </span><span class="k">RETURN</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="w"> </span><span class="k">END</span><span class="p">;</span>
<span class="err">$$</span><span class="w"> </span><span class="k">LANGUAGE</span><span class="w"> </span><span class="n">plpgsql</span><span class="p">;</span>
</pre></div></td></tr></table></div>
</div>
<p id="EN-US_TOPIC_0000001188110530__p143905363515">Create a function that returns the RECORD type.</p>
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188110530__screen354419020423"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">DROP</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="k">IF</span><span class="w"> </span><span class="k">EXISTS</span><span class="w"> </span><span class="n">compute</span><span class="p">;</span>
<span class="k">CREATE</span><span class="w"> </span><span class="k">OR</span><span class="w"> </span><span class="k">REPLACE</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="n">compute</span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="n">result_1</span><span class="w"> </span><span class="nb">bigint</span><span class="p">,</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="n">result_2</span><span class="w"> </span><span class="nb">bigint</span><span class="p">)</span>
<span class="k">returns</span><span class="w"> </span><span class="k">SETOF</span><span class="w"> </span><span class="n">RECORD</span>
<span class="k">as</span><span class="w"> </span><span class="err">$$</span>
<span class="k">begin</span>
<span class="w"> </span><span class="n">result_1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="w"> </span><span class="n">result_2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">10</span><span class="p">;</span>
<span class="k">return</span><span class="w"> </span><span class="k">next</span><span class="p">;</span>
<span class="k">end</span><span class="p">;</span>
<span class="err">$$</span><span class="k">language</span><span class="w"> </span><span class="n">plpgsql</span><span class="p">;</span>
</pre></div></td></tr></table></div>
</div>
<p id="EN-US_TOPIC_0000001188110530__p695516550357">Create a function that that returns multiple output parameters.</p>
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188110530__screen1476011011420"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">DROP</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="k">IF</span><span class="w"> </span><span class="k">EXISTS</span><span class="w"> </span><span class="n">func_dup_sql</span><span class="p">;</span>
<span class="k">CREATE</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="n">func_dup_sql</span><span class="p">(</span><span class="k">in</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="n">f1</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="n">f2</span><span class="w"> </span><span class="nb">text</span><span class="p">)</span>
<span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="err">$$</span><span class="w"> </span><span class="k">SELECT</span><span class="w"> </span><span class="err">$</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="k">CAST</span><span class="p">(</span><span class="err">$</span><span class="mi">1</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="nb">text</span><span class="p">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="s1">' is text'</span><span class="w"> </span><span class="err">$$</span>
<span class="w"> </span><span class="k">LANGUAGE</span><span class="w"> </span><span class="k">SQL</span><span class="p">;</span>
<span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">func_dup_sql</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span>
</pre></div></td></tr></table></div>
</div>
<p id="EN-US_TOPIC_0000001188110530__p69781661364">Create a function that calculates the sum of two integers and gets the result. If the input is null, null will be returned.</p>
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188110530__screen15571123934213"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">DROP</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="k">IF</span><span class="w"> </span><span class="k">EXISTS</span><span class="w"> </span><span class="n">func_add_sql2</span><span class="p">;</span>
<span class="k">CREATE</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="n">func_add_sql2</span><span class="p">(</span><span class="n">num1</span><span class="w"> </span><span class="nb">integer</span><span class="p">,</span><span class="w"> </span><span class="n">num2</span><span class="w"> </span><span class="nb">integer</span><span class="p">)</span><span class="w"> </span><span class="k">RETURN</span><span class="w"> </span><span class="nb">integer</span>
<span class="k">AS</span>
<span class="k">BEGIN</span><span class="w"> </span>
<span class="k">RETURN</span><span class="w"> </span><span class="n">num1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">num2</span><span class="p">;</span>
<span class="k">END</span><span class="p">;</span>
<span class="o">/</span>
</pre></div></td></tr></table></div>
</div>
<p id="EN-US_TOPIC_0000001188110530__p758617372366">Create an overloaded function with the PACKAGE attribute.</p>
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188110530__sdcf1bfeaff9f4cd69867143ac21e79e5"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="k">OR</span><span class="w"> </span><span class="k">REPLACE</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="n">package_func_overload</span><span class="p">(</span><span class="n">col</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w"> </span><span class="n">col2</span><span class="w"> </span><span class="nb">int</span><span class="p">)</span>
<span class="k">return</span><span class="w"> </span><span class="nb">integer</span><span class="w"> </span><span class="n">package</span>
<span class="k">as</span>
<span class="k">declare</span>
<span class="w"> </span><span class="n">col_type</span><span class="w"> </span><span class="nb">text</span><span class="p">;</span>
<span class="k">begin</span>
<span class="w"> </span><span class="n">col</span><span class="w"> </span><span class="p">:</span><span class="o">=</span><span class="w"> </span><span class="mi">122</span><span class="p">;</span>
<span class="w"> </span><span class="n">dbms_output</span><span class="p">.</span><span class="n">put_line</span><span class="p">(</span><span class="s1">'two int parameters '</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">col2</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="k">end</span><span class="p">;</span>
<span class="o">/</span>
<span class="k">CREATE</span><span class="w"> </span><span class="k">OR</span><span class="w"> </span><span class="k">REPLACE</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="n">package_func_overload</span><span class="p">(</span><span class="n">col</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w"> </span><span class="n">col2</span><span class="w"> </span><span class="nb">smallint</span><span class="p">)</span>
<span class="k">return</span><span class="w"> </span><span class="nb">integer</span><span class="w"> </span><span class="n">package</span>
<span class="k">as</span>
<span class="k">declare</span>
<span class="w"> </span><span class="n">col_type</span><span class="w"> </span><span class="nb">text</span><span class="p">;</span>
<span class="k">begin</span>
<span class="w"> </span><span class="n">col</span><span class="w"> </span><span class="p">:</span><span class="o">=</span><span class="w"> </span><span class="mi">122</span><span class="p">;</span>
<span class="w"> </span><span class="n">dbms_output</span><span class="p">.</span><span class="n">put_line</span><span class="p">(</span><span class="s1">'two smallint parameters '</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">col2</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="k">end</span><span class="p">;</span>
<span class="o">/</span>
</pre></div></td></tr></table></div>
</div>
</div>
<div class="section" id="EN-US_TOPIC_0000001188110530__s2d5b1f5875e5404c9448dfdda40e035f"><h4 class="sectiontitle">Helpful Links</h4><p id="EN-US_TOPIC_0000001188110530__a7242546cbf0f4f64850785da282339a2"><a href="dws_06_0126.html">ALTER FUNCTION</a>, <a href="dws_06_0193.html">DROP FUNCTION</a></p>
</div>
</div>
<div>
<div class="familylinks">
<div class="parentlink"><strong>Parent topic:</strong> <a href="dws_06_0118.html">DDL Syntax</a></div>
</div>
</div>