ibm-information-center/dist/eclipse/plugins/i5OS.ic.db2_5.4.0.1/rbafzmstcftbe.htm

934 lines
52 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 Table) statement,
CREATE FUNCTION (External Table), SQL statements, creating, function, external,
data type for CREATE FUNCTION (External Table), 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 Table), function-name,
AS LOCATOR clause, RETURNS clause, data-type, LANGUAGE clause, DB2GENERAL clause,
DB2SQL clause, SPECIFIC clause, DETERMINISTIC clause, NOT 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,
DISALLOW PARALLEL clause, SCRATCHPAD clause, NO SCRATCHPAD clause,
EXTERNAL clause, EXTERNAL NAME clause, CARDINALITY clause" />
<title>CREATE FUNCTION (External Table)</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="cftbe"></a>
<h2 id="cftbe"><a href="rbafzmst02.htm#ToC_860">CREATE FUNCTION (External Table)</a></h2><a id="idx1700" name="idx1700"></a><a id="idx1701" name="idx1701"></a><a id="idx1702" name="idx1702"></a><a id="idx1703" name="idx1703"></a><a id="idx1704" name="idx1704"></a><a id="idx1705" name="idx1705"></a>
<p>This CREATE FUNCTION (External Table) statement creates an external table
function at the current server. The function returns a result table.</p>
<p>A <var class="pv">table function</var> may be used in the FROM clause of a SELECT, and
returns a table to the SELECT by returning one row at a time.</p>
<a name="wq1206"></a>
<h3 id="wq1206"><a href="rbafzmst02.htm#ToC_861">Invocation</a></h3>
<p>You can embed this statement in an application program, or you can issue
this statement interactively. It is an executable statement that can be dynamically
prepared.</p>
<a name="wq1207"></a>
<h3 id="wq1207"><a href="rbafzmst02.htm#ToC_862">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:
<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="wq1208"></a>
<h3 id="wq1208"><a href="rbafzmst02.htm#ToC_863">Syntax</a></h3>
<a href="rbafzmstcftbe.htm#synscrtfunet"><img src="c.gif" alt="Click to skip syntax diagram" /></a>
<a name="wq1209"></a>
<div class="fignone" id="wq1209">
<pre class="cgraphic"><span><img src="c.gif" alt="Read syntax diagram" longdesc="rbafzmstsyn275.htm"
border="0" /></span><a href="#skipsyn-274"><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>-+-'
.-,---------------------------------------.
V |
>--RETURNS TABLE--(----<span class="italic">column-name</span>--<span class="italic">data-type2</span>--+------------+-+--)-->
'-AS LOCATOR-'
>--<span class="italic">option-list</span>------------------------------------------------->&lt;
</pre>
<a name="skipsyn-274" id="skipsyn-274"></a></div>
<a name="wq1210"></a>
<div class="fignone" id="wq1210">
<pre class="cgraphic"><span><img src="c.gif" alt="Read syntax diagram" longdesc="rbafzmstsyn276.htm"
border="0" /></span><a href="#skipsyn-275"><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:
|--+-<span class="italic">built-in-type</span>------+---------------------------------------|
'-<span class="italic">distinct-type-name</span>-'
</pre>
<a name="skipsyn-275" id="skipsyn-275"></a></div>
<a name="wq1211"></a>
<div class="fignone" id="wq1211">
<pre class="cgraphic"><span><img src="c.gif" alt="Read syntax diagram" longdesc="rbafzmstsyn277.htm"
border="0" /></span><a href="#skipsyn-276"><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-276" id="skipsyn-276"></a></div>
<a name="wq1212"></a>
<div class="fignone" id="wq1212">
<pre class="cgraphic"><span><img src="c.gif" alt="Read syntax diagram" longdesc="rbafzmstsyn278.htm"
border="0" /></span><a href="#skipsyn-277"><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 DB2SQL-----+------------------------------->
'-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-.
>--+------------+--+---------------+----DISALLOW PARALLEL------->
'-NOT FENCED-' '-FINAL CALL----'
.-NO SCRATCHPAD-----------.
>--+-------------------------+---------------------------------->
| .-<span class="italic">100</span>-----. |
'-SCRATCHPAD--+---------+-'
'-<span class="italic">integer</span>-'
.-EXTERNAL-----------------------------.
>--+--------------------------------------+--------------------->
'-EXTERNAL NAME--<span class="italic">external-program-name</span>-'
>--+---------------------+--------------------------------------|
'-CARDINALITY--<span class="italic">bigint</span>-'
</pre>
<a name="skipsyn-277" id="skipsyn-277"></a>
<a name="wq1213"></a>
<div class="notelisttitle" id="wq1213">Notes:</div>
<ol type="1">
<li>The optional clauses can be specified in a different order.</li>
</ol></div>
<p><a id="idx1706" name="idx1706"></a><a id="idx1707" name="idx1707"></a><a id="idx1708" name="idx1708"></a><a id="idx1709" name="idx1709"></a><a id="idx1710" name="idx1710"></a><a id="idx1711" name="idx1711"></a><a id="idx1712" name="idx1712"></a><a id="idx1713" name="idx1713"></a><a id="idx1714" name="idx1714"></a><a id="idx1715" name="idx1715"></a><a id="idx1716" name="idx1716"></a><a id="idx1717" name="idx1717"></a><a id="idx1718" name="idx1718"></a><a id="idx1719" name="idx1719"></a><a id="idx1720" name="idx1720"></a><a id="idx1721" name="idx1721"></a><a id="idx1722" name="idx1722"></a><a id="idx1723" name="idx1723"></a><a id="idx1724" name="idx1724"></a><a id="idx1725" name="idx1725"></a><a id="idx1726" name="idx1726"></a><a id="idx1727" name="idx1727"></a><a id="idx1728" name="idx1728"></a></p><a id="idx1729" name="idx1729"></a>
<a name="synscrtfunet"></a>
<h3 id="synscrtfunet"><a href="rbafzmst02.htm#ToC_864">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 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 (External Table)
is 90. The maximum number of parameters may be additionally 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>Parameters with a large object (LOB) data type are not supported
when PARAMETER STYLE JAVA is specified.</p>
<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="idx1730" name="idx1730"></a>
<dt class="bold">AS LOCATOR</dt>
<dd>Specifies that the input parameter is a locator to the value rather
than the actual value. You can specify AS LOCATOR only if the input parameter
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.
</dd>
</dl>
</dd><a id="idx1731" name="idx1731"></a>
<dt class="bold">RETURNS TABLE</dt>
<dd>Specifies the output table of the function.
<p>Assume the number of parameters
is N. For PARAMETER STYLE DB2GENERAL, there must be no more than (255-(N*2))/2
columns. For PARAMETER STYLE DB2SQL, there must be no more than (247-(N*2))/2
columns.</p><a id="idx1732" name="idx1732"></a><a id="idx1733" name="idx1733"></a>
<dl class="parml">
<dt class="bold"><var class="pv">column-name</var></dt>
<dd>Specifies the name of a column of the output table. Do not specify the
same name more than once.
</dd>
<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 DATE or TIME is specified, the table function must return the date or
time in ISO format.</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"><a id="idx1734" name="idx1734"></a>
<dt class="bold">AS LOCATOR</dt>
<dd>Specifies that the function returns a locator to the value for the column
rather than the actual value. You can specify AS LOCATOR only for 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.
</dd>
</dl>
</dd>
</dl>
</dd><a id="idx1735" name="idx1735"></a>
<dt class="bold">LANGUAGE (language clause)</dt>
<dd>The language clause specifies the language of the external program.
<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&nbsp;&nbsp;&nbsp; </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&nbsp;&nbsp;&nbsp;</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 as a method in a Java&trade; 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">DB2GENERAL</dt><a id="idx1736" name="idx1736"></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>The next M parameters are the result columns of the function that are
specified on the RETURNS TABLE clause.</li></ul>
<p>DB2GENERAL is only allowed when the LANGUAGE is JAVA.</p>
</dd>
<dt class="bold">DB2SQL</dt><a id="idx1737" name="idx1737"></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>The next M parameters are the result columns of the function that are
specified on the RETURNS TABLE clause.</li>
<li>N parameters for indicator variables for the input parameters.</li>
<li>M parameters for the indicator variables of the result columns of the
function that are specified on the RETURNS TABLE clause</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.</li>
<li>A structure (consisting of an INTEGER followed by a CHAR(n)) input and
output parameter for the scratchpad, if SCRATCH PAD was specified on the CREATE
FUNCTION statement.</li>
<li>An INTEGER input parameter for the call type.</li>
<li>A structure for the dbinfo structure, if DBINFO was specified on the CREATE
FUNCTION statement.</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>
</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&reg; Developer
Kit for Java</a>.</p>
</dd><a id="idx1738" name="idx1738"></a>
<dt class="bold">SPECIFIC <var class="pv">specific-name</var></dt>
<dd>Provides a unique name for the function. The name is implicitly or explicitly
qualified with a schema name. The name, including the schema name, must not
identify the specific name of another function or procedure that exists at
the current server. If unqualified, the implicit qualifier is the same as
the qualifier of the function name. If qualified, the qualifier must be the
same as the qualifier of the function name.
<p>If specific name is not specified,
it is set to the function name. If a function or procedure with that specific
name already exists, a unique name is generated similar to the rules used
to generate unique table names.</p>
</dd>
<dt class="bold">DETERMINISTIC <span class="base">or</span> NOT DETERMINISTIC</dt><a id="idx1739" name="idx1739"></a><a id="idx1740" name="idx1740"></a>
<dd>Specifies whether the function is deterministic.
<dl class="parml">
<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="idx1741" name="idx1741"></a>
<dd>The function does not execute SQL statements that read or modify data.
</dd>
<dt class="bold">NO SQL</dt><a id="idx1742" name="idx1742"></a>
<dd>The function does not execute SQL statements.
</dd>
<dt class="bold">READS SQL DATA</dt><a id="idx1743" name="idx1743"></a>
<dd>The function does not execute SQL statements that modify data.
</dd>
<dt class="bold">MODIFIES SQL DATA</dt><a id="idx1744" name="idx1744"></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="idx1745" name="idx1745"></a><a id="idx1746" name="idx1746"></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="idx1747" name="idx1747"></a>
<dd>Specifies that the function is dispatched statically. All functions
are statically dispatched.
</dd>
<dt class="bold">DBINFO</dt><a id="idx1748" name="idx1748"></a><a id="idx1749" name="idx1749"></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="rbafzmstcftbe.htm#dbinfotbt">Table 50</a> contains a description
of the DBINFO structure. Detailed information about the DBINFO structure can
be found in <span>sqludf</span> in the appropriate source file
in library QSYSINC. For example, for C, sqludf can be found in QSYSINC/H.
<a name="dbinfotbt"></a>
<table id="dbinfotbt" width="100%" summary="" border="1" frame="border" rules="all">
<caption>Table 50. DBINFO fields</caption>
<thead valign="bottom">
<tr>
<th id="wq1215" width="21%" align="left" valign="bottom">Field</th>
<th id="wq1216" width="15%" align="left" valign="bottom">Data Type</th>
<th id="wq1217" width="62%" align="left" valign="bottom">Description</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left" valign="top" headers="wq1215">Relational database</td>
<td align="left" valign="top" headers="wq1216">VARCHAR(128)</td>
<td align="left" valign="top" headers="wq1217">The name of the current server.</td>
</tr>
<tr>
<td align="left" valign="top" headers="wq1215">Authorization ID</td>
<td align="left" valign="top" headers="wq1216">VARCHAR(128)</td>
<td align="left" valign="top" headers="wq1217">The run-time authorization ID.</td>
</tr>
<tr>
<td align="left" valign="top" headers="wq1215">CCSID Information</td>
<td align="left" valign="top" headers="wq1216">
<div class="lines">INTEGER<br />
INTEGER<br />
INTEGER<br />
</div>
<div class="lines">&nbsp;<br />
</div>
<div class="lines">INTEGER<br />
INTEGER<br />
INTEGER<br />
</div>
<div class="lines">&nbsp;<br />
</div>
<div class="lines">INTEGER<br />
INTEGER<br />
INTEGER<br />
</div>
<div class="lines">&nbsp;<br />
</div>
<div class="lines">INTEGER<br />
</div>
<div class="lines">&nbsp;<br />
</div>
<div class="lines">CHAR(8)<br />
</div></td>
<td align="left" valign="top" headers="wq1217">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="wq1215">Target column</td>
<td align="left" valign="top" headers="wq1216">VARCHAR(128)
<div class="lines">VARCHAR(128)<br />
</div>
<div class="lines">VARCHAR(128)<br />
</div></td>
<td align="left" valign="top" headers="wq1217">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="wq1215">Version and release</td>
<td align="left" valign="top" headers="wq1216">CHAR(8)</td>
<td align="left" valign="top" headers="wq1217">The version, release, and modification level
of the database manager.</td>
</tr>
<tr>
<td align="left" valign="top" headers="wq1215">Platform</td>
<td align="left" valign="top" headers="wq1216">INTEGER</td>
<td align="left" valign="top" headers="wq1217">The server's platform type.</td>
</tr>
<tr>
<td align="left" valign="top" headers="wq1215">Number of table function column list entries</td>
<td align="left" valign="top" headers="wq1216">SMALLINT</td>
<td align="left" valign="top" headers="wq1217">The number of non-zero entries in the table
function column list specified in the "Table function column
list" field below.</td>
</tr>
<tr>
<td align="left" valign="top" headers="wq1215">Reserved</td>
<td align="left" valign="top" headers="wq1216">CHAR(24)</td>
<td align="left" valign="top" headers="wq1217">Reserved for future use.</td>
</tr>
<tr>
<td align="left" valign="top" headers="wq1215">Table function column list</td>
<td align="left" valign="top" headers="wq1216">Pointer (16 Bytes)</td>
<td align="left" valign="top" headers="wq1217">This field is a pointer to an array of short
integers which is dynamically allocated by the database manager. Only the first n entries,
where n is specified in the "Number of table function column list entries"
field, are of interest, n may be equal to 0, and is less than or equal to
the number of result columns defined for the function in the RETURNS TABLE
clause. The values correspond to the ordinal numbers of the columns which
this statement needs from the table function. A value of 1 means the first
defined result column, 2 means the second defined result column, and so on.
The values may be in any order. Note that n could be equal to zero for a statement
that is similar to SELECT COUNT(*) FROM TABLE(TF(...)) AS QQ, where no actual
column values are needed by the query.
<p>This array represents an opportunity
for optimization. The function need not return all values for all the result
columns of the table function. Only a subset of the values may be needed in
a particular context, and these are the columns identified (by number) in
the array. Since this optimization may complicate the function logic, the
function can choose to return every defined column.</p></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="idx1750" name="idx1750"></a><a id="idx1751" name="idx1751"></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>
</dd>
<dt class="bold">FENCED <span class="base">or</span> NOT FENCED</dt><a id="idx1752" name="idx1752"></a><a id="idx1753" name="idx1753"></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="idx1754" name="idx1754"></a><a id="idx1755" name="idx1755"></a>
<dd> Specifies whether the function requires a final call (and a separate
first call). For table functions, the call-type argument is ALWAYS present,
regardless of which FINAL CALL option is chosen. The call-type argument indicates
first call, open call, fetch call, close call, or final call.
<dl class="parml">
<dt class="bold">FINAL CALL</dt>
<dd>Specifies that the function requires a final call (and a separate first
call). It also controls when the scratchpad is re-initialized. If NO FINAL
CALL is specified, then the database manager can only make three types of calls to the
table function: open, fetch and close. However, if FINAL CALL is specified,
then in addition to open, fetch and close, a first call and a final call can
be made to the table function.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>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.
</dd>
<dt class="bold">Open Call</dt>
<dd>Specifies a call to open the table function result in this SQL statement.
</dd>
<dt class="bold">Fetch Call</dt>
<dd>Specifies a call to fetch a row from the table function in this SQL
statement.
</dd>
<dt class="bold">Close Call</dt>
<dd>Specifies a call to close the table function result in this SQL statement.
</dd>
<dt class="bold">Final Call</dt>
<dd>Specifies the last call to the function to enable the function to free
resources. 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 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>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.</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>
<dt class="bold">NO FINAL CALL</dt>
<dd>Specifies that the function does not require a final call (and a separate
first call). However the open, fetch, and close calls are still made.
</dd>
</dl>
</dd>
<dt class="bold">DISALLOW PARALLEL</dt><a id="idx1756" name="idx1756"></a>
<dd>Specifies that the function cannot be run in parallel. Table functions
cannot run in parallel.
</dd>
<dt class="bold">SCRATCHPAD</dt><a id="idx1757" name="idx1757"></a><a id="idx1758" name="idx1758"></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. 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, two scratchpads
are allocated for the two references to UDFX in the following SQL statement:</p>
<pre class="xmp"><span class="bold">SELECT</span> A.C1, B.C1
<span class="bold">FROM TABLE(</span>UDFX<span class="bold">(</span>:hv1<span class="bold">)) AS </span>A, <span class="bold">TABLE(</span>UDFX<span class="bold">(</span>:hv1<span class="bold">)) AS</span> B </pre>
</dd>
<dt class="bold"> NO SCRATCHPAD</dt>
<dd>Specifies that the function does not require a persistent memory area.
</dd>
</dl>
</dd>
<dt class="bold">EXTERNAL NAME <var class="pv">external-program-name</var></dt><a id="idx1759" name="idx1759"></a><a id="idx1760" name="idx1760"></a>
<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>
<dt class="bold">CARDINALITY <var class="pv">bigint</var></dt><a id="idx1761" name="idx1761"></a>
<dd>Specifies an estimate of the expected number of rows to be
returned by the function for the database manager to use during optimization. <var class="pv">bigint</var> must be in the range from 0 to 9 223 372 036 854 775
807 inclusive. The database manager assumes a finite value if CARDINALITY
is not specified.
<p>A table function that returns a row every time it is called
and never returns the end-of-table condition has infinite cardinality. A query
that invokes such a function and requires an eventual end-of-table condition
before it can return any data will not return unless interrupted. Table functions
that never return the end-of-table condition should not be used in queries
involving DISTINCT, GROUP BY, or ORDER BY.</p>
</dd>
</dl>
<a name="wq1218"></a>
<h3 id="wq1218"><a href="rbafzmst02.htm#ToC_865">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 SYSIBM, QSYS, or QSYS2.</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 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 value DB2GENRL may be used as a synonym for DB2GENERAL.</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="wq1219"></a>
<h3 id="wq1219"><a href="rbafzmst02.htm#ToC_866">Example</a></h3>
<p>The following creates a table function written to return a row consisting
of a single document identifier column for each known document in a text management
system. The first parameter matches a given subject area and the second parameter
contains a given string.</p>
<p>Within the context of a single session, the UDF will always return the
same table, and therefore it is defined as DETERMINISTIC. Note the RETURNS
clause which defines the output from DOCMATCH. FINAL CALL must be specified
for each table function. In addition, the DISALLOW PARALLEL keyword is added
as table functions cannot operate in parallel. Although the size of the output
for DOCMATCH is highly variable, CARDINALITY 20 is a representative value,
and is specified to help the optimizer.</p>
<pre class="xmp"><span class="bold">CREATE FUNCTION</span> DOCMATCH <span class="bold">(VARCHAR(</span>30<span class="bold">)</span>, <span class="bold">VARCHAR(</span>255<span class="bold">))</span>
<span class="bold">RETURNS TABLE (</span>DOCID <span class="bold">CHAR(</span>16<span class="bold">))</span>
<span class="bold">EXTERNAL NAME</span> 'MYLIB/RAJIV(UDFMATCH)'
<span class="bold">LANGUAGE C</span>
<span class="bold">PARAMETER STYLE DB2SQL</span>
<span class="bold">NO SQL</span>
<span class="bold">DETERMINISTIC</span>
<span class="bold">NO EXTERNAL ACTION</span>
<span class="bold">NOT FENCED</span>
<span class="bold">SCRATCHPAD</span>
<span class="bold">FINAL CALL</span>
<span class="bold">DISALLOW PARALLEL</span>
<span class="bold">CARDINALITY</span> 20</pre>
<hr /><br />
[ <a href="#Top_Of_Page">Top of Page</a> | <a href="rbafzmstcfsce.htm">Previous Page</a> | <a href="rbafzmstcfso.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>