1040 lines
58 KiB
HTML
1040 lines
58 KiB
HTML
|
<?xml version="1.0" encoding="utf-8"?>
|
||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-us">
|
||
|
<head>
|
||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||
|
<meta name="dc.language" scheme="rfc1766" content="en-us" />
|
||
|
<!-- All rights reserved. Licensed Materials Property of IBM -->
|
||
|
<!-- US Government Users Restricted Rights -->
|
||
|
<!-- Use, duplication or disclosure restricted by -->
|
||
|
<!-- GSA ADP Schedule Contract with IBM Corp. -->
|
||
|
<meta name="dc.date" scheme="iso8601" content="2005-09-19" />
|
||
|
<meta name="copyright" content="(C) Copyright IBM Corporation 1998, 2006" />
|
||
|
<meta name="security" content="public" />
|
||
|
<meta name="Robots" content="index,follow"/>
|
||
|
<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
|
||
|
<meta name="keywords" content="CREATE FUNCTION (External Scalar) statement,
|
||
|
CREATE FUNCTION (External Scalar), SQL statements, creating, function, external,
|
||
|
data type for CREATE FUNCTION (External Scalar), CCSID clause, CHAR,
|
||
|
DOUBLE PRECISION, DECIMAL, FLOAT, BIGINT, INTEGER, NUMERIC, REAL, SMALLINT,
|
||
|
VARCHAR, VARGRAPHIC, GRAPHIC, FOR BIT DATA clause, FOR MIXED DATA clause,
|
||
|
FOR SBCS DATA clause, BINARY, VARBINARY, BLOB, CLOB, DBCLOB, ROWID,
|
||
|
distinct-type, in CREATE FUNCTION (External Scalar), function-name,
|
||
|
AS LOCATOR clause, RETURNS clause, data-type, LANGUAGE clause, SQL clause,
|
||
|
DB2GENERAL clause, GENERAL clause, GENERAL WITH NULLS clause, JAVA clause,
|
||
|
SPECIFIC clause, DETERMINISTIC clause, CONTAINS SQL clause, NO SQL clause,
|
||
|
READS SQL DATA clause, MODIFIES SQL DATA clause,
|
||
|
RETURNS NULL ON NULL INPUT clause, CALLED ON NULL INPUT clause,
|
||
|
STATIC DISPATCH clause, DBINFO clause, NO DBINFO clause, EXTERNAL ACTION clause,
|
||
|
NO EXTERNAL ACTION clause, FENCED clause, NOT FENCED clause, FINAL CALL clause,
|
||
|
NO FINAL CALL clause, ALLOW PARALLEL clause, DISALLOW PARALLEL clause,
|
||
|
SCRATCHPAD clause, NO SCRATCHPAD clause, EXTERNAL clause, EXTERNAL NAME clause,
|
||
|
CREATE FUNCTION (external scalar) statement, CREATE FUNCTION (external scalar),
|
||
|
SQL statement" />
|
||
|
<title>CREATE FUNCTION (External Scalar)</title>
|
||
|
<link rel="stylesheet" type="text/css" href="ibmidwb.css" />
|
||
|
<link rel="stylesheet" type="text/css" href="ic.css" />
|
||
|
</head>
|
||
|
<body>
|
||
|
<a id="Top_Of_Page" name="Top_Of_Page"></a><!-- Java sync-link -->
|
||
|
<script language = "Javascript" src = "../rzahg/synch.js" type="text/javascript"></script>
|
||
|
|
||
|
|
||
|
<a name="cfsce"></a>
|
||
|
<h2 id="cfsce"><a href="rbafzmst02.htm#ToC_853">CREATE FUNCTION (External Scalar)</a></h2><a id="idx1635" name="idx1635"></a><a id="idx1636" name="idx1636"></a><a id="idx1637" name="idx1637"></a><a id="idx1638" name="idx1638"></a><a id="idx1639" name="idx1639"></a><a id="idx1640" name="idx1640"></a>
|
||
|
<p>This CREATE FUNCTION (External Scalar) statement creates an external scalar
|
||
|
function at the current server. A user-defined external scalar function returns
|
||
|
a single value each time it is invoked.</p>
|
||
|
<a name="wq1190"></a>
|
||
|
<h3 id="wq1190"><a href="rbafzmst02.htm#ToC_854">Invocation</a></h3>
|
||
|
<p>This statement can be embedded in an application program, or issued interactively.
|
||
|
It is an executable statement that can be dynamically prepared.</p>
|
||
|
<a name="wq1191"></a>
|
||
|
<h3 id="wq1191"><a href="rbafzmst02.htm#ToC_855">Authorization</a></h3>
|
||
|
<p>The privileges held by the authorization id of the statement must include
|
||
|
at least one of the following: </p>
|
||
|
<ul>
|
||
|
<li>For the SYSFUNCS catalog view and SYSPARMS catalog table<sup class="fn"><a id="wq1192" name="wq1192" href="rbafzmstcfsce.htm#wq1193">65</a></sup>:
|
||
|
|
||
|
<ul>
|
||
|
<li>The INSERT privilege on the table, and</li>
|
||
|
<li>The system authority *EXECUTE on library QSYS2</li></ul></li>
|
||
|
<li>Administrative Authority</li></ul>
|
||
|
<p>If the external program or service program exists, the privileges held
|
||
|
by the authorization ID of the statement must include at least one of the
|
||
|
following: </p>
|
||
|
<ul>
|
||
|
<li>For the external program or service program that is referenced in the
|
||
|
SQL statement:
|
||
|
<ul>
|
||
|
<li>The system authority *EXECUTE on the library that contains the external
|
||
|
program or service program.</li>
|
||
|
<li>The system authority *EXECUTE on the external program or service program,
|
||
|
and</li>
|
||
|
<li>The system authority *CHANGE on the program or service program. The system
|
||
|
needs this authority to update the program object to contain the information
|
||
|
necessary to save/restore the function to another system. If user does not
|
||
|
have this authority, the function is still created, but the program object
|
||
|
is not updated.</li></ul></li>
|
||
|
<li>Administrative Authority</li></ul>
|
||
|
<p>If SQL names are specified and a user profile exists that has the same
|
||
|
name as the library into which the function is created, and that name is different
|
||
|
from the authorization ID of the statement, then the privileges held by the
|
||
|
authorization ID of the statement must include at least one of the following:
|
||
|
</p>
|
||
|
<ul>
|
||
|
<li>The system authority *ADD to the user profile with that name</li>
|
||
|
<li>Administrative authority</li></ul>
|
||
|
<p>If a distinct type is referenced, the privileges held by the authorization ID of
|
||
|
the statement must include at least one of the following: </p>
|
||
|
<ul>
|
||
|
<li>For each distinct type identified in the statement:
|
||
|
<ul>
|
||
|
<li>The USAGE privilege on the distinct type, and</li>
|
||
|
<li>The system authority *EXECUTE on the library containing the distinct type</li></ul></li>
|
||
|
<li>Administrative authority</li></ul>
|
||
|
<p>For information on the system authorities corresponding to SQL privileges,
|
||
|
see <a href="rbafzmstgnt.htm#eqtablet">Corresponding System Authorities When Checking Privileges to a Table or View</a> and <a href="rbafzmstgntudtp.htm#eqtabled">Corresponding System Authorities When Checking Privileges to a Distinct Type</a>.</p>
|
||
|
<a name="wq1194"></a>
|
||
|
<h3 id="wq1194"><a href="rbafzmst02.htm#ToC_856">Syntax</a></h3>
|
||
|
<a href="rbafzmstcfsce.htm#synscrtfunes"><img src="c.gif" alt="Click to skip syntax diagram" /></a>
|
||
|
<a name="wq1195"></a>
|
||
|
<div class="fignone" id="wq1195">
|
||
|
<pre class="cgraphic"><span><img src="c.gif" alt="Read syntax diagram" longdesc="rbafzmstsyn271.htm"
|
||
|
border="0" /></span><a href="#skipsyn-270"><img src="c.gif" alt="Skip visual syntax diagram"
|
||
|
border="0" /></a>>>-CREATE FUNCTION--<span class="italic">function-name</span>------------------------------->
|
||
|
|
||
|
>--(--+---------------------------+--)-------------------------->
|
||
|
| .-,---------------------. |
|
||
|
| V | |
|
||
|
'---<span class="italic">parameter-declaration</span>-+-'
|
||
|
|
||
|
>--RETURNS--+-<span class="italic">data-type2</span>--+------------+------------------------+-->
|
||
|
| '-AS LOCATOR-' |
|
||
|
'-<span class="italic">data-type3</span>--CAST FROM--<span class="italic">data-type4</span>--+------------+-'
|
||
|
'-AS LOCATOR-'
|
||
|
|
||
|
>--<span class="italic">option-list</span>-------------------------------------------------><
|
||
|
|
||
|
</pre>
|
||
|
<a name="skipsyn-270" id="skipsyn-270"></a></div>
|
||
|
<a name="wq1196"></a>
|
||
|
<div class="fignone" id="wq1196">
|
||
|
<pre class="cgraphic"><span><img src="c.gif" alt="Read syntax diagram" longdesc="rbafzmstsyn272.htm"
|
||
|
border="0" /></span><a href="#skipsyn-271"><img src="c.gif" alt="Skip visual syntax diagram"
|
||
|
border="0" /></a>parameter-declaration:
|
||
|
|
||
|
|--+----------------+--<span class="italic">data-type1</span>--+------------+---------------|
|
||
|
'-<span class="italic">parameter-name</span>-' '-AS LOCATOR-'
|
||
|
|
||
|
data-type1, data-type2, data-type3, data-type4:
|
||
|
|
||
|
|--+-<span class="italic">built-in-type</span>------+---------------------------------------|
|
||
|
'-<span class="italic">distinct-type-name</span>-'
|
||
|
|
||
|
</pre>
|
||
|
<a name="skipsyn-271" id="skipsyn-271"></a></div>
|
||
|
<a name="wq1197"></a>
|
||
|
<div class="fignone" id="wq1197">
|
||
|
<pre class="cgraphic"><span><img src="c.gif" alt="Read syntax diagram" longdesc="rbafzmstsyn273.htm"
|
||
|
border="0" /></span><a href="#skipsyn-272"><img src="c.gif" alt="Skip visual syntax diagram"
|
||
|
border="0" /></a>built-in-type:
|
||
|
|
||
|
|--+-+---SMALLINT---+--------------------------------------------------------------------------+--|
|
||
|
| +-+-INTEGER-+--+ |
|
||
|
| | '-INT-----' | |
|
||
|
| '---BIGINT-----' |
|
||
|
| .-(5,0)------------------------. |
|
||
|
+-+-+-DECIMAL-+-+--+------------------------------+-----------------------------------------+
|
||
|
| | '-DEC-----' | | .-,0--------. | |
|
||
|
| '-NUMERIC-----' '-(--<span class="italic">integer</span>--+-----------+--)-' |
|
||
|
| '-<span class="italic">, integer</span>-' |
|
||
|
| .-(--53--)------. |
|
||
|
+-+-FLOAT--+---------------+-+--------------------------------------------------------------+
|
||
|
| | '-(--<span class="italic">integer</span>--)-' | |
|
||
|
| +-REAL---------------------+ |
|
||
|
| | .-PRECISION-. | |
|
||
|
| '-DOUBLE--+-----------+----' |
|
||
|
| .-(--1--)-------. |
|
||
|
+-+-+-+-CHARACTER-+--+---------------+----------+--+----------------+---------------------+-+
|
||
|
| | | '-CHAR------' '-(--<span class="italic">integer</span>--)-' | +-FOR BIT DATA---+ | |
|
||
|
| | '-+-+-CHARACTER-+--VARYING-+--(--<span class="italic">integer</span>--)-' +-FOR SBCS DATA--+ | |
|
||
|
| | | '-CHAR------' | +-FOR MIXED DATA-+ | |
|
||
|
| | '-VARCHAR----------------' '-<span class="italic">ccsid-clause</span>---' | |
|
||
|
| | .-(--1M--)-------------. | |
|
||
|
| '-----+-+-<span>CHARACTER</span>-+--<span>LARGE OBJECT</span>-+------+----------------------+--+----------------+-' |
|
||
|
| | '-<span>CHAR</span>------' | '-(--<span class="italic">integer</span>--+---+--)-' +-FOR SBCS DATA--+ |
|
||
|
| '-<span>CLOB</span>------------------------' +-K-+ +-FOR MIXED DATA-+ |
|
||
|
| +-M-+ '-<span class="italic">ccsid-clause</span>---' |
|
||
|
| '-G-' |
|
||
|
| .-(--1--)-------. |
|
||
|
+-+---GRAPHIC----+---------------+-------+--+--------------+--------------------------------+
|
||
|
| | '-(--<span class="italic">integer</span>--)-' | '-<span class="italic">ccsid-clause</span>-' |
|
||
|
| +-+-GRAPHIC VARYING-+--(--<span class="italic">integer</span>--)---+ |
|
||
|
| | '-VARGRAPHIC------' | |
|
||
|
| | .-(--1M--)-------------. | |
|
||
|
| '---DBCLOB----+----------------------+-' |
|
||
|
| '-(--<span class="italic">integer</span>--+---+--)-' |
|
||
|
| +-K-+ |
|
||
|
| +-M-+ |
|
||
|
| '-G-' |
|
||
|
| .-(--1--)-------. |
|
||
|
+-+-+-BINARY--+---------------+---------+-----------------+---------------------------------+
|
||
|
| | | '-(--<span class="italic">integer</span>--)-' | | |
|
||
|
| | '-+-BINARY VARYING-+--(--<span class="italic">integer</span>--)-' | |
|
||
|
| | '-VARBINARY------' | |
|
||
|
| | .-(--1M--)-------------. | |
|
||
|
| '---+-BLOB----------------+----+----------------------+-' |
|
||
|
| '-BINARY LARGE OBJECT-' '-(--<span class="italic">integer</span>--+---+--)-' |
|
||
|
| +-K-+ |
|
||
|
| +-M-+ |
|
||
|
| '-G-' |
|
||
|
+-+-DATE-------------------+----------------------------------------------------------------+
|
||
|
| | .-(--0--)-. | |
|
||
|
| +-TIME--+---------+------+ |
|
||
|
| | .-(--6--)-. | |
|
||
|
| '-TIMESTAMP--+---------+-' |
|
||
|
'---ROWID-----------------------------------------------------------------------------------'
|
||
|
|
||
|
ccsid-clause:
|
||
|
|
||
|
.-NOT NORMALIZED-.
|
||
|
|--CCSID--<span class="italic">integer</span>--+----------------+---------------------------|
|
||
|
'-NORMALIZED-----'
|
||
|
|
||
|
</pre>
|
||
|
<a name="skipsyn-272" id="skipsyn-272"></a></div>
|
||
|
<a name="wq1198"></a>
|
||
|
<div class="fignone" id="wq1198">
|
||
|
<pre class="cgraphic"><span><img src="c.gif" alt="Read syntax diagram" longdesc="rbafzmstsyn274.htm"
|
||
|
border="0" /></span><a href="#skipsyn-273"><img src="c.gif" alt="Skip visual syntax diagram"
|
||
|
border="0" /></a>option-list:
|
||
|
|
||
|
(1)
|
||
|
|--+-----------------------+------------------------------------>
|
||
|
'-LANGUAGE--+-C-------+-'
|
||
|
+-C++-----+
|
||
|
+-CL------+
|
||
|
+-COBOL---+
|
||
|
+-COBOLLE-+
|
||
|
+-FORTRAN-+
|
||
|
+-JAVA----+
|
||
|
+-PLI-----+
|
||
|
+-RPG-----+
|
||
|
'-RPGLE---'
|
||
|
|
||
|
.-PARAMETER STYLE SQL--------------------.
|
||
|
>--+----------------------------------------+------------------->
|
||
|
'-+-PARAMETER STYLE DB2SQL-------------+-'
|
||
|
+-PARAMETER STYLE JAVA---------------+
|
||
|
+-PARAMETER STYLE GENERAL------------+
|
||
|
+-PARAMETER STYLE GENERAL WITH NULLS-+
|
||
|
'-PARAMETER STYLE DB2GENERAL---------'
|
||
|
|
||
|
.-NOT DETERMINISTIC-.
|
||
|
>--+-------------------------+--+-------------------+----------->
|
||
|
'-SPECIFIC--<span class="italic">specific-name</span>-' '-DETERMINISTIC-----'
|
||
|
|
||
|
.-READS SQL DATA----. .-CALLED ON NULL INPUT-------.
|
||
|
>--+-------------------+--+----------------------------+-------->
|
||
|
+-NO SQL------------+ '-RETURNS NULL ON NULL INPUT-'
|
||
|
+-CONTAINS SQL------+
|
||
|
'-MODIFIES SQL DATA-'
|
||
|
|
||
|
.-STATIC DISPATCH-. .-NO DBINFO-. .-EXTERNAL ACTION----.
|
||
|
>--+-----------------+--+-----------+--+--------------------+--->
|
||
|
'-DBINFO----' '-NO EXTERNAL ACTION-'
|
||
|
|
||
|
.-FENCED-----. .-NO FINAL CALL-.
|
||
|
>--+------------+--+---------------+--+-------------------+----->
|
||
|
'-NOT FENCED-' '-FINAL CALL----' +-ALLOW PARALLEL----+
|
||
|
'-DISALLOW PARALLEL-'
|
||
|
|
||
|
.-NO SCRATCHPAD-----------.
|
||
|
>--+-------------------------+---------------------------------->
|
||
|
| .-<span class="italic">100</span>-----. |
|
||
|
'-SCRATCHPAD--+---------+-'
|
||
|
'-<span class="italic">integer</span>-'
|
||
|
|
||
|
.-EXTERNAL-----------------------------.
|
||
|
>--+--------------------------------------+---------------------|
|
||
|
'-EXTERNAL NAME--<span class="italic">external-program-name</span>-'
|
||
|
|
||
|
</pre>
|
||
|
<a name="skipsyn-273" id="skipsyn-273"></a>
|
||
|
<a name="wq1199"></a>
|
||
|
<div class="notelisttitle" id="wq1199">Notes:</div>
|
||
|
<ol type="1">
|
||
|
<li>The optional clauses can be specified in a different order.</li>
|
||
|
</ol></div>
|
||
|
<p><a id="idx1641" name="idx1641"></a><a id="idx1642" name="idx1642"></a><a id="idx1643" name="idx1643"></a><a id="idx1644" name="idx1644"></a><a id="idx1645" name="idx1645"></a><a id="idx1646" name="idx1646"></a><a id="idx1647" name="idx1647"></a><a id="idx1648" name="idx1648"></a><a id="idx1649" name="idx1649"></a><a id="idx1650" name="idx1650"></a><a id="idx1651" name="idx1651"></a><a id="idx1652" name="idx1652"></a><a id="idx1653" name="idx1653"></a><a id="idx1654" name="idx1654"></a><a id="idx1655" name="idx1655"></a><a id="idx1656" name="idx1656"></a><a id="idx1657" name="idx1657"></a><a id="idx1658" name="idx1658"></a><a id="idx1659" name="idx1659"></a><a id="idx1660" name="idx1660"></a><a id="idx1661" name="idx1661"></a><a id="idx1662" name="idx1662"></a><a id="idx1663" name="idx1663"></a></p><a id="idx1664" name="idx1664"></a>
|
||
|
<a name="synscrtfunes"></a>
|
||
|
<h3 id="synscrtfunes"><a href="rbafzmst02.htm#ToC_857">Description</a></h3>
|
||
|
<dl class="parml">
|
||
|
<dt class="bold"><var class="pv">function-name</var></dt>
|
||
|
<dd>Names the user-defined function. The combination of name, schema name,
|
||
|
the number of parameters, and the data type of each parameter (without regard
|
||
|
for any length, precision, scale, or CCSID attributes of the data type) must
|
||
|
not identify a user-defined function that exists at the current server.
|
||
|
<p>For SQL naming, the function will be created in the schema specified by the
|
||
|
implicit or explicit qualifier.</p>
|
||
|
<p>For system naming, the function will
|
||
|
be created in the schema that is specified by the qualifier. If no qualifier
|
||
|
is specified: </p>
|
||
|
<ul>
|
||
|
<li>If the value of the CURRENT SCHEMA special register is *LIBL, the function
|
||
|
will be created in the current library (*CURLIB).</li>
|
||
|
<li>Otherwise, the function will be created in the current schema.</li></ul>
|
||
|
<p>In general, more than one function can have the same name if the
|
||
|
function signature of each function is unique.</p>
|
||
|
<p>Certain function names
|
||
|
are reserved for system use. For more information see <a href="rbafzmstcreatef.htm#fnamerst">Choosing the Schema and Function Name</a>.</p>
|
||
|
</dd>
|
||
|
<dt class="bold">(<var class="pv">parameter-declaration,...)</var></dt>
|
||
|
<dd>Specifies the number of input parameters of the function and the data
|
||
|
type of each parameter. Although not required, you can give each parameter
|
||
|
a name.
|
||
|
<p>The maximum number of parameters allowed in CREATE FUNCTION is 90.
|
||
|
For external functions created with PARAMETER STYLE SQL, the input and result
|
||
|
parameters specified and the implicit parameters for indicators, SQLSTATE,
|
||
|
function name, specific name, and message text, as well as any optional parameters
|
||
|
are included. The maximum number of parameters is also limited by the maximum
|
||
|
number of parameters allowed by the licensed program that is used to compile
|
||
|
the external program.</p>
|
||
|
<dl class="parml">
|
||
|
<dt class="bold"><var class="pv">parameter-name</var></dt>
|
||
|
<dd>Names the parameter. Although not required, a parameter name
|
||
|
can be specified for each parameter. The name cannot be the same as any other <var class="pv">parameter-name</var> in the parameter list.
|
||
|
</dd>
|
||
|
<dt class="bold"><var class="pv">data-type1</var></dt>
|
||
|
<dd>Specifies the data type of the input parameter. The data
|
||
|
type can be a built-in data type or a distinct type.
|
||
|
<dl class="parml">
|
||
|
<dt class="bold"><var class="pv">built-in-type</var></dt>
|
||
|
<dd>Specifies a built-in data type. For a more complete description of each
|
||
|
built-in data type, see <a href="rbafzmsthctabl.htm#hctabl">CREATE TABLE</a>. Some data types are not supported
|
||
|
in all languages. For details on the mapping between the SQL data types and
|
||
|
host language data types, see <a href="../rzajp/rzajpkickoff.htm">Embedded SQL Programming</a> book. Built-in data type specifications can be specified if they correspond
|
||
|
to the language that is used to write the user-defined function.
|
||
|
</dd>
|
||
|
<dt class="bold"><var class="pv">distinct-type-name</var></dt>
|
||
|
<dd>Specifies a user-defined distinct type. The length, precision, or scale
|
||
|
attributes for the parameter are those of the source type of the distinct
|
||
|
type (those specified on CREATE DISTINCT TYPE). For more information on creating
|
||
|
a distinct type, see <a href="rbafzmstcrtudt.htm#crtudt">CREATE DISTINCT TYPE</a>.
|
||
|
<p>If the name of the distinct type is
|
||
|
unqualified, the database manager resolves the schema name by searching the
|
||
|
schemas in the SQL path.</p>
|
||
|
</dd>
|
||
|
</dl>
|
||
|
<p>If a CCSID is specified, the parameter will be converted to that
|
||
|
CCSID prior to passing it to the function. If a CCSID is not specified, the
|
||
|
CCSID is determined by the default CCSID at the current server at the time
|
||
|
the function is invoked.</p>
|
||
|
</dd><a id="idx1665" name="idx1665"></a>
|
||
|
<dt class="bold">AS LOCATOR</dt>
|
||
|
<dd>Specifies that a locator to the value of the parameter is passed to
|
||
|
the function instead of the actual value. Specify AS LOCATOR only for parameters
|
||
|
with a LOB data type or a distinct type based on a LOB data type. If AS LOCATOR
|
||
|
is specified, FOR SBCS DATA or FOR MIXED DATA must not be specified. See "Specifying AS LOCATOR for a parameter" in <a href="rbafzmstcreatef.htm#createf">CREATE FUNCTION</a> for more
|
||
|
information.
|
||
|
</dd>
|
||
|
</dl>
|
||
|
</dd><a id="idx1666" name="idx1666"></a>
|
||
|
<dt class="bold">RETURNS</dt>
|
||
|
<dd>Specifies the output of the function. <a id="idx1667" name="idx1667"></a><a id="idx1668" name="idx1668"></a>
|
||
|
<dl class="parml">
|
||
|
<dt class="bold"><var class="pv">data-type2</var> </dt>
|
||
|
<dd>Specifies the data type and attributes of the output.
|
||
|
|
||
|
<p>You can specify any built-in data type (except LONG VARCHAR, LONG VARGRAPHIC,
|
||
|
or DataLink) or a distinct type (that is not based on a DataLink).</p>
|
||
|
<p>If a CCSID is specified, </p>
|
||
|
<ul>
|
||
|
<li>If AS LOCATOR is not specified, the result returned is assumed to be encoded
|
||
|
in that CCSID.</li>
|
||
|
<li>If AS LOCATOR is specified and the CCSID of the data the locator points
|
||
|
to is encoded in a different CCSID, the data is converted to the specified
|
||
|
CCSID.</li></ul><p class="indatacontent"> If a CCSID is not specified, </p>
|
||
|
<ul>
|
||
|
<li>If AS LOCATOR is not specified, the result returned is assumed to be encoded
|
||
|
in the CCSID of the job (or associated graphic CCSID of the job for graphic
|
||
|
string return values).</li>
|
||
|
<li>If AS LOCATOR is specified, the data the locator points to is converted
|
||
|
to the CCSID of the job, if the CCSID of the data the locator points to is
|
||
|
encoded in a different CCSID. To avoid any potential loss of characters during
|
||
|
the conversion, consider explicitly specifying a CCSID that can represent
|
||
|
any characters that will be returned from the function. This is especially
|
||
|
important if the data type is graphic string data. In this case, consider
|
||
|
using CCSID 1200 or 13488 (UTF-16 or UCS-2 graphic string data).</li></ul>
|
||
|
<dl class="parml">
|
||
|
<dt class="bold">AS LOCATOR</dt>
|
||
|
<dd>Specifies that the function returns a locator to the value rather than
|
||
|
the actual value. Specify AS LOCATOR only if the result of the function has
|
||
|
a LOB data type or a distinct type based on a LOB data type. If AS LOCATOR
|
||
|
is specified, FOR SBCS DATA or FOR MIXED DATA must not be specified. See "Specifying AS LOCATOR for a parameter" in <a href="rbafzmstcreatef.htm#createf">CREATE FUNCTION</a> for more
|
||
|
information.
|
||
|
</dd>
|
||
|
</dl>
|
||
|
</dd>
|
||
|
<dt class="bold"><var class="pv">data-type3</var> CAST FROM <var class="pv">data-type4</var></dt>
|
||
|
<dd>Specifies the data type and attributes of the output (<var class="pv">data-type4</var>) and the data type in which that output is returned to the invoking
|
||
|
statement (<var class="pv">data-type3</var>). The two data types can be different. For
|
||
|
example, for the following definition, the function returns a CHAR(10) value,
|
||
|
which the database manager converts to a DATE value and then passes to the statement that
|
||
|
invoked the function:
|
||
|
<pre class="xmp"><span class="bold">CREATE FUNCTION</span> GET_HIRE_DATE <span class="bold">(CHAR</span>6<span class="bold">)</span>
|
||
|
<span class="bold">RETURNS DATE CAST FROM CHAR(</span>10<span class="bold">)</span></pre>The
|
||
|
value of <var class="pv">data-type4</var> must not be a distinct type and must be castable
|
||
|
to <var class="pv">data-type3</var>. The value for <var class="pv">data-type3</var> can be any built-in
|
||
|
data type or distinct type. (For information on casting data types, see <a href="rbafzmstcastdt.htm#castdt">Casting between data types</a>).
|
||
|
<p>For CCSID information, see the description of <var class="pv">data-type2</var> above.</p>
|
||
|
<dl class="parml">
|
||
|
<dt class="bold">AS LOCATOR</dt>
|
||
|
<dd>Specifies that the function returns a locator to the value rather than
|
||
|
the actual value. Specify AS LOCATOR only if the result of the function has
|
||
|
a LOB data type or a distinct type based on a LOB data type. If AS LOCATOR
|
||
|
is specified, FOR SBCS DATA or FOR MIXED DATA must not be specified. See "Specifying AS LOCATOR for a parameter" in <a href="rbafzmstcreatef.htm#createf">CREATE FUNCTION</a> for more
|
||
|
information.
|
||
|
</dd>
|
||
|
</dl>
|
||
|
</dd>
|
||
|
</dl>
|
||
|
</dd><a id="idx1669" name="idx1669"></a>
|
||
|
<dt class="bold">LANGUAGE</dt>
|
||
|
<dd>Specifies the language interface convention to which the function body
|
||
|
is written. All programs must be designed to run in the server's environment.
|
||
|
<p>If LANGUAGE is not specified, the LANGUAGE is determined from the program
|
||
|
attribute information associated with the external program at the time the
|
||
|
function is created. The language of the program is assumed to be C if:</p>
|
||
|
<ul>
|
||
|
<li>The program attribute information associated with the program does not
|
||
|
identify a recognizable language</li>
|
||
|
<li>The program cannot be found</li></ul>
|
||
|
<dl class="parml">
|
||
|
<dt class="bold">C </dt>
|
||
|
<dd>The external program is written in C.
|
||
|
</dd>
|
||
|
<dt class="bold">C++</dt>
|
||
|
<dd>The external program is written in C++.
|
||
|
</dd>
|
||
|
<dt class="bold">CL </dt>
|
||
|
<dd>The external program is written in CL or ILE CL.
|
||
|
</dd>
|
||
|
<dt class="bold">COBOL</dt>
|
||
|
<dd>The external program is written in COBOL.
|
||
|
</dd>
|
||
|
<dt class="bold">COBOLLE</dt>
|
||
|
<dd>The external program is written in ILE COBOL.
|
||
|
</dd>
|
||
|
<dt class="bold">FORTRAN </dt>
|
||
|
<dd>The external program is written in FORTRAN.
|
||
|
</dd>
|
||
|
<dt class="bold">JAVA</dt>
|
||
|
<dd>The external program is written in JAVA. The database manager will call
|
||
|
the user-defined function, which must be a public static method of the specified Java™ class
|
||
|
</dd>
|
||
|
<dt class="bold">PLI</dt>
|
||
|
<dd>The external program is written in PL/I.
|
||
|
</dd>
|
||
|
<dt class="bold">RPG </dt>
|
||
|
<dd>The external program is written in RPG.
|
||
|
</dd>
|
||
|
<dt class="bold">RPGLE </dt>
|
||
|
<dd>The external program is written in ILE RPG.
|
||
|
</dd>
|
||
|
</dl>
|
||
|
</dd>
|
||
|
<dt class="bold">PARAMETER STYLE</dt>
|
||
|
<dd>Specifies the conventions used for passing parameters to and returning
|
||
|
the values from functions:
|
||
|
<dl class="parml">
|
||
|
<dt class="bold">SQL</dt><a id="idx1670" name="idx1670"></a>
|
||
|
<dd>All applicable parameters are passed. The parameters are defined to
|
||
|
be in the following order:
|
||
|
<ul>
|
||
|
<li>The first N parameters are the input parameters that are specified on
|
||
|
the CREATE FUNCTION statement.</li>
|
||
|
<li>A parameter for the result of the function.</li>
|
||
|
<li>N parameters for indicator variables for the input parameters.</li>
|
||
|
<li>A parameter for the indicator variable for the result.</li>
|
||
|
<li>A CHAR(5) output parameter for SQLSTATE. The SQLSTATE returned indicates
|
||
|
the success or failure of the function. The SQLSTATE returned either be:
|
||
|
<ul>
|
||
|
<li>the SQLSTATE from the last SQL statement executed in the external program,</li>
|
||
|
<li>an SQLSTATE that is assigned by the external program.
|
||
|
<p>The user may
|
||
|
set the SQLSTATE to any valid value in the external program to return an error
|
||
|
or warning from the function.</p></li></ul></li>
|
||
|
<li>A VARCHAR(517) input parameter for the fully qualified function name.</li>
|
||
|
<li>A VARCHAR(128) input parameter for the specific name.</li>
|
||
|
<li>A VARCHAR(70) output parameter for the message text.
|
||
|
<p>When control is
|
||
|
returned to the invoking program, the message text can be found in the 6th
|
||
|
token of the SQLERRMC field of the SQLCA. Only a portion of the message text
|
||
|
is available. For information on the layout of the message data in the SQLERRMC,
|
||
|
see the replacement data descriptions for message SQL0443 in message file
|
||
|
QSQLMSG. The complete message text can be retreived using the GET DIAGNOSTICS
|
||
|
statement. For more information, see <a href="rbafzmstgetdiag.htm#getdiag">GET DIAGNOSTICS</a>.</p></li>
|
||
|
<li>Zero to three optional parameters:
|
||
|
<ul>
|
||
|
<li>A structure (consisting of an INTEGER followed by a CHAR(n)) input and
|
||
|
output parameter for the scratchpad, if SCRATCHPAD was specified on the CREATE
|
||
|
FUNCTION statement.</li>
|
||
|
<li>An INTEGER input parameter for the call type, if FINAL CALL was specified
|
||
|
on the CREATE FUNCTION statement.</li>
|
||
|
<li>A structure for the dbinfo structure, if DBINFO was specified on the CREATE
|
||
|
FUNCTION statement.</li></ul></li></ul>For more information about the parameters passed, see the include <span>sqludf</span> in the appropriate source file in library QSYSINC.
|
||
|
For example, for C, sqludf can be found in QSYSINC/H.
|
||
|
</dd>
|
||
|
<dt class="bold">DB2GENERAL</dt><a id="idx1671" name="idx1671"></a>
|
||
|
<dd>This parameter style is used to specify the conventions for passing
|
||
|
parameters to and returning the value from external functions that are defined
|
||
|
as a method in a Java class. All applicable parameters are passed.
|
||
|
The parameters are defined to be in the following order:
|
||
|
|
||
|
<ul>
|
||
|
<li>The first N parameters are the input parameters that are specified on
|
||
|
the CREATE FUNCTION statement.</li>
|
||
|
<li>A parameter for the result of the function.</li></ul>
|
||
|
<p>DB2GENERAL is only allowed when the LANGUAGE is JAVA.</p>
|
||
|
</dd>
|
||
|
<dt class="bold">GENERAL</dt><a id="idx1672" name="idx1672"></a>
|
||
|
<dd>All applicable parameters are passed. The parameters are defined to
|
||
|
be in the following order:
|
||
|
<ul>
|
||
|
<li>The first N parameters are the input parameters that are specified on
|
||
|
the CREATE FUNCTION statement.</li></ul>Note that the result is returned through as a value of a value returning
|
||
|
function. For example:
|
||
|
<pre class="xmp">return_val func(parameter-1, parameter-2, ...)</pre>
|
||
|
<p>GENERAL is only allowed when EXTERNAL NAME identifies a service program.</p>
|
||
|
</dd>
|
||
|
<dt class="bold">GENERAL WITH NULLS</dt><a id="idx1673" name="idx1673"></a>
|
||
|
<dd>All applicable parameters are passed. The parameters are defined to
|
||
|
be in the following order:
|
||
|
<ul>
|
||
|
<li>The first N parameters are the input parameters that are specified on
|
||
|
the CREATE FUNCTION statement.</li>
|
||
|
<li>An additional argument is passed for an indicator variable array.</li>
|
||
|
<li>A parameter for the indicator variable for the result.</li></ul>Note that the result is returned through as a value of a value returning
|
||
|
function. For example:
|
||
|
<pre class="xmp">return_val func(parameter-1, parameter-2, ...)</pre>
|
||
|
<p>GENERAL WITH NULLS is only allowed when EXTERNAL NAME identifies
|
||
|
a service program.</p>
|
||
|
</dd>
|
||
|
<dt class="bold">JAVA</dt><a id="idx1674" name="idx1674"></a>
|
||
|
<dd>Specifies that the procedure will use a parameter passing convention
|
||
|
that conforms to the Java language and ISO/IEC FCD 9075-13:2003, <span class="italic">Information technology - Database languages - SQL - Part 13: Java Routines and Types (SQL/JRT)</span> specification. All applicable
|
||
|
parameters are passed. The parameters are defined to be in the following
|
||
|
order:
|
||
|
<ul>
|
||
|
<li>The first N parameters are the input parameters that are specified on
|
||
|
the CREATE FUNCTION statement.</li></ul>Note that the result is returned through as a value of a value returning
|
||
|
function. For example:
|
||
|
<pre class="xmp">return_val func(parameter-1, parameter-2, ...)</pre>
|
||
|
<p>JAVA is only allowed when the LANGUAGE is JAVA.</p>
|
||
|
</dd>
|
||
|
</dl>
|
||
|
<p>Note that the language of the external function determines how
|
||
|
the parameters are passed. For example, in C, any VARCHAR or CHAR parameters
|
||
|
are passed as NUL-terminated strings. For more information, see the <a href="../sqlp/rbafykickoff.htm">SQL Programming</a> book. For Java routines, see the <a href="../rzaha/whatitis.htm">IBM® Developer
|
||
|
Kit for Java</a>.</p>
|
||
|
</dd><a id="idx1675" name="idx1675"></a>
|
||
|
<dt class="bold">SPECIFIC <var class="pv">specific-name</var></dt>
|
||
|
<dd>Specifies a unique name for the function. See "Specifying a Specific
|
||
|
Name for a Function" in <a href="rbafzmstcreatef.htm#createf">CREATE FUNCTION</a>.
|
||
|
</dd>
|
||
|
<dt class="bold">DETERMINISTIC <span class="base">or</span> NOT DETERMINISTIC</dt>
|
||
|
<dd>Specifies whether the function is deterministic.
|
||
|
<dl class="parml"><a id="idx1676" name="idx1676"></a>
|
||
|
<dt class="bold">NOT DETERMINISTIC</dt>
|
||
|
<dd>Specifies that the function will not always return the same result from
|
||
|
successive function invocations with identical input arguments. NOT DETERMINISTIC
|
||
|
should be specified if the function contains a reference to a special register,
|
||
|
a non-deterministic function, or a sequence.
|
||
|
</dd>
|
||
|
<dt class="bold">DETERMINISTIC</dt>
|
||
|
<dd>Specifies that the function will always return the same result from
|
||
|
successive invocations with identical input arguments.
|
||
|
</dd>
|
||
|
</dl>
|
||
|
</dd>
|
||
|
<dt class="bold">CONTAINS SQL, READS SQL DATA, MODIFIES SQL DATA, <span class="base">or</span> NO SQL</dt>
|
||
|
<dd>Specifies whether the function can execute any SQL statements and, if
|
||
|
so, what type. The database manager verifies that the SQL issued by the function is
|
||
|
consistent with this specification. See <a href="rbafzmstdiftab.htm#diftab">Appendix B. Characteristics of SQL statements</a> for a detailed
|
||
|
list of the SQL statements that can be executed under each data access indication.
|
||
|
<dl class="parml">
|
||
|
<dt class="bold">CONTAINS SQL</dt><a id="idx1677" name="idx1677"></a>
|
||
|
<dd>The function does not execute SQL statements that read or modify data.
|
||
|
</dd>
|
||
|
<dt class="bold">NO SQL</dt><a id="idx1678" name="idx1678"></a>
|
||
|
<dd>The function does not execute SQL statements.
|
||
|
</dd>
|
||
|
<dt class="bold">READS SQL DATA</dt><a id="idx1679" name="idx1679"></a>
|
||
|
<dd>The function does not execute SQL statements that modify data.
|
||
|
</dd>
|
||
|
<dt class="bold">MODIFIES SQL DATA</dt><a id="idx1680" name="idx1680"></a>
|
||
|
<dd>The function can execute any SQL statement except those statements that
|
||
|
are not supported in any function.
|
||
|
</dd>
|
||
|
</dl>
|
||
|
</dd>
|
||
|
<dt class="bold">RETURNS NULL ON NULL INPUT <span class="base">or</span> CALLED ON
|
||
|
NULL INPUT</dt><a id="idx1681" name="idx1681"></a><a id="idx1682" name="idx1682"></a>
|
||
|
<dd>Specifies whether the function is called if any of the input arguments
|
||
|
is null at execution time.
|
||
|
<dl class="parml">
|
||
|
<dt class="bold">RETURNS NULL ON INPUT</dt>
|
||
|
<dd>Specifies that the function is not invoked if any of the input arguments
|
||
|
is null. The result is the null value.
|
||
|
</dd>
|
||
|
<dt class="bold">CALLED ON NULL INPUT</dt>
|
||
|
<dd>Specifies that the function is to be invoked, if any, or all, argument
|
||
|
values are null, making the function responsible for testing for null argument
|
||
|
values. The function can return a null or nonnull value.
|
||
|
</dd>
|
||
|
</dl>
|
||
|
</dd>
|
||
|
<dt class="bold">STATIC DISPATCH</dt><a id="idx1683" name="idx1683"></a>
|
||
|
<dd>Specifies that the function is dispatched statically. All functions
|
||
|
are statically dispatched.
|
||
|
</dd>
|
||
|
<dt class="bold">DBINFO</dt><a id="idx1684" name="idx1684"></a><a id="idx1685" name="idx1685"></a>
|
||
|
<dd>Specifies whether or not the function requires the database information
|
||
|
be passed.
|
||
|
<dl class="parml">
|
||
|
<dt class="bold">DBINFO</dt>
|
||
|
<dd>Specifies that the database manager should pass a structure containing
|
||
|
status information to the function. <a href="rbafzmstcfsce.htm#dbinfotb">Table 49</a> contains a description
|
||
|
of the DBINFO structure. Detailed information about the DBINFO structure can
|
||
|
be found in include <span>sqludf</span> in the appropriate source
|
||
|
file in library QSYSINC. For example, for C, sqludf can be found in QSYSINC/H.
|
||
|
<p>DBINFO is only allowed with PARAMETER STYLE DB2SQL or PARAMETER STYLE DB2GENERAL.</p>
|
||
|
<a name="dbinfotb"></a>
|
||
|
<table id="dbinfotb" width="100%" summary="" border="1" frame="border" rules="all">
|
||
|
<caption>Table 49. DBINFO fields</caption>
|
||
|
<thead valign="bottom">
|
||
|
<tr>
|
||
|
<th id="wq1201" width="21%" align="left" valign="bottom">Field</th>
|
||
|
<th id="wq1202" width="15%" align="left" valign="bottom">Data Type</th>
|
||
|
<th id="wq1203" width="62%" align="left" valign="bottom">Description</th>
|
||
|
</tr>
|
||
|
</thead>
|
||
|
<tbody valign="top">
|
||
|
<tr>
|
||
|
<td align="left" valign="top" headers="wq1201">Relational database</td>
|
||
|
<td align="left" valign="top" headers="wq1202">VARCHAR(128)</td>
|
||
|
<td align="left" valign="top" headers="wq1203">The name of the current server.</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td align="left" valign="top" headers="wq1201">Authorization ID</td>
|
||
|
<td align="left" valign="top" headers="wq1202">VARCHAR(128)</td>
|
||
|
<td align="left" valign="top" headers="wq1203">The run-time authorization ID.</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td align="left" valign="top" headers="wq1201">CCSID Information</td>
|
||
|
<td align="left" valign="top" headers="wq1202">
|
||
|
<div class="lines">INTEGER<br />
|
||
|
INTEGER<br />
|
||
|
INTEGER<br />
|
||
|
</div>
|
||
|
<div class="lines"> <br />
|
||
|
</div>
|
||
|
<div class="lines">INTEGER<br />
|
||
|
INTEGER<br />
|
||
|
INTEGER<br />
|
||
|
</div>
|
||
|
<div class="lines"> <br />
|
||
|
</div>
|
||
|
<div class="lines">INTEGER<br />
|
||
|
INTEGER<br />
|
||
|
INTEGER<br />
|
||
|
</div>
|
||
|
<div class="lines"> <br />
|
||
|
</div>
|
||
|
<div class="lines">INTEGER<br />
|
||
|
</div>
|
||
|
<div class="lines"> <br />
|
||
|
</div>
|
||
|
<div class="lines">CHAR(8)<br />
|
||
|
</div></td>
|
||
|
<td align="left" valign="top" headers="wq1203">The CCSID information of the job. Three sets
|
||
|
of three CCSIDs are returned. The following information identifies the three
|
||
|
CCSIDs in each set:
|
||
|
<ul>
|
||
|
<li>SBCS CCSID</li>
|
||
|
<li>DBCS CCSID</li>
|
||
|
<li>Mixed CCSID</li></ul>Following the three sets of CCSIDs is an integer that indicates which
|
||
|
set of three sets of CCSIDs is applicable and eight bytes of reserved space.
|
||
|
<p>If a CCSID is not explicitly specified for a parameter on the CREATE FUNCTION
|
||
|
statement, the input string is assumed to be encoded in the CCSID of the job
|
||
|
at the time the function is executed. If the CCSID of the input string is
|
||
|
not the same as the CCSID of the parameter, the input string passed to the
|
||
|
external function will be converted before calling the external program.</p></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td align="left" valign="top" headers="wq1201">Target column</td>
|
||
|
<td align="left" valign="top" headers="wq1202">VARCHAR(128)
|
||
|
<div class="lines">VARCHAR(128)<br />
|
||
|
</div>
|
||
|
<div class="lines">VARCHAR(128)<br />
|
||
|
</div></td>
|
||
|
<td align="left" valign="top" headers="wq1203">If a user-defined function is specified on
|
||
|
the right-hand side of a SET clause in an UPDATE statement, the following
|
||
|
information identifies the target column:
|
||
|
<ul>
|
||
|
<li>Schema name</li>
|
||
|
<li>Base table name</li>
|
||
|
<li>Column name</li></ul>If the user-defined function is not on the right-hand side of a SET clause
|
||
|
in an UPDATE statement, these fields are blank.</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td align="left" valign="top" headers="wq1201">Version and release</td>
|
||
|
<td align="left" valign="top" headers="wq1202">CHAR(8)</td>
|
||
|
<td align="left" valign="top" headers="wq1203">The version, release, and modification level
|
||
|
of the database manager.</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td align="left" valign="top" headers="wq1201">Platform</td>
|
||
|
<td align="left" valign="top" headers="wq1202">INTEGER</td>
|
||
|
<td align="left" valign="top" headers="wq1203">The server's platform type.</td>
|
||
|
</tr>
|
||
|
</tbody>
|
||
|
</table>
|
||
|
</dd>
|
||
|
<dt class="bold">NO DBINFO</dt>
|
||
|
<dd>Specifies that the function does not require the database information
|
||
|
to be passed.
|
||
|
</dd>
|
||
|
</dl>
|
||
|
</dd>
|
||
|
<dt class="bold">EXTERNAL ACTION <span class="base">or</span> NO EXTERNAL ACTION</dt><a id="idx1686" name="idx1686"></a><a id="idx1687" name="idx1687"></a>
|
||
|
<dd>Specifies whether the function contains an external action.
|
||
|
<dl class="parml">
|
||
|
<dt class="bold">EXTERNAL ACTION</dt>
|
||
|
<dd>The function performs some external action (outside the scope of the
|
||
|
function program). Thus, the function must be invoked with each successive
|
||
|
function invocation. EXTERNAL ACTION should be specified if the function contains
|
||
|
a reference to another function that has an external action.
|
||
|
</dd>
|
||
|
<dt class="bold">NO EXTERNAL ACTION</dt>
|
||
|
<dd>The function does not perform an external action. It need not be called
|
||
|
with each successive function invocation.
|
||
|
</dd>
|
||
|
</dl>This parameter implies that the function
|
||
|
</dd>
|
||
|
<dt class="bold">FENCED <span class="base">or</span> NOT FENCED</dt><a id="idx1688" name="idx1688"></a><a id="idx1689" name="idx1689"></a>
|
||
|
<dd>Specifies whether the external function runs in an environment that
|
||
|
is isolated from the database manager environment.
|
||
|
<dl class="parml">
|
||
|
<dt class="bold">FENCED</dt>
|
||
|
<dd>The function will run in a separate thread.
|
||
|
<p>FENCED functions cannot
|
||
|
keep SQL cursors open across individual calls to the function. However, the
|
||
|
cursors in one thread are independent of the cursors in any other threads
|
||
|
which reduces the possibility of cursor name conflicts.</p>
|
||
|
</dd>
|
||
|
<dt class="bold">NOT FENCED</dt>
|
||
|
<dd>The function may run in the same thread as the invoking SQL statement.
|
||
|
<p>NOT FENCED functions can keep SQL cursors open across individual calls to
|
||
|
the function. Since cursors can be kept open, the cursor position will also
|
||
|
be preserved between calls to the function. However, cursor names may conflict
|
||
|
since the UDF is now running in the same thread as the invoking SQL statement
|
||
|
and other NOT FENCED UDFs.</p>
|
||
|
<p>NOT FENCED functions usually perform better
|
||
|
than FENCED functions.</p>
|
||
|
</dd>
|
||
|
</dl>
|
||
|
</dd>
|
||
|
<dt class="bold">FINAL CALL</dt><a id="idx1690" name="idx1690"></a><a id="idx1691" name="idx1691"></a>
|
||
|
<dd> Specifies whether the function requires special call indication. If
|
||
|
PARAMETER STYLE DB2SQL is specified and FINAL CALL is specified, an additional
|
||
|
parameter is passed to the function indicating first call, normal call, or
|
||
|
final call.
|
||
|
<dl class="parml">
|
||
|
<dt class="bold">NO FINAL CALL</dt>
|
||
|
<dd>Specifies that a final call is not made to the function.
|
||
|
</dd>
|
||
|
<dt class="bold">FINAL CALL</dt>
|
||
|
<dd>Specifies that a final call is made to the function. To differentiate
|
||
|
between final calls and other calls, the function receives an
|
||
|
additional argument that specifies the type of call.
|
||
|
<p>FINAL CALL is only
|
||
|
allowed with PARAMETER STYLE DB2SQL or PARAMETER STYLE DB2GENERAL.</p>
|
||
|
<p>The types of calls are:</p>
|
||
|
<dl>
|
||
|
<dt class="bold">First Call</dt>
|
||
|
<dd>Specifies the first call to the function for this reference to the function
|
||
|
in this SQL statement. A first call is a normal call. SQL arguments are passed
|
||
|
and the function is expected to return a result.
|
||
|
</dd>
|
||
|
<dt class="bold">Normal Call</dt>
|
||
|
<dd>Specifies that SQL arguments are passed and the function is expected
|
||
|
to return a result.
|
||
|
</dd>
|
||
|
<dt class="bold">Final Call</dt>
|
||
|
<dd>Specifies the last call to the function to enable the function to free
|
||
|
resources. A final call is not a normal call. If an error occurs, the database
|
||
|
manager attempts to make the final call.
|
||
|
<p>A final call occurs at these times:</p>
|
||
|
<ul>
|
||
|
<li><span class="italic">End of statement:</span> When the cursor is closed for
|
||
|
cursor-oriented statements, or the execution of the statement has completed.</li>
|
||
|
<li><span class="italic">End of a parallel task:</span> When the function is executed
|
||
|
by parallel tasks.</li>
|
||
|
<li><span class="italic">End of transaction:</span> When normal end of statement
|
||
|
processing does not occur. For example, the logic of an application, for some
|
||
|
reason, bypasses closing the cursor.</li></ul>
|
||
|
<p>Some functions that use a final call can receive incorrect results
|
||
|
if parallel tasks execute the function. For example, if a function sends a
|
||
|
note for each final call to it, one note is sent for each parallel task instead
|
||
|
of once for the function. Specify the DISALLOW PARALLEL clause for functions
|
||
|
that have inappropriate actions when executed in parallel.</p>
|
||
|
<p>If a commit
|
||
|
operation occurs while a cursor defined as WITH HOLD is open, a final call
|
||
|
is made when the cursor is closed or the application ends. If a commit occurs
|
||
|
at the end of a parallel task, a final call is made regardless of whether
|
||
|
a cursor defined as WITH HOLD is open.</p>
|
||
|
</dd>
|
||
|
</dl>
|
||
|
<p>Commitable operations should not be performed during a FINAL CALL,
|
||
|
because the FINAL CALL may occur during a close invoked as part of a COMMIT
|
||
|
operation.</p>
|
||
|
</dd>
|
||
|
</dl>
|
||
|
</dd>
|
||
|
<dt class="bold">PARALLEL</dt><a id="idx1692" name="idx1692"></a><a id="idx1693" name="idx1693"></a>
|
||
|
<dd>Specifies whether the function can be run in parallel.
|
||
|
<dl class="parml">
|
||
|
<dt class="bold">ALLOW PARALLEL</dt>
|
||
|
<dd>Specifies that the function can be run in parallel.
|
||
|
</dd>
|
||
|
<dt class="bold">DISALLOW PARALLEL</dt>
|
||
|
<dd>Specifies that the function cannot be run in parallel.
|
||
|
</dd>
|
||
|
</dl>The default is DISALLOW PARALLEL, if you specify one or more of the
|
||
|
following clauses:
|
||
|
<ul>
|
||
|
<li>NOT DETERMINISTIC</li>
|
||
|
<li>EXTERNAL ACTION</li>
|
||
|
<li>FINAL CALL</li>
|
||
|
<li>MODIFIES SQL DATA</li>
|
||
|
<li>SCRATCHPAD</li></ul>Otherwise, ALLOW PARALLEL is the default.
|
||
|
</dd>
|
||
|
<dt class="bold">SCRATCHPAD</dt><a id="idx1694" name="idx1694"></a><a id="idx1695" name="idx1695"></a>
|
||
|
<dd>Specifies whether the function requires a static memory area.
|
||
|
<dl class="parml">
|
||
|
<dt class="bold"> SCRATCHPAD <var class="pv">integer</var></dt>
|
||
|
<dd>Specifies that the function requires a persistent memory area of length
|
||
|
integer. The integer can range from 1 to 16,000,000. If the memory area is
|
||
|
not specified, the size of the area is 100 bytes. If parameter style DB2SQL
|
||
|
is specified, a pointer is passed following the required parameters that points
|
||
|
to a static storage area. If PARALLEL is specified, a memory area is allocated
|
||
|
for each user-defined function reference in the statement. If DISALLOW PARALLEL
|
||
|
is specified, only 1 memory area will be allocated for the function.
|
||
|
<p>The
|
||
|
scope of a scratchpad is the SQL statement. For each reference to the function
|
||
|
in an SQL statement, there is one scratchpad. For example, assuming that function
|
||
|
UDFX was defined with the SCRATCHPAD keyword, three scratchpads are allocated
|
||
|
for the three references to UDFX in the following SQL statement:</p>
|
||
|
<pre class="xmp"><span class="bold">SELECT</span> A, UDFX(A)
|
||
|
<span class="bold">FROM</span> TABLEB
|
||
|
<span class="bold">WHERE</span> UDFX(A) > 103 <span class="bold">OR</span> UDFX(A) < 19</pre><p class="indatacontent">If the function is run under parallel tasks, one scratchpad is allocated
|
||
|
for each parallel task of each reference to the function in the SQL statement.
|
||
|
This can lead to unpredictable results. For example, if a function uses the
|
||
|
scratchpad to count the number of times that it is invoked, the count reflects
|
||
|
the number of invocations done by the parallel task and not the SQL statement.
|
||
|
Specify the DISALLOW PARALLEL clause for functions that will not work correctly
|
||
|
with parallelism.</p>
|
||
|
<p>SCRATCHPAD is only allowed with PARAMETER STYLE DB2SQL
|
||
|
or PARAMETER STYLE DB2GENERAL.</p>
|
||
|
</dd>
|
||
|
<dt class="bold"> NO SCRATCHPAD</dt>
|
||
|
<dd>Specifies that the function does not require a persistent memory area.
|
||
|
</dd>
|
||
|
</dl>
|
||
|
</dd><a id="idx1696" name="idx1696"></a><a id="idx1697" name="idx1697"></a>
|
||
|
<dt class="bold">EXTERNAL NAME <var class="pv">external-program-name</var></dt>
|
||
|
<dd>Specifies the program, service program, or java class that will be executed
|
||
|
when the function is invoked in an SQL statement. The name must identify a
|
||
|
program, service program, or java class that exists at the application server at the
|
||
|
time the function is invoked. If the naming option is *SYS and the name is
|
||
|
not qualified:
|
||
|
<ul>
|
||
|
<li>The current path will be used to search for the program or service program
|
||
|
at the time the function is invoked.</li>
|
||
|
<li>*LIBL will be used to search for the program or service program at the
|
||
|
time grants or revokes are performed on the function.</li></ul>
|
||
|
<p>The validity of the name is checked at the application server. If the format
|
||
|
of the name is not correct, an error is returned.</p>
|
||
|
<p>If external-program-name
|
||
|
is not specified, the external program name is assumed to be the same as the
|
||
|
function name.</p>
|
||
|
<p>The program, service program, or java class need not
|
||
|
exist at the time the function is created, but it must exist at the time the
|
||
|
function is invoked.</p>
|
||
|
<p>A CONNECT, SET CONNECTION, RELEASE, DISCONNECT,
|
||
|
COMMIT, ROLLBACK and SET TRANSACTION statement is not allowed in the external
|
||
|
program of the function.</p>
|
||
|
</dd>
|
||
|
</dl>
|
||
|
<a name="wq1204"></a>
|
||
|
<h3 id="wq1204"><a href="rbafzmst02.htm#ToC_858">Notes</a></h3>
|
||
|
<p><span class="bold">General considerations for defining user-defined functions:</span> See <a href="rbafzmstcreatef.htm#createf">CREATE FUNCTION</a> for general information on defining user-defined
|
||
|
functions.</p>
|
||
|
<p><span class="bold">Creating the function:</span> When an external function
|
||
|
associated with an ILE external program or service program is created, an
|
||
|
attempt is made to save the function's attributes in the associated program
|
||
|
or service program object. If the *PGM or *SRVPGM object is saved and then
|
||
|
restored to this or another system, the catalogs are automatically updated
|
||
|
with those attributes.</p>
|
||
|
<p>The attributes can be saved for external functions subject to the following
|
||
|
restrictions:</p>
|
||
|
<ul>
|
||
|
<li>The external program library must not be QSYS.</li>
|
||
|
<li>The external program must exist when the CREATE FUNCTION statement is
|
||
|
issued.</li>
|
||
|
<li>The external program must be an ILE *PGM or *SRVPGM object.</li></ul><p class="indatacontent">If the object cannot be updated, the function will still be created.</p>
|
||
|
<p>During restore of the function:</p>
|
||
|
<ul>
|
||
|
<li>If the specific name was specified when the function was originally created
|
||
|
and it is not unique, an error is issued.</li>
|
||
|
<li>If the specific name was not specified, a unique name is generated if
|
||
|
necessary.</li>
|
||
|
<li>If the signature is not unique, the function cannot be registered, and
|
||
|
an error is issued.</li>
|
||
|
<li>If the same function signature already exists in the catalog:
|
||
|
<ul>
|
||
|
<li>If the external program or service program name is the same as the one
|
||
|
registered in the catalog, the function information in the catalog will be
|
||
|
replaced.</li>
|
||
|
<li>Otherwise, the function cannot be registered, and an error is issued.</li></ul></li></ul>
|
||
|
<p><span class="bold">Invoking the function:</span> When an external function
|
||
|
is invoked, it runs in whatever activation group was specified when the external
|
||
|
program or service program was created. However, ACTGRP(*CALLER) should normally
|
||
|
be used so that the function runs in the same activation group as the calling
|
||
|
program. ACTGRP(*NEW) is not allowed.</p>
|
||
|
<p><span class="bold">Notes for Java functions:</span> To be able to run Java functions, you must have the IBM Developer Kit for Java (5722-JV1) installed on your system.
|
||
|
Otherwise, an SQLCODE of -443 will be returned and a CPDB521 message will
|
||
|
be placed in the job log.</p>
|
||
|
<p>If an error occurs while running a Java procedure, an SQLCODE of -443 will
|
||
|
be returned. Depending on the error, other messages may exist in the job log
|
||
|
of the job where the procedure was run.</p>
|
||
|
<p><span class="bold">Syntax alternatives:</span> The following keywords are synonyms
|
||
|
supported for compatibility to prior releases. These keywords are non-standard
|
||
|
and should not be used:</p>
|
||
|
<ul>
|
||
|
<li>The keywords VARIANT and NOT VARIANT can be used as synonyms for NOT DETERMINISTIC
|
||
|
and DETERMINISTIC.</li>
|
||
|
<li>The keywords NULL CALL and NOT NULL CALL can be used as synonyms for CALLED
|
||
|
ON NULL INPUT and RETURNS NULL ON NULL INPUT.</li>
|
||
|
<li>The keywords SIMPLE CALL can be used as a synonym for GENERAL.</li>
|
||
|
<li>The keyword DB2GENRL may be used as a synonym for DB2GENERAL.</li>
|
||
|
<li>The value DB2SQL may be used as a synonym for SQL.</li>
|
||
|
<li>The keywords PARAMETER STYLE in the PARAMETER STYLE clause are optional.</li>
|
||
|
<li>The keywords IS DETERMINISTIC may be used as a synonym for DETERMINISTIC.</li></ul>
|
||
|
<a name="wq1205"></a>
|
||
|
<h3 id="wq1205"><a href="rbafzmst02.htm#ToC_859">Examples</a></h3>
|
||
|
<p><span class="italic">Example 1:</span> Assume an external function program
|
||
|
in C is needed that implements the following logic: </p>
|
||
|
<pre class="xmp"> rslt = 2 * input - 4</pre><p class="indatacontent"> The function should return a null value if and only if one of the input
|
||
|
arguments is null. The simplest way to avoid a function call and get a null
|
||
|
result when an input value is null is to specify RETURNS NULL ON NULL INPUT
|
||
|
on the CREATE FUNCTION statement. The following statement defines the function,
|
||
|
using the specific name MINENULL1. </p>
|
||
|
<a name="rgr6cfz"></a>
|
||
|
<pre id="rgr6cfz" class="xmp"> <span class="bold">CREATE FUNCTION</span> NTEST1 (<span class="bold">SMALLINT</span>)
|
||
|
<span class="bold"> RETURNS SMALLINT</span>
|
||
|
<span class="bold"> EXTERNAL NAME</span> NTESTMOD
|
||
|
<span class="bold"> SPECIFIC</span> MINENULL1
|
||
|
<span class="bold"> LANGUAGE C</span>
|
||
|
<span class="bold"> DETERMINISTIC</span>
|
||
|
<span class="bold"> NO SQL</span>
|
||
|
<span class="bold"> FENCED</span>
|
||
|
<span class="bold"> PARAMETER STYLE SQL</span>
|
||
|
<span class="bold"> RETURNS NULL ON NULL INPUT</span>
|
||
|
<span class="bold"> NO EXTERNAL ACTION</span></pre>
|
||
|
<p>The program code: </p>
|
||
|
<pre class="xmp"> void nudft1
|
||
|
(int *input, /* ptr to input argument */
|
||
|
int *output, /* ptr to output argument */
|
||
|
short *input_ind, /* ptr to input indicator */
|
||
|
short *output_ind, /* ptr to output indicator */
|
||
|
char sqlstate[6], /* sqlstate */
|
||
|
char fname[140], /* fully qualified function name */
|
||
|
char finst[129], /* function specific name */
|
||
|
char msgtext[71]) /* msg text buffer */
|
||
|
{
|
||
|
if (*input_ind == -1)
|
||
|
*output_ind = -1;
|
||
|
else
|
||
|
{
|
||
|
*output = 2*(*input)-4;
|
||
|
*output_ind = 0;
|
||
|
}
|
||
|
return;
|
||
|
} </pre>
|
||
|
<p><span class="italic">Example 2:</span> Assume that a user wants to define an
|
||
|
external function named CENTER. The function program will be written in C.
|
||
|
The following statement defines the function, and lets the database manager
|
||
|
generate a specific name for the function. <span>The name of the program containing
|
||
|
the function body is the same as the name of the function, so the EXTERNAL
|
||
|
clause does not include 'NAME <var class="pv">external-program-name</var>'.</span> </p>
|
||
|
<a name="rgr6cfy"></a>
|
||
|
<pre id="rgr6cfy" class="xmp"> <span class="bold">CREATE FUNCTION</span> CENTER (<span class="bold">INTEGER, FLOAT</span>)
|
||
|
<span class="bold">RETURNS FLOAT</span>
|
||
|
<span class="bold">LANGUAGE C</span>
|
||
|
<span class="bold">DETERMINISTIC</span>
|
||
|
<span class="bold">NO SQL</span>
|
||
|
<span class="bold">PARAMETER STYLE SQL</span>
|
||
|
<span class="bold">NO EXTERNAL ACTION</span></pre>
|
||
|
<p><span class="italic">Example 3:</span> Assume that user McBride (who has administrative
|
||
|
authority) wants to define an external function named CENTER in the SMITH
|
||
|
schema. McBride plans to give the function specific name FOCUS98. The function
|
||
|
program uses a scratchpad to perform some one-time only initialization and
|
||
|
save the results. The function program returns a value with a DOUBLE data
|
||
|
type. The following statement written by user McBride defines the function
|
||
|
and ensures that when the function is invoked, it returns a value with a data
|
||
|
type of DECIMAL(8,4). </p>
|
||
|
<a name="rgr6cfx"></a>
|
||
|
<pre id="rgr6cfx" class="xmp"> <span class="bold">CREATE FUNCTION</span> SMITH.CENTER (<span class="bold">DOUBLE, DOUBLE, DOUBLE</span>)
|
||
|
<span class="bold">RETURNS DECIMAL</span>(8,4)
|
||
|
<span class="bold">CAST FROM DOUBLE</span>
|
||
|
<span class="bold">EXTERNAL NAME</span> CMOD
|
||
|
<span class="bold">SPECIFIC</span> FOCUS98
|
||
|
<span class="bold">LANGUAGE C</span>
|
||
|
<span class="bold">DETERMINISTIC</span>
|
||
|
<span class="bold">NO SQL</span>
|
||
|
<span class="bold">FENCED</span>
|
||
|
<span class="bold">PARAMETER STYLE SQL</span>
|
||
|
<span class="bold">NO EXTERNAL ACTION</span>
|
||
|
<span class="bold">SCRATCHPAD</span>
|
||
|
<span class="bold">NO FINAL CALL</span></pre>
|
||
|
<p><span class="italic">Example 4:</span> The following example defines a Java user-defined function that returns the position of the first vowel
|
||
|
in a string. The user-defined function is written in Java,
|
||
|
is to be run fenced, and is the FINDVWL method of class JAVAUDFS. </p>
|
||
|
<a name="rgr7cfy"></a>
|
||
|
<pre id="rgr7cfy" class="xmp"> <span class="bold">CREATE FUNCTION</span> FINDV (<span class="bold">VARCHAR</span>(32000))
|
||
|
<span class="bold">RETURNS INTEGER</span>
|
||
|
<span class="bold">FENCED</span>
|
||
|
<span class="bold">LANGUAGE JAVA</span>
|
||
|
<span class="bold">PARAMETER STYLE JAVA</span>
|
||
|
<span class="bold">EXTERNAL NAME</span> 'JAVAUDFS.FINDVWL'
|
||
|
<span class="bold">NO EXTERNAL ACTION</span>
|
||
|
<span class="bold">CALLED ON NULL INPUT</span>
|
||
|
<span class="bold">DETERMINISTIC</span>
|
||
|
<span class="bold">NO SQL</span></pre><a id="idx1698" name="idx1698"></a><a id="idx1699" name="idx1699"></a>
|
||
|
<hr /><div class="fnnum"><a id="wq1193" name="wq1193" href="rbafzmstcfsce.htm#wq1192">65</a>.</div>
|
||
|
<div class="fntext">The GRTOBJAUT
|
||
|
CL command must be used to grant these privileges.</div>
|
||
|
<br />
|
||
|
<hr /><br />
|
||
|
[ <a href="#Top_Of_Page">Top of Page</a> | <a href="rbafzmstcreatef.htm">Previous Page</a> | <a href="rbafzmstcftbe.htm">Next Page</a> | <a href="rbafzmst02.htm#wq1">Contents</a> |
|
||
|
<a href="rbafzmstindex.htm#index">Index</a> ]
|
||
|
|
||
|
<a id="Bot_Of_Page" name="Bot_Of_Page"></a>
|
||
|
</body>
|
||
|
</html>
|