DECLARE PROCEDURE
DECLARE PROCEDURE ステートメントは、外部プロシージャーを定義します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込んで使用します。それ以外の使用法はありません。 このステートメントは、実行可能ステートメントではありません。REXX で指定してはなりません。
権限
不要です。
構文
>>-DECLARE--procedure-name--PROCEDURE---------------------------> >--+-----------------------------------------+--option-list---->< '-(--+-------------------------------+--)-' | .-,-------------------------. | | V | | '-----parameter-declaration---+-'
parameter-declaration .-IN----. |--+-------+--+----------------+--data-type--+-----------------------+--| +-OUT---+ '-parameter-name-' '-AS--+-LOCATOR-------+-' '-INOUT-' '-XML-cast-type-' data-type |--+-built-in-type------+---------------------------------------| '-distinct-type-name-' XML-cast-type .-(--1--)-------. |--+-+-CHARACTER-+--+---------------+-----------------------------------------------+--| | '-CHAR------' '-(--integer--)-' | +-+-+-CHARACTER-+--VARYING-+--(--integer--)--------------------------------------+ | | '-CHAR------' | | | '-VARCHAR----------------' | | .-(--1M--)-------------. | +-----+-+-CHARACTER-+--LARGE OBJECT-+------+----------------------+--+---------+-+ | | '-CHAR------' | '-(--integer--+---+--)-' '-LOCATOR-' | | '-CLOB------------------------' +-K-+ | | +-M-+ | | '-G-' | | .-(--1--)-------. | +---GRAPHIC----+---------------+-------------------------------------------------+ | '-(--integer--)-' | +-+-GRAPHIC VARYING-+--(--integer--)---------------------------------------------+ | '-VARGRAPHIC------' | | .-(--1M--)-------------. | '---DBCLOB----+----------------------+--+---------+------------------------------' '-(--integer--+---+--)-' '-LOCATOR-' +-K-+ +-M-+ '-G-'
option-list (1) |--+-----------------------+------------------------------------> '-LANGUAGE--+-C-------+-' +-C++-----+ +-CL------+ +-COBOL---+ +-COBOLLE-+ +-JAVA----+ +-PLI-----+ +-REXX----+ +-RPG-----+ '-RPGLE---' .-PARAMETER STYLE SQL---------------------. >--+-----------------------------------------+------------------> '-PARAMETER STYLE--+-DB2GENERAL---------+-' +-DB2SQL-------------+ +-GENERAL------------+ +-GENERAL WITH NULLS-+ '-JAVA---------------' .-NOT DETERMINISTIC-. .-MODIFIES SQL DATA-. >--+-------------------+--+-------------------+-----------------> '-DETERMINISTIC-----' +-NO SQL------------+ +-CONTAINS SQL------+ '-READS SQL DATA----' .-CALLED ON NULL INPUT . .-DYNAMIC RESULT SETS--0-------. >--+----------------------+--+------------------------------+---> '-DYNAMIC RESULT SETS--integer-' .-NO DBINFO-. .-FENCED-----. >--+-----------+--+------------+--+-------------------+---------> '-DBINFO----' '-NOT FENCED-' +-PROGRAM TYPE MAIN-+ '-PROGRAM TYPE SUB--' .-EXTERNAL-----------------------------. >--+--------------------------------------+---------------------> '-EXTERNAL NAME--external-program-name-' >--+-------------------------+----------------------------------| '-SPECIFIC--specific-name-'
- オプション文節は、別の順序で指定することができます。
built-in-type |--+-+---SMALLINT---+-------------------------------------------------------------------------------------+--| | +-+-INTEGER-+--+ | | | '-INT-----' | | | '---BIGINT-----' | | .-(5,0)------------------------. | +-+-+-DECIMAL-+-+--+------------------------------+----------------------------------------------------+ | | '-DEC-----' | | .-,0--------. | | | '-+-NUMERIC-+-' '-(--integer--+-----------+--)-' | | '-NUM-----' '-, integer-' | | .-(--53--)------. | +-+-FLOAT--+---------------+-+-------------------------------------------------------------------------+ | | '-(--integer--)-' | | | +-REAL---------------------+ | | | .-PRECISION-. | | | '-DOUBLE--+-----------+----' | | .-(--34--)-. | +---DECFLOAT--+----------+-----------------------------------------------------------------------------+ | '-(--16--)-' | | .-(--1--)-------. | +-+-+-+-CHARACTER-+--+---------------+----------+--+----------------+---------------------+------------+ | | | '-CHAR------' '-(--integer--)-' | +-FOR BIT DATA---+ | | | | '-+-+-CHARACTER-+--VARYING-+--(--integer--)-' +-FOR SBCS DATA--+ | | | | | '-CHAR------' | +-FOR MIXED DATA-+ | | | | '-VARCHAR----------------' '-ccsid-clause---' | | | | .-(--1M--)-------------. | | | '-----+-+-CHARACTER-+--LARGE OBJECT-+------+----------------------+--+----------------+-' | | | '-CHAR------' | '-(--integer--+---+--)-' +-FOR SBCS DATA--+ | | '-CLOB------------------------' +-K-+ +-FOR MIXED DATA-+ | | +-M-+ '-ccsid-clause---' | | '-G-' | | .-(--1--)-------. | +-+---GRAPHIC----+---------------+-------+--+--------------+-------------------------------------------+ | | '-(--integer--)-' | '-ccsid-clause-' | | +-+-GRAPHIC VARYING-+--(--integer--)---+ | | | '-VARGRAPHIC------' | | | | .-(--1M--)-------------. | | | '---DBCLOB----+----------------------+-' | | '-(--integer--+---+--)-' | | +-K-+ | | +-M-+ | | '-G-' | | .-(--1--)-------. | +-+-+-+-NATIONAL CHARACTER-+--+---------------+----------+---------------------+--+------------------+-+ | | | +-NATIONAL CHAR------+ '-(--integer--)-' | | '-normalize-clause-' | | | | '-NCHAR--------------' | | | | | '-+-+-NATIONAL CHARACTER-+--VARYING-+--(--integer--)-' | | | | | +-NATIONAL CHAR------+ | | | | | | '-NCHAR--------------' | | | | | '-NVARCHAR------------------------' | | | | .-(--1M--)-------------. | | | '-----+-+-NATIONAL CHARACTER-+--LARGE OBJECT-+------+----------------------+-' | | | '-NCHAR--------------' | '-(--integer--+---+--)-' | | '-NCLOB--------------------------------' +-K-+ | | +-M-+ | | '-G-' | | .-(--1--)-------. | +-+-+-BINARY--+---------------+---------+-----------------+--------------------------------------------+ | | | '-(--integer--)-' | | | | | '-+-BINARY VARYING-+--(--integer--)-' | | | | '-VARBINARY------' | | | | .-(--1M--)-------------. | | | '---+-BLOB----------------+----+----------------------+-' | | '-BINARY LARGE OBJECT-' '-(--integer--+---+--)-' | | +-K-+ | | +-M-+ | | '-G-' | +-+-DATE-------------------------+---------------------------------------------------------------------+ | | .-(--0--)-. | | | +-TIME--+---------+------------+ | | | .-(--6--)-------. | | | '-TIMESTAMP--+---------------+-' | | '-(--integer--)-' | | .-(--200--)-----. | +---DATALINK--+---------------+--+--------------+------------------------------------------------------+ | '-(--integer--)-' '-ccsid-clause-' | +---ROWID----------------------------------------------------------------------------------------------+ '---XML------------------------------------------------------------------------------------------------' ccsid-clause |--CCSID--integer--+------------------+-------------------------| '-normalize-clause-' normalize-clause .-NOT NORMALIZED-. |--+-NORMALIZED-----+-------------------------------------------|
説明
- procedure-name
- プロシージャーを指定します。この名前は、そのソース・プログラムで宣言されている他のプロシージャーの名前と同じであってはなりません。
- (parameter-declaration,...)
- プロシージャーのパラメーターの数とそれぞれのパラメーターのデータ・タイプを指定します。
プロシージャーに関するパラメーターは、入力専用、出力専用、または
入出力両用に使用できます。
それぞれのパラメーターに名前を指定することができますが、これは必須ではありません。
CREATE PROCEDURE で使用できるパラメーターの最大数は言語のタイプとパラメーター・スタイルによって異なり、以下のようになります。
- JAVA と ILE プログラムおよびサービス・プログラムの場合、最大数は 2000 です。
- OPM プログラムおよび REXX の場合は、以下のようになります。
- PARAMETER STYLE GENERAL を指定した場合、最大数は 255 です。
- PARAMETER STYLE GENERAL WITH NULLS を指定した場合、最大数は 254 です。
- PARAMETER STYLE SQL を指定した場合、最大数は 254 です。
パラメーターの最大数は、その言語で許されるパラメーターの最大数によってさらに制限される可能性があります。
- IN
- パラメーターが、プロシージャーへの入力パラメーターであることを指定します。 プロシージャー内でパラメーターに対する変更が行われても、制御が戻った時点で、呼び出し元の SQL アプリケーションがその変更内容を使用することはできません。1
- OUT
- パラメーターが、プロシージャーから戻される出力パラメーターであることを示します。
データ・リンクやデータ・リンクをベースとした特殊タイプは、出力パラメーターとして指定することはできません。
- INOUT
- パラメーターが、このプロシージャー用の入出力両方のパラメーターであることを指定します。
データ・リンクやデータ・リンクをベースとした特殊タイプは、入出力パラメーターとして指定することはできません。
- parameter-name
- パラメーター名を指定します。この名前は、このプロシージャー 用の他のパラメーター名 と同じものであってはなりません。
- data-type
- パラメーターのデータ・タイプを指定します。
指定するデータ・タイプは LANGUAGE 文節で指定する言語にとって有効なものでなければなりません。 すべてのデータ・タイプが SQL プロシージャーに有効です。 データ・リンクは、外部プロシージャーには無効です。 データ・タイプについて詳しくは、CREATE TABLE、および「SQL プログラミング」のトピック集を参照してください。
CCSID が指定されている場合、プロシージャーに渡される前に、パラメータ ーはその CCSID に変換されます。CCSID が指定されていない場合は、CCSID は、プロシージャーの呼び出し時点における現行サーバーのデフォルトの CCSID によって決まります。
XML タイプのパラメーターでは、XML-cast-type 文節を指定する必要があります。
- AS LOCATOR
- これを指定すると、パラメーターは、実際の値ではなく、値のロケーターになります。AS LOCATOR は、パラメーターに LOB または XML データ・タイプや LOB または XML データ・タイプをベースとする特殊タイプが指定されている場合にのみ、指定することができます。AS LOCATOR を指定した場合、FOR SBCS DATA または FOR MIXED DATA を指定してはなりません。
- AS XML-cast-type
- XML タイプまたは XML タイプに基づく特殊タイプのパラメーターのデータ・タイプとしてこのプロシージャーに渡すデータ・タイプを指定します。LOCATOR を指定する場合は、パラメーターが実際の値ではなく値のロケーターになります。
CCSID 値を指定する場合に、グラフィック・データ・タイプとして指定できるのは、Unicode CCSID 値に限られます。CCSID 値を指定しない場合は、このプロシージャーが含まれているプログラムやモジュールやサービス・プログラムの作成時に、SQL_XML_DATA_CCSID QAQQINI オプションの設定に基づいて CCSID が設定されます。デフォルトの CCSID は 1208 です。このオプションの説明については、XML 値を参照してください。
- DYNAMIC RESULT SETS integer
- プロシージャーから戻すことのできる結果セットの最大数を指定します。
整数 は、ゼロ以上で 32768 より小さくなければなりません。ゼロを指定すると、結果セットは戻されません。
SET RESULT SETS ステートメントを発行した場合は、戻される結果の数は、
このキーワードに指定した結果セットの数と、
SET RESULT SETS ステートメントに指定した結果セットの数のいずれか少ない方です。
結果セットの詳細については、SET RESULT SETSを参照してください。
- LANGUAGE
- その外部プログラムの作成に使用されている言語を指定します。
この文節は、外部プログラムが REXX プロシージャーである場合に必要です。
LANGUAGE の指定がない場合は、その LANGUAGE は該当の外部プログラムに関連するプログラム属性情報によって決定されます。 該当のプログラムに関連するプログラム属性情報によっては認識可能な言語を特定できない場合には、言語は C であると見なされます。
- C
- 外部プログラムは C で作成されます。
- C++
- 外部プログラムは C++ で作成されます。
- CL
- 外部プログラムは CL で作成されます。
- COBOL
- 外部プログラムは COBOL で作成されます。
- COBOLLE
- 外部プログラムは ILE COBOL で作成されます。
- JAVA
- 外部プログラムは JAVA で作成されます。
- PLI
- 外部プログラムは PL/I で作成されます。
- REXX
- 外部プログラムは REXX プロシージャーです。
- RPG
- 外部プログラムは RPG で作成されます。
- RPGLE
- 外部プログラムは ILE RPG で作成されます。
- PARAMETER STYLE
- プロシージャーにパラメーターを渡し、プロシージャーから値を
戻すために使用する規則を指定します。
- SQL
- CALL ステートメントに指定されているパラメーターに加えて、幾つか
の追加パラメーターをプロシージャーに渡すことを指定します。
これらのパラメーターは、次の順序で配列されるように定義されます。
- 最初の N 個のパラメーターは、DECLARE PROCEDURE ステートメント上に指定されるパラメーターです。
- パラメーターの標識変数を表す N 個のパラメーター。
- SQLSTATE の CHAR(5) 出力パラメーター。戻される SQLSTATE は、プロシー
ジャーが成功したかどうかを示します。戻される SQLSTATE は、外部プログ
ラムによって割り当てられたものです。
ユーザーは、関数からエラーまたは警告を戻すために、外部プログラム 内で SQLSTATE を任意の有効な値にセットすることができます。
- 完全修飾プロシージャー名の VARCHAR(517) 入力パラメーター。
- 特定の名前の VARCHAR(128) 入力パラメーター。
- メッセージ・テキストの VARCHAR(1000) 出力パラメーター。
以下の追加のパラメーターを最後のパラメーターとして渡すことができます。これらのパラメーターは、指定の LANGUAGE に基づいて渡されます。 例えば、言語が C または C++ であれば、VARCHAR パラメーターはヌル終了ストリングとして渡されます。 渡されるパラメーターについての詳細は、ライブラリー QSYSINC の該当するソース・ファイル内の組み込み sqludf を参照してください。例えば、C の場合、sqludf は QSYSINC/H で見つかります。- DBINFO が CREATE PROCEDURE ステートメント上に指定されている場合は、dbinfo 構造体のパラメーター。
LANGUAGE JAVA を指定した場合は、PARAMETER STYLE SQL は使用できません。
- DB2GENERAL
- このプロシージャーに、Java™ メソッド用として定義
されているパラメーター引き渡し規則を使用することを指定します。
PARAMETER STYLE DB2GENERAL を指定できるのは、LANGUAGE JAVA を指定した場合のみです。 Java でのパラメーター引き渡しの詳細については、 「IBM® Developer Kit for Java」トピック集を参照してください。
- GENERAL
- このプロシージャーが CALL に指定されているパラメーターを
受け取るようなパラメーター引き渡しメカニズムを使用することを指定します。
標識変数に対し、引数がさらに渡されることはありません。
LANGUAGE JAVA を指定した場合は、PARAMETER STYLE GENERAL は使用できません。
- GENERAL WITH NULLS
- CALL ステートメントで GENERAL に指定されているパラメーター
に加えて、他の引数もプロシージャーに渡すことを指定します。
この追加の引数には、CALL ステートメントの各パラメーターについて
それぞれ 1 つずつエレメントがある標識配列が含まれています。
C では、これは多くの場合、短精度整数の配列です。
標識の処理方法について詳しくは、「SQL プログラミング」トピック集を参照してください。
LANGUAGE JAVA を指定した場合は、PARAMETER STYLE GENERAL WITH NULLS は使用できません。
- JAVA
- このプロシージャーで、Java 言語
および SQLJ ルーチンの仕様に準拠するパラメーター引き渡し規則を使用す
ることを指定します。
INOUT および OUT パラメーターは、値を戻しやすくするために、単一項目配列として渡されます。
移植性を高めるためには、PARAMETER STYLE JAVA 規則を使用する Java プロシージャーを書く必要があります。
PARAMETER STYLE JAVA を指定できるのは、LANGUAGE JAVA を指定した場合だけです。 Java でのパラメーター引き渡しの詳細については、 「IBM Developer Kit for Java」トピック集を参照してください。
パラメーターを渡す方法は、外部関数の言語によって決まります。例えば、C では、VARCHAR または CHAR パラメーターは NULL 文 字で終了するストリングとして渡されます。 詳しくは、「SQL プログラミング」を参照してください。Java ルーチンについては、「IBM Developer Kit for Java」を参照してください。
- SPECIFIC specific-name
- プロシージャーを一意に識別する修飾または非修飾名を指定します。
暗黙的または明示的修飾子も含め、この特定名 には、プロシージャー名 と同じ名前を指定する必要があります。
修飾子を指定しないと、プロシージャー名 の暗黙的または明示的修飾子が使用されます。 修飾子を指定する場合、その修飾子は、プロシージャー名 の明示的または暗黙的修飾子と同じものにする必要があります。
特定名 を指定しなかった場合、その特定名は、プロシージャー名と同じ名前になります。
- DETERMINISTIC または NOT DETERMINISTIC
- このプロシージャーが、同じ IN 引数および INOUT 引数を指定し
て呼び出された場合に、常に同じ結果を戻すかどうかを指定します。
- NOT DETERMINISTIC
- このプロシージャーは、同じ IN 引数および INOUT 引数を指定し て呼び出された場合に、データベース内の参照先データが変更されていなく ても、必ずしも同じ結果を戻すとは限りません。
- DETERMINISTIC
- このプロシージャーは、同じ IN 引数および INOUT 引数を指定し て呼び出された場合に、データベース内の参照先データが変更されていない 限り、常に同じ結果を戻します。
- MODIFIES SQL DATA、READS SQL DATA、CONTAINS SQL、または NO SQL
- SQL ステートメントがある場合に、このプロシージャーまたはこの
プロシージャーから呼び出されたルーチンの中で、どの SQL ステートメント
を実行できるかを指定します。
デフォルトは、MODIFIES SQL
DATA です。各データ・アクセス指示の下で実行できる SQL ステートメントの詳細な
リストについては、SQL ステートメントの特性を参照してください。
- MODIFIES SQL DATA
- このプロシージャーで、どのプロシージャーでもサポートされない ステートメントを除くすべての SQL ステートメントを実行できることを指定します。
- READS SQL DATA
- このプロシージャーに、SQL データを変更しない SQL ステートメントを組み込めることを指定します。
- CONTAINS SQL
- このプロシージャーで、SQL データの読み取りも変更も行わない SQL ステートメントを実行できることを指定します。
- NO SQL
- このプロシージャーではどの SQL ステートメントも実行できないことを指定します。
- CALLED ON NULL INPUT
- 引数値のいずれかまたは全部が NULL である場合、関数を呼び出して、 その関数に NULL 引数値のテストを行わせることを指定します。 関数は NULL または非 NULL 値を戻すことができます。
- FENCED または NOT FENCED
- このパラメーターは、他のプロダクトとの互換性を保持するために許可されており、DB2® for i で使用されることはありません。
- PROGRAM TYPE MAIN または PROGRAM TYPE SUB
- 他の製品との互換性を備えるために、このパラメーターが許可されています。
これは、ルーチンの外部プログラムが、プログラム (*PGM) であるか、サービス・プログラム (*SRVPGM) のプロシージャーであるかを示します。
- PROGRAM TYPE MAIN
- ルーチンがプログラムのメインエントリー・ポイントとして実行することを指定します。 外部プログラムは、*PGM オブジェクトでなければなりません。
- PROGRAM TYPE SUB
- プロシージャーがサービス・プログラムのプロシージャーとして実行することを指定します。 外部プログラムは、*SRVPGM オブジェクトでなければなりません。
- DBINFO
- データベース・マネージャーは、状況情報が入っている
構造体をプロシージャーに渡す必要があることを指定します。
表 1 は、DBINFO 構造体の説明を示しています。
DBINFO 構造体についての詳しい情報は、
ライブラリー QSYSINC 内の該当するソース・ファイルの組み込み sqludf に入っています。
例えば、C の場合、sqludf は QSYSINC/H で見つかります。
DBINFO は、PARAMETER STYLE DB2SQL でのみ許可されます。
表 1. DBINFO フィールド フィールド データ・タイプ 説明 リレーショナル・データベース VARCHAR(128) 現行サーバーの名前 権限 ID VARCHAR(128) 実行時権限 ID CCSID 情報 INTEGER
INTEGER
INTEGERINTEGER
INTEGER
INTEGERINTEGER
INTEGER
INTEGERINTEGER
CHAR(8)
ジョブの CCSID 情報。3 つの CCSID が 3 セット戻されます。各セット内の 3 つの CCSID を識別する情報は、次のとおりです。 - SBCS CCSID
- DBCS CCSID
- 混合 CCSID
CCSID の各設定は、異なるエンコード・スキーム (EBCDIC、ASCII、およびユニコード) のためのものです。
CREATE PROCEDURE ステートメントのパラメーターの 1 つとして明示的に CCSID を指定していない場合は、入力ストリングは、プロシージャーの実行時にジョブ の CCSID でコード化されるものと見なされます。 入力ストリングの CCSID がパラメーターの CCSID と同じではない場合 は、この外部プロシージャーに渡される入力ストリングは、外部プログラムの呼び出し の前に変換されます。
ターゲット列 VARCHAR(128) VARCHAR(128)
VARCHAR(128)
プロシージャーへの呼び出しには適用されません。 バージョンとリリース CHAR(8) データベース・マネージャーのバージョン、リリース、および修正レベル。 プラットフォーム INTEGER サーバーのプラットフォーム・タイプ。 - EXTERNAL NAME 外部プログラム名
- 該当のプロシージャーが CALL ステートメントによって呼び出される時点で実行されるプログラムを指定します。
このプログラム名は、アプリケーション・サーバーに存在するプログラムを識別していなければなりません。このプログラムは、ILE サービス・プログラムであってはなりません。
この名前の妥当性は、アプリケーション・サーバーで検査されます。名前の形式が正しくない場合、エラーが戻されます。
外部プログラム名の指定がない場合、外部プログラム名は該当のプロシージャー名と同じであると見なされます。
注
DECLARE PROCEDURE の有効範囲: プロシージャー名 の有効範囲は、それが定義されているソース・プログラムです。つまり、プリコンパイラーに実行依頼されるプログラムです。したがって、別個にコンパイルされた他のプログラムやモジュールから呼び出されるプログラムは、呼び出し側プログラムの DECLARE PROCEDURE ステートメントからの属性を使用しません。
DECLARE PROCEDURE 規則: DECLARE PROCEDURE ステートメントは、そのプロシージャーを参照するすべての CALL ステートメントよりも前に入れなければなりません。
DECLARE PROCEDURE ステートメントが適用されるのは、静的 CALL ステートメントだけです。 動的に準備された CALL ステートメント、またはプロシージャー名が変数によって識別されている CALL ステートメントには適用されません。
代替構文: 以下のキーワードは、旧リリースとの互換性を維持するためにサポートされている同義語です。 これらのキーワードは標準キーワードではないので、原則として使用しないようにしてください。
- キーワード VARIANT と NOT VARIANT は、NOT DETERMINISTIC と DETERMINISTIC の同義語として使用することができます。
- キーワード NULL CALL は、CALLED ON NULL INPUT の同義語として使用できます。
- キーワード SIMPLE CALL は、GENERAL の同義語として使用できます。
- DB2GENERAL の同義語として、値 DB2GENRL を使用できます。
- PARAMETER STYLE 文節のキーワード PARAMETER STYLE はオプションです。
- PARAMETER STYLE SQL の同義語として、キーワード PARAMETER STYLE DB2SQL を使用できます。
例
外部プロシージャー PROC1 を、C プログラムの中で宣言します。 CALL ステートメントを使用してこのプロシージャーを呼び出すと、LIB1 ライブラリーの中の PGM1 という名前の COBOL プログラムが呼び出されます。
EXEC SQL
DECLARE PROC1 PROCEDURE
(CHAR(10), CHAR(10))
EXTERNAL NAME LIB1.PGM1
LANGUAGE COBOL GENERAL;
EXEC SQL
CALL PROC1 ('FIRSTNAME ','LASTNAME ');