CREATE PROCEDURE (外部)
CREATE PROCEDURE (外部) ステートメントは、現行サーバーで外部プロシージャーを定義します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むことができ、また対話式に呼び出すこともできます。 これは、動的に準備できる実行可能ステートメントです。
権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- SYSPROCS カタログ・ビューと SYSPARMS カタログ表の場合
- 該当の表に対する INSERT 特権、および
- スキーマ QSYS2 に対する USAGE 特権
- データベース管理者権限
外部プログラムやサービス・プログラムが存在している 場合、このステートメントの権限 ID が保持する特権には、少なくとも次の いずれか 1 つを含める必要があります。
- SQL ステートメントで参照された外部プログラムやサービス・プログラムの場合
- その外部プログラムやサービス・プログラムが含まれるスキーマに対する USAGE 特権
- その外部プログラムやサービス・プログラムに対するシステム権限の *EXECUTE。
- そのプログラムやサービス・プログラムに対するシステム権限の *CHANGE。システムには、プログラムまたはサービス・プログラム・オブジェクトを更新し、プロシージャーを別のシステムに保管/復元するために必要な情報を入れる場合にこの権限が必要となります。 ユーザーにこの権限が与えられていない場合、プロシージャーは同じように作成されますが、プログラムまたはサービス・プログラム・オブジェクトは更新されません。
- データベース管理者権限
特殊タイプまたは配列タイプを参照する場合は、ステートメントの権限 ID によって保持される特権に、少なくとも次のいずれか 1 つが含まれなければなりません。
- ステートメント内で識別された、それぞれの特殊タイプまたは配列タイプごとに、
- そのタイプに対する USAGE 特権、および
- 特殊タイプまたは配列タイプが含まれるスキーマに対する USAGE 特権
- データベース管理者権限
既存のプロシージャーに置き換えるには、ステートメントの権限 ID が保持する特権に、次のうち少なくともいずれか 1 つを含める必要があります。
- 次のシステム権限
- このプロシージャーに関連したプログラム・オブジェクトに対する *OBJMGT システム権限
- このプロシージャーを削除するために必要な全権限
- SYSPROCS カタログ・ビューと SYSPARMS カタログ表に対する *READ システム権限
- データベース管理者権限
SQL 特権に対応するシステム権限の説明については、『関数またはプロシージャーへの権限を検査する際の対応するシステム権限』および 『特殊タイプへの権限を検査する際の対応するシステム権限』を参照してください。
構文
>>-CREATE--+------------+--PROCEDURE--procedure-name------------> '-OR REPLACE-' >--+-----------------------------------------+--option-list-----> '-(--+-------------------------------+--)-' | .-,-------------------------. | | V | | '-----parameter-declaration---+-' >--+----------------------+------------------------------------>< '-SET OPTION-statement-'
parameter-declaration .-IN----. |--+-------+--+----------------+--data-type--+-----------------------+--+----------------+--| +-OUT---+ '-parameter-name-' '-AS--+-LOCATOR-------+-' '-default-clause-' '-INOUT-' '-XML-cast-type-' data-type |--+-built-in-type------+---------------------------------------| +-distinct-type-name-+ '-array-type-name----' default-clause |--DEFAULT--+-NULL-------------+--------------------------------| +-constant---------+ +-special-register-+ +-global-variable--+ '-(--expression--)-' XML-cast-type .-(--1--)-------. |--+-+-+-CHARACTER-+--+---------------+--+--------------+-----------------------------------------------+-+--| | | '-CHAR------' '-(--integer--)-' '-ccsid-clause-' | | | +-+-+-CHARACTER-+--VARYING-+--(--integer--)--+--------------+--------------------------------------+ | | | | '-CHAR------' | '-ccsid-clause-' | | | | '-VARCHAR----------------' | | | | .-(--1M--)-------------. | | | '-----+-+-CHARACTER-+--LARGE OBJECT-+------+----------------------+--+--------------+--+---------+-' | | | '-CHAR------' | '-(--integer--+---+--)-' '-ccsid-clause-' '-LOCATOR-' | | '-CLOB------------------------' +-K-+ | | +-M-+ | | '-G-' | | .-(--1--)-------. | +-+---GRAPHIC----+---------------+--+--------------+--------------------+------------------------------+ | | '-(--integer--)-' '-ccsid-clause-' | | | +-+-GRAPHIC VARYING-+--(--integer--)--+--------------+----------------+ | | | '-VARGRAPHIC------' '-ccsid-clause-' | | | | .-(--1M--)-------------. | | | '---DBCLOB----+----------------------+--+--------------+--+---------+-' | | '-(--integer--+---+--)-' '-ccsid-clause-' '-LOCATOR-' | | +-K-+ | | +-M-+ | | '-G-' | | .-(--1--)-------. | '-+-+-BINARY--+---------------+---------+------------------------------+-------------------------------' | | '-(--integer--)-' | | | '-+-BINARY VARYING-+--(--integer--)-' | | '-VARBINARY------' | | .-(--1M--)-------------. | '---+-BLOB----------------+----+----------------------+--+---------+-' '-BINARY LARGE OBJECT-' '-(--integer--+---+--)-' '-LOCATOR-' +-K-+ +-M-+ '-G-'
option-list (1) |--+-----------------------+------------------------------------> '-LANGUAGE--+-C-------+-' +-C++-----+ +-CL------+ +-COBOL---+ +-COBOLLE-+ +-JAVA----+ +-PLI-----+ +-REXX----+ +-RPG-----+ '-RPGLE---' .-PARAMETER STYLE SQL--------------------. >--+----------------------------------------+-------------------> '-+-PARAMETER STYLE GENERAL------------+-' +-PARAMETER STYLE GENERAL WITH NULLS-+ +-PARAMETER STYLE JAVA---------------+ '-PARAMETER STYLE DB2GENERAL---------' .-NOT DETERMINISTIC-. .-MODIFIES SQL DATA-. >--+-------------------+--+-------------------+-----------------> '-DETERMINISTIC-----' +-READS SQL DATA----+ +-CONTAINS SQL------+ '-NO SQL------------' .-CALLED ON NULL INPUT . .-INHERIT SPECIAL REGISTERS-. >--+----------------------+--+---------------------------+------> .-DYNAMIC RESULT SETS--0-------. .-NO DBINFO-. >--+------------------------------+--+-----------+--------------> '-DYNAMIC RESULT SETS--integer-' '-DBINFO----' .-FENCED-----. >--+---------------------+--+------------+----------------------> +-DISALLOW DEBUG MODE-+ '-NOT FENCED-' +-ALLOW DEBUG MODE----+ '-DISABLE DEBUG MODE--' >--+-------------------+----------------------------------------> +-PROGRAM TYPE MAIN-+ '-PROGRAM TYPE SUB--' .-EXTERNAL-----------------------------. >--+--------------------------------------+---------------------> '-EXTERNAL NAME--external-program-name-' .-OLD SAVEPOINT LEVEL-. >--+-------------------------+--+---------------------+---------> '-SPECIFIC--specific-name-' '-NEW SAVEPOINT LEVEL-' .-COMMIT ON RETURN NO--. >--+-+----------------------+-+---------------------------------| | '-COMMIT ON RETURN YES-' | '-AUTONOMOUS---------------'
- オプション文節は、別の順序で指定することができます。
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--)-' | +---ROWID----------------------------------------------------------------------------------------------+ '---XML------------------------------------------------------------------------------------------------'
ccsid-clause |--CCSID--integer--+------------------+-------------------------| '-normalize-clause-' normalize-clause .-NOT NORMALIZED-. |--+-NORMALIZED-----+-------------------------------------------|
説明
- OR REPLACE
- 現行サーバーにこのプロシージャーの定義が存在する場合に、その定義を置き換える、という動作を指定します。実際には、カタログで既存の定義を削除してから新しい定義に置き換える、という動作になりますが、例外として、このプロシージャーに対して与えられていた特権は影響を受けません。現行サーバーにこのプロシージャーの定義が存在しなければ、このオプションは無視されます。既存のプロシージャーを置き換えるには、新しい定義の specific-name および procedure-name が古い定義の specific-name および procedure-name と同じであるか、新しい定義のシグニチャーが古い定義のシグニチャーと一致している必要があります。そうでなければ、新しいプロシージャーが作成されます。
- procedure-name
- プロシージャーを指定します。名前、スキーマ名、パラメーターの数
の組み合わせで、現行サーバーに存在しているプロシージャーを識別してはなりません。
SQL 命名の場合、プロシージャーは、暗黙または明示修飾子で指定されたスキーマ内に作成されます。
システム命名の場合、プロシージャーは、修飾子によって指定されたスキーマ内に作成されます。 修飾子を指定しなかった場合:
- CURRENT SCHEMA 特殊レジスターの値が *LIBL である場合、プロシージャーは、 現行ライブラリー (*CURLIB) 内に作成されます。
- そうでない場合、プロシージャーは現行スキーマ内に作成されます。
- (parameter-declaration,...)
- プロシージャーのパラメーターの数とそれぞれのパラメーターのデータ・タイプを指定します。
プロシージャーに関するパラメーターは、入力専用、出力専用、または
入出力両用に使用できます。
すべてのパラメーターが NULL 可能です。それぞれのパラメーターに名前を指定することができますが、これは必須ではありません。
CREATE PROCEDURE で使用できるパラメーターの最大数は言語のタイプとパラメーター・スタイルによって異なり、以下のようになります。
- JAVA と ILE プログラムおよびサービス・プログラムの場合、最大数は 2000 です。
- OPM プログラムおよび REXX の場合は、以下のようになります。
- PARAMETER STYLE GENERAL を指定した場合、最大数は 255 です。
- PARAMETER STYLE GENERAL WITH NULLS を指定した場合、最大数は 254 です。
- PARAMETER STYLE SQL を指定した場合、最大数は 254 です。
パラメーターの最大数は、その言語で許されるパラメーターの最大数によってさらに制限される可能性があります。
- IN
- パラメーターが、プロシージャーへの入力パラメーターであることを指定します。 プロシージャー内でパラメーターに対する変更が行われても、制御が戻った 後で、呼び出し元の SQL アプリケーションがその変更内容を使用することは できません。1デフォルトは IN です。
- OUT
- パラメーターが、プロシージャーから戻される出力パラメーターであることを示します。
データ・リンクやデータ・リンクをベースとした特殊タイプは、出力パラメーターとして指定することはできません。
- INOUT
- パラメーターが、このプロシージャー用の入出力両方のパラメーターであることを指定します。
INOUT パラメーター
がデフォルトと共に定義されていて、プロシージャーの呼び出し時にそのデフォルトが使用される場合、
パラメーターに戻される値はありません。
データ・リンクやデータ・リンクをベースとした特殊タイプは、入出力パラメーターとして指定することはできません。
- parameter-name
- パラメーター名を指定します。この名前は、このプロシージャー 用の他のパラメーター名 と同じものであってはなりません。
- data-type
- パラメーターのデータ・タイプを指定します。
- built-in-type
- 組み込みデータ・タイプを指定します。 それぞれの組み込みデータ・タイプの詳細については、CREATE TABLEを参照してください。
- distinct-type-name
- 特殊タイプを指定します。パラメーターの長さ、精度、位取り、コード化スキームの属性は、CREATE TYPE (特殊) で指定する特殊タイプのソース・タイプの属性になります。
特殊タイプの名前が修飾されていない場合、データベース・マネージャーは、SQL パス上のスキーマを検索することでそのスキーマ名を解決します。
- 配列タイプ名
- 配列タイプを指定します。配列タイプは、LANGUAGE JAVA でのみサポートされています。Java™ ストアード・プロシージャーのパラメーターとして配列タイプを使用する場合は、パラメーター・スタイルが JAVA になっていなければなりません。
配列タイプの名前が修飾されていない場合、データベース・マネージャーは、SQL パス上のスキーマを検索することでそのスキーマ名を解決します。
CCSID が指定されている場合、プロシージャーに渡される前に、パラメータ ーはその CCSID に変換されます。CCSID が指定されていない場合は、CCSID は、プロシージャーの呼び出し時点における現行サーバーのデフォルトの CCSID によって決まります。
日付、時刻、およびタイム・スタンプの各パラメーターは、ISO 形式の文字ストリングとしてプロシージャーに渡されます。
データ・タイプによってはすべての言語ではサポートされていないものもあります。 SQL データ・タイプとホスト言語データ・タイプのマッピングについての詳細は、「組み込み SQL プログラミング」トピック集を参照してください。組み込みデータ・タイプの仕様は、プロシージャーの作成に使用する言語に対応していれば、指定することができます。
XML タイプのパラメーターでは、XML-cast-type 文節または AS LOCATOR 文節を指定する必要があります。
- 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 値を参照してください。
- default
- パラメーターのデフォルト値を指定します。デフォルト値は、定数、特殊レジスター、グローバル変数、式、またはキーワード NULL にすることができます。式は、集約関数および列名を含まない、式で
定義されている任意の式です。デフォルト値が指定されていない場合、パラメーターにデフォルト値がないため、プロシージャーの呼び出し時に省略できません。式ストリングの
最大長は 64K です。
デフォルトの式で SQL データを変更することはできません。式は、 パラメーターのデータ・タイプに対して割り当ての互換性がなければなりません 。デフォルト式の中で参照されるすべてのオブジェクト は、プロシージャーが作成されるときに存在している必要があります。プロシージャーが呼び出されると、デフォルトは起動側の権限を使用して 評価されます。
デフォルト式内でリスト中の数値定数を区切る区切り記号として 使用するコンマの後には、スペースが 1 つ必要です。
デフォルトを指定できません。- OUT パラメーターに対して
- 配列タイプのパラメーターに対して
- 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 個のパラメーターは、CREATE 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 言語および ISO/IEC FCD 9075-13:2003
「Information technology - Database languages - SQL - Part 13: Java Routines and Types (SQL/JRT)」仕様に準拠するパラメーター引き渡し規則を使用することを指定します。
INOUT および OUT パラメーターは、値を戻しやすくするために、単一項目配列として渡されます。
PARAMETER STYLE JAVA を指定できるのは、LANGUAGE JAVA を指定した場合だけです。 移植性を高めるためには、PARAMETER STYLE JAVA 規則を使用する Java プロシージャーを書く必要があります。 Java でのパラメーター引き渡しの詳細については、 「IBM Developer Kit for Java」トピック集を参照してください。
パラメーターを渡す方法は、外部プロシージャーの言語によって決まります。例えば、C では、VARCHAR または CHAR パラメーターは NULL 文 字で終了するストリングとして渡されます。 詳しくは、「SQL プログラミング」のトピック集を参照してください。 Java ルーチンについては、「IBM Developer Kit for Java」のトピック集を参照してください。
- DETERMINISTIC または NOT DETERMINISTIC
- このプロシージャーが、同じ IN 引数および INOUT 引数を指定し
て呼び出された場合に、常に同じ結果を戻すかどうかを指定します。
デフォルトは NOT DETERMINISTIC です。
- NOT DETERMINISTIC
- このプロシージャーは、同じ IN 引数および INOUT 引数を指定し て呼び出された場合に、データベース内の参照先データが変更されていなく ても、必ずしも同じ結果を戻すとは限りません。
- DETERMINISTIC
- このプロシージャーは、同じ IN 引数および INOUT 引数を指定し て呼び出された場合に、データベース内の参照先データが変更されていない 限り、常に同じ結果を戻します。
- MODIFIES SQL DATA、READS SQL DATA、CONTAINS SQL、または NO SQL
- このプロシージャーが実行できる SQL ステートメントおよびネストされたルーチンの種別を指定します。データベース・マネージャーは、プロシージャーと、プロシージャーからローカルで呼び出すすべてのルーチンが発行する SQL ステートメントが、この指定と整合しているかどうかを検査します。ネストされたリモート・ルーチンが呼び出された場合、検査は実行されません。
各ステートメントの分類については、SQL ステートメントの特性を参照してください。
デフォルトは、MODIFIES SQL
DATA です。このオプションは、
パラメーター・デフォルト式では無視されます。
- MODIFIES SQL DATA
- このプロシージャーで、どのプロシージャーでもサポートされない ステートメントを除くすべての SQL ステートメントを実行できることを指定します。
- READS SQL DATA
- このプロシージャーが、データ・アクセス種別 READS SQL DATA、CONTAINS SQL、または NO SQL を指定したステートメントを実行できるように指定します。
- CONTAINS SQL
- このプロシージャーが、データ・アクセス種別 CONTAINS SQL または NO SQL のステートメントのみを実行できるように指定します。
- NO SQL
- このプロシージャーが、データ・アクセス種別 NO SQL の SQL ステートメントのみを実行できるように指定します。
- CALLED ON NULL INPUT
- 引数値のいずれかまたは全部がヌルである場合にプロシージャーを呼び出すことを指定します。この指定は、ヌル引数値のテストを行うようにプロシージャーをコーディングする必要があります。
- INHERIT SPECIAL REGISTERS
- 特殊レジスターの既存の値は、プロシージャーに入った後に継承されることを示します。
- FENCED または NOT FENCED
- このパラメーターは、他のプロダクトとの互換性を保持するために許可されており、Db2® for i で使用されることはありません。
- DYNAMIC RESULT SETS integer
- プロシージャーから戻すことのできる結果セットの最大数を指定します。
integer の最小値はゼロ、最大値は 32767 です。
DYNAMIC RESULT SETS 文節を指定しなければ、プロシージャーの終了時にオープンしたままになっているすべてのカーソルの結果セットが返されます。
結果セットは、対応するカーソルがオープンした順序で返されます。ただし、プロシージャーで SET RESULT SETS ステートメントを実行する場合は例外です。プロシージャーの終了時に結果セットのためにオープンしたままになっているカーソルの数が、DYNAMIC RESULT SETS 文節で指定した最大数を超えている場合は、CALL ステートメントで警告が返され、DYNAMIC RESULT SETS 文節で指定した数の結果セットが返されます。
SET RESULT SETS ステートメントを発行した場合は、戻される結果の数は、 このキーワードに指定した結果セットの数と、 SET RESULT SETS ステートメントに指定した結果セットの数のいずれか少ない方です。 SET RESULT SETS ステートメントに結果セットの最大数よりも大きい値が指定された場合、警告が戻されます。 RETURN TO CLIENT 属性を持つカーソルからの結果セットは、 最外部プロシージャーの結果セットの数に含まれます。
結果セットを戻すのにカーソルが使用され、カーソルがスクロール可能である場合、 結果セットはスクロール可能です。 結果セットを戻すのにカーソルが使用された場合、結果セットはカーソル位 置から始まります。つまり、5 つの FETCH NEXT 操作が実行された後、プロシージャーから戻った場合、結果セットは、結果セットの 6 行目から始まります。
カーソルの結果セットが返されるのは、外部プログラムに ACTGRP(*NEW) の属性がない場合に限られます。
結果セットの詳細については、SET RESULT SETSを参照してください。
- DISALLOW DEBUG MODE、ALLOW DEBUG MODE、または DISABLE DEBUG MODE
-
プロシージャーを Unified Debugger でデバッグできるように作成するかどうかを示します。DEBUG MODE が指定されない場合、プロシージャーは CURRENT DEBUG MODE 特殊レジスターで指定されるデバッグ・モードを使用して作成されます。
DEBUG MODE を指定できるのは、LANGUAGE JAVA を指定した場合のみです。
- DISALLOW DEBUG MODE
- プロシージャーは Unified Debugger でデバッグできません。プロシージャーの DEBUG MODE 属性が DISALLOW の場合、後でプロシージャーを変更してデバッグ・モード属性を変えることができます。
- ALLOW DEBUG MODE
- プロシージャーは Unified Debugger でデバッグすることができます。プロシージャーの DEBUG MODE 属性が ALLOW の場合、後でプロシージャーを変更してデバッグ・モード属性を変えることができます。
- DISABLE DEBUG MODE
- プロシージャーは Unified Debugger でデバッグできません。プロシージャーの DEBUG MODE 属性が DISABLE の場合、後でプロシージャーを変更してデバッグ・モード属性を変えることはできません。
- PROGRAM TYPE
- 他の製品との互換性を備えるために、このパラメーターが許可されています。
これは、ルーチンの外部プログラムが、プログラム (*PGM) であるか、サービス・プログラム (*SRVPGM) のプロシージャーであるかを示します。
- SUB
- プロシージャーがサービス・プログラムのプロシージャーとして実行することを指定します。 外部プログラムは、*SRVPGM オブジェクトでなければなりません。
- MAIN
- ルーチンがプログラムのメインエントリー・ポイントとして実行することを指定します。 外部プログラムは、*PGM オブジェクトでなければなりません。
- DBINFO
- プロシージャーを呼び出すときに、追加の状況情報を渡すかどうかを指定します。デフォルトは NO DBINFO です。
- NO DBINFO
- 追加情報は渡されません。
- DBINFO
- プロシージャーを呼び出すときに、追加の引数が渡されます。
この引数は、現行サーバーの名前、アプリケーション実行時許可 ID、およびプロシージャーを呼び出したデータベース・マネージャーのバージョンおよびリリースの ID などの情報を含む構造体です。詳細については、表 1を参照してください。 DBINFO 構造体についての詳しい情報は、 ライブラリー QSYSINC 内の該当するソース・ファイルの組み込み sqludf に入っています。 例えば、C の場合、sqludf は QSYSINC/H で見つかります。
DBINFO は、PARAMETER STYLE SQL でのみ許可されます。
表 1. DBINFO フィールド フィールド データ・タイプ 説明 リレーショナル・データベース VARCHAR(128) 現行サーバーの名前 権限 ID VARCHAR(128) 実行時権限 ID CCSID 情報 INTEGER
INTEGER
INTEGERINTEGER
INTEGER
INTEGERINTEGER
INTEGER
INTEGERINTEGERCHAR(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
- CREATE PROCEDURE ステートメントを使用して、外部プログラミング言語によるコードに基づいた新規プロシージャーを定義するように指定します。NAME 文節を指定しない場合は、「NAME procedure-name」が使用されます。その場合、procedure-name は 8 文字以下でなければなりません。LANGUAGE JAVA プロシージャーの場合、デフォルト名は Java プロシージャーに対して有効でないので、NAME 文節が必要です。
- NAME external-program-name
- 該当のプロシージャーが CALL ステートメントによって呼び出される時点で実行されるプログラムまたはサービス・プログラムを指定します。
このプログラム名は、プロシージャーの呼び出し時点で該当のアプリケーション・サーバーに
存在しているプログラムまたはサービス・プログラムを識別するものでなければなりません。
命名オプションが *SYS であり、その名前が修飾されていない場合:
- プロシージャーの呼び出し時に 現行パスを使用して該当のプログラムを検索します。
- COMMENT、GRANT、LABEL、REVOKE の各操作をそのプロシージャーで実行する時点で、*LIBL を使用して対象のプログラムまたはサービス・プログラムを検索します。
この名前の妥当性は、アプリケーション・サーバーで検査されます。名前の形式が正しくない場合、エラーが戻されます。
この外部プログラムまたはサービス・プログラムは、 プロシージャーの作成時点に存在している必要はありませんが、 プロシージャーの呼び出し時点には存在していなければなりません。
CONNECT、SET CONNECTION、RELEASE、DISCONNECT、および SET TRANSACTION ステートメントは、 リモート・アプリケーション・サーバー上で実行中のプロシージャー内で使用することはできません。 COMMIT および ROLLBACK ステートメントは、 ATOMIC SQL プロシージャーまたはリモート・アプリケーション・サーバーへの接続上で実行中のプロシージャー内で使用することはできません。
- SPECIFIC specific-name
- 関数の固有名を指定します。特定名の詳細については、CREATE PROCEDUREの『プロシージャーに特定の名前を指定する』を参照してください。
- OLD SAVEPOINT LEVEL または NEW SAVEPOINT LEVEL
- このプロシージャーに入ったときに、新しいセーブポイント・レベルを
作成するかどうかを指定します。
- OLD SAVEPOINT LEVEL
- 新しいセーブポイント・レベルを作成しません。 このプロシージャー内で、OLD SAVEPOINT LEVEL が暗黙的または明示的に指 定された SAVEPOINT ステートメントが発行された場合、SAVEPOINT ステート メントはプロシージャーの呼び出し元と同じセーブポイント・レベルで作成されます。 これはデフォルトです。
- NEW SAVEPOINT LEVEL
- このプロシージャーに入ったときに、新しいセーブポイント・レベルが 作成されます。 プロシージャー内に設定されているすべてのセーブポイントは、この プロシージャーが呼び出されたレベルより深くネストされた セーブポイント・レベルで作成されます。 したがって、プロシージャー内のどの新規セーブポイントも、同じ名前を持つ 上位のセーブポイント・レベル (例えば呼び出し側プログラムまたはサービス・プログラムのセーブポイント ・レベル) で設定されている既存のセーブポイントと競合することはありません。
- COMMIT ON RETURN
- データベース・マネージャーが、プロシージャーからの戻りと同時にトランザクション
をコミットするかどうかを指定します。
- NO
- データベース・マネージャーは、プロシージャーから戻ったときにコミットを行いません。 NO がデフォルトです。
- YES
- データベース・マネージャーは、プロシージャーから正常に戻ったときにコミットを行います。
プロシージャーの戻り時にエラーがあった場合は、コミットは行われません。
コミット操作の対象には、呼び出し側アプリケーション・プロセスおよびこの プロシージャーが行う作業が含まれます。2
プロシージャーが結果セットを戻す場合に、結果セットに関連したカーソル をコミット後に使用できるようにするには、カーソルを WITH HOLD として 定義しておく必要があります。
- AUTONOMOUS
- 呼び出し側アプリケーションから独立した作業単位でプロシージャーが実行されることを 指定します。このオプションが指定されていると、 データベースは常にプロシージャーから戻された SQLSTATE に 基づいて、自律型プロシージャーのトランザクション作業をコミット またはロールバックします。SQLSTATE が無条件な成功または警告を 示している場合、トランザクションはコミットされます。他のすべての SQLSTATE の 場合、自律型プロシージャーの作業単位はロールバックされます。
- 自律型プロシージャーの内部からの、トリガー、関数、またはプロシージャーの起動 は、そのトリガー、関数、またはプロシージャーが、別の活動化グループの下で実行するように明示的に作成されたものでない限り、 自律型プロシージャーの作業単位の一部になります。
- 自律型プロシージャーを別の自律型プロシージャーから直接または間接に呼び出すことはできません。
- AUTONOMOUS を指定する場合、DYNAMIC RESULT SETS 0 を指定する必要があります。
- SET OPTION-statement
- パラメーター・デフォルトに使用されるオプションを指定します。
各オプションのデフォルト値は、作成時に有効だったオプションによって異なります。詳しくは、SET OPTIONを参照してください。
デフォルト値式を処理するときには、 オプション ALWCPYDTA、CONACC、DATFMT、DATSEP、DECFLTRND、DECMPT、
DECRESULT、DFTRDBCOL、 LANGID、SQLCURRULE、SQLPATH、SRTSEQ、TGTRLS、TIMFMT、および TIMSEP が使用されます。オプション CNULRQD、CNULIGN、COMPILEOPT、EXTIND、NAMING、SQLCA は、CREATE PROCEDURE ステートメントでは使用できません。 他のオプションは、受け入れられますが、無視されます。
注
プロシージャー定義に関する一般考慮事項: プロシージャーの定義に関する一般情報については、CREATE PROCEDUREを参照してください。
言語に関する考慮事項: プロシージャー用プログラムの作成に必要な情報については、「組み込み SQL プログラミング」を参照してください。
- 既存のコメントまたはラベルは破棄されます。
- 別の外部プログラムを指定する場合、
- 権限を持つユーザーは新しいプログラムにコピーされません。
- ジャーナル監査は変更されません。
- 上記以外の場合、
- 権限を持つユーザーは維持されます。オブジェクト所有者は変更されない可能性があります。
- 現在のジャーナル監査は変更されません。
エラー処理に関する考慮事項: プロシージャーによってエラーが戻されると、プロシージャーに渡された引数の値のうち OUT パラメーターに対応するものは未定義になり、INOUT パラメーターに対応するものは変わりません。
プロシージャーの作成: ILE 外部プログラムまたはサービス・プログラムに関連した 外部プロシージャーが作成されると、その関数に関連したプログラムや サービス・プログラムのオブジェクトへのプロシージャーの属性の保管が試行されます。 *PGM または *SRVPGM オブジェクトが保管された後、このシステムまたは別のシステムに 復元されると、属性が使用されてカタログが更新されます。
外部プロシージャーの場合は、次の制約の範囲内で属性を保管することができます。
- 外部プログラム・ライブラリーは、QSYS であってはなりません。
- 外部プログラムは、CREATE PROCEDURE ステートメントの発行時に存在していなければなりません。
システム命名が指定され、外部プログラム名が修飾されない場合は、外部プログラムはライブラリー・リストで検出されなければなりません。
- 外部プログラムは、ILE *PGM オブジェクトか *SRVPGM オブジェクトにする必要があります。
- 外部プログラムには、32 ルーチンの属性が既に入っていてはなりません。
オブジェクトを更新できない場合でも、それにかかわらず、プロシージャーは作成されます。
プロシージャーの呼び出し: DECLARE PROCEDURE ステートメントで、作成されたプロシージャーと同じ名前のプロシージャーを定義し、そのプロシージャー名が変数によって識別されていない静的 CALL ステートメントが、同じソース・プログラムから実行される場合は、CREATE PROCEDURE ステートメントの属性ではなく、DECLARE PROCEDURE ステートメントの属性が使用されます。
CREATE PROCEDURE ステートメントが適用されるのは、静的および動的 CALL ステートメント、ならびにそのプロシージャー名が変数によって識別されている CALL ステートメントです。
外部プロシージャーが呼び出されると、その関数は、外部プログラムやサービス・プログラムの作成時に指定された活動化グループであれば、どの活動化グループ内でも実行します。 ただし、通常は、プロシージャーが呼び出し側プログラムと同じ活動化グループ内で実行するように ACTGRP(*CALLER) を使用する必要があります。
AUTONOMOUS 属性 を持つプロシージャーの外部プログラムまたはサービス・プログラムは、 活動化グループ QSQAUTOAG 内で実行するように定義される必要があります。自律型プロシージャーがジョブ内で 起動される場合、QSQAUTOAG 活動化グループ内で実行するすべてのプロシージャー は同じストレージ・モデルで作成されたものでなければなりません。それらは すべて *TERASPACE であるか、すべて *SNGLVL でなければなりません。
デフォルト値の設定: プロシージャーのパラメーターがデフォルト値を指定して定義され ていれば、そのプロシージャーの呼び出し時にパラメーターはデフォルト値に設定されますが、 それは、対応する引数に値が与えられていない場合か、引数が DEFAULT と指定されている場合に限ります。
Java プロシージャーに関する注釈: Java プロシージャーを実行するためには、システムに IBM Developer Kit for Java をインストールしておく必要があります。インストールされていないと、SQLCODE -443 が戻され、CPDB521 メッセージがジョブ・ログに入ります。
Java プロシージャーの実行中にエラーが発生すると、SQLCODE -443 が戻されます。 エラーによっては、プロシージャーが実行されていたジョブのジョブ・ログに他のメッセージが入っている場合があります。
代替構文: 以下のキーワードは、旧リリースとの互換性を維持するためにサポートされている同義語です。 これらのキーワードは標準キーワードではないので、原則として使用しないようにしてください。
- キーワード VARIANT と NOT VARIANT は、NOT DETERMINISTIC と DETERMINISTIC の同義語として使用することができます。
- キーワード NULL CALL は、CALLED ON NULL INPUT の同義語として使用できます。
- キーワード SIMPLE CALL は、GENERAL の同義語として使用できます。
- DB2GENERAL の同義語として、値 DB2GENRL を使用できます。
- DYNAMIC RESULT SET、RESULT SETS、および RESULT SET は、DYNAMIC RESULT SETS の同義語として使用できます。
- PARAMETER STYLE 文節のキーワード PARAMETER STYLE はオプションです。
- PARAMETER STYLE SQL の同義語として、キーワード PARAMETER STYLE DB2SQL を使用できます。
例
例 1: Java で書かれたプロシージャーのプロシージャー定義を作成します。このプロシージャーは、部品番号を渡されて、部品の価格と現在入手可能な数量を戻します。
CREATE PROCEDURE PARTS_ON_HAND (IN PARTNUM INTEGER,
OUT COST DECIMAL(7,2),
OUT QUANTITY INTEGER)
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME 'parts.onhand'
例 2: C で書かれたプロシージャーのプロシージャー定義を作成します。このプロシージャーは、アセンブリー番号を渡されて、アセンブリーを構成する部品の数、部品の合計価格、および部品番号、数量、各部品の単価をリストする結果セットを戻します。
CREATE PROCEDURE ASSEMBLY_PARTS (IN ASSEMBLY_NUM INTEGER,
OUT NUM_PARTS INTEGER,
OUT COST DOUBLE)
LANGUAGE C
PARAMETER STYLE GENERAL
DYNAMIC RESULT SETS 1
FENCED
EXTERNAL NAME ASSEMBLY