CREATE PROCEDURE (SQL)
CREATE PROCEDURE (SQL) ステートメントは、現行サーバー で SQL プロシージャーを作成します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むことができ、また対話式に呼び出すこともできます。 これは、動的に準備できる実行可能ステートメントです。
権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- スキーマ内に作成する特権。詳しくは、スキーマ内で作成する必要のある権限を参照してください。
- データベース管理者権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- SYSPROCS カタログ・ビューと SYSPARMS カタログ表の場合
- 該当の表に対する INSERT 特権、および
- QSYS2 ライブラリーに対する *EXECUTE システム権限
- データベース管理者権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- 次のシステム権限
- プログラム作成 (CRTPGM) コマンドに対する *USE
- データベース管理者権限
SQL 名が指定され、該当のプロシージャーが作成されるライブラリーの名前 と同じ名前のユーザー・プロファイルが存在し、しかもその名前がステート メントの権限 ID と異なっている場合、ステートメントの権限 ID によって 保持される特権には、少なくとも次の 1 つが含まれていなければなりません。
- その名前を持つユーザー・プロファイルに対する *ADD システム権限
- データベース管理者権限
特殊タイプまたは配列タイプを参照する場合は、ステートメントの権限 ID によって保持される特権に、少なくとも次のいずれか 1 つが含まれなければなりません。
- ステートメント内で識別された、それぞれの特殊タイプまたは配列タイプごとに、
- そのタイプに対する USAGE 特権、および
- その特殊タイプまたは配列タイプを含むライブラリーに対する *EXECUTE システム権限
- データベース管理者権限
既存のプロシージャーに置き換えるには、ステートメントの権限 ID が保持する特権に、次のうち少なくともいずれか 1 つを含める必要があります。
- 次のシステム権限
- このプロシージャーに関連したプログラム・オブジェクトまたはサービス・プログラム・オブジェクトに対する *OBJMGT システム権限
- このプロシージャーを削除するために必要な全権限
- SYSPROCS カタログ・ビューと SYSPARMS カタログ表に対する *READ システム権限
- データベース管理者権限
SQL 特権に対応するシステム権限の説明については、『関数またはプロシージャーへの権限を検査する際の対応するシステム権限』および 『特殊タイプへの権限を検査する際の対応するシステム権限』を参照してください。
構文
>>-CREATE--+------------+--PROCEDURE--procedure-name------------> '-OR REPLACE-' >--+-----------------------------------------+------------------> '-(--+-------------------------------+--)-' | .-,-------------------------. | | V | | '-----parameter-declaration---+-' >--+-procedure-definition---------------+---------------------->< '-WRAPPED--obfuscated-statement-text-' procedure-definition |--option-list--+----------------------+--SQL-routine-body------| '-SET OPTION-statement-'
parameter-declaration .-IN----. |--+-------+--parameter-name--data-type--+----------------+-----| +-OUT---+ '-default-clause-' '-INOUT-' data-type |--+-built-in-type------+---------------------------------------| +-distinct-type-name-+ '-array-type-name----' default-clause |--DEFAULT--+-NULL-------------+--------------------------------| +-constant---------+ +-special-register-+ +-global-variable--+ '-(--expression--)-'
option-list .-LANGUAGE SQL-. (1) .-NOT DETERMINISTIC-. |--+--------------+------+-------------------+------------------> '-DETERMINISTIC-----' .-MODIFIES SQL DATA-. .-CALLED ON NULL INPUT . >--+-------------------+--+----------------------+--------------> +-READS SQL DATA----+ '-CONTAINS SQL------' .-INHERIT SPECIAL REGISTERS-. >--+---------------------------+--------------------------------> .-DYNAMIC RESULT SETS--0-------. >--+------------------------------+-----------------------------> '-DYNAMIC RESULT SETS--integer-' >--+-------------------------+--+---------------------+---------> '-SPECIFIC--specific-name-' +-DISALLOW DEBUG MODE-+ +-ALLOW DEBUG MODE----+ '-DISABLE DEBUG MODE--' .-FENCED-----. .-PROGRAM TYPE MAIN-. >--+------------+--+-------------------+------------------------> '-NOT FENCED-' '-PROGRAM TYPE SUB--' .-OLD SAVEPOINT LEVEL-. .-COMMIT ON RETURN NO--. >--+---------------------+--+-+----------------------+-+--------> '-NEW SAVEPOINT LEVEL-' | '-COMMIT ON RETURN YES-' | '-AUTONOMOUS---------------' >--+---------------------------------------------------------------+--> | .-DEFAULT---------------------. | '-CONCURRENT ACCESS RESOLUTION--+-+-USE CURRENTLY COMMITTED-+-+-' | '-U-----------------------' | '-+-WAIT FOR OUTCOME-+--------' '-W----------------' .-SYSTEM_TIME SENSITIVE YES-. >--+---------------------------+--------------------------------| '-SYSTEM_TIME SENSITIVE NO--'
- オプション文節は、別の順序で指定することができます。
SQL-routine-body |--+-SQL-control-statement--------------------------+-----------| +-ALLOCATE CURSOR-statement----------------------+ +-ALLOCATE DESCRIPTOR-statement------------------+ +-ALTER FUNCTION-statement-----------------------+ +-ALTER MASK-statement---------------------------+ +-ALTER PERMISSION-statement---------------------+ +-ALTER PROCEDURE-statement----------------------+ +-ALTER SEQUENCE-statement-----------------------+ +-ALTER TABLE-statement--------------------------+ +-ALTER TRIGGER-statement------------------------+ +-ASSOCIATE LOCATORS-statement-------------------+ +-COMMENT-statement------------------------------+ +-COMMIT-statement-------------------------------+ +-CONNECT-statement------------------------------+ +-CREATE ALIAS-statement-------------------------+ +-CREATE FUNCTION (external scalar)-statement----+ +-CREATE FUNCTION (external table)-statement-----+ +-CREATE FUNCTION (sourced)-statement------------+ +-CREATE INDEX-statement-------------------------+ +-CREATE MASK-statement--------------------------+ +-CREATE PERMISSION-statement--------------------+ +-CREATE PROCEDURE (external)-statement----------+ +-CREATE SCHEMA-statement------------------------+ +-CREATE SEQUENCE-statement----------------------+ +-CREATE TABLE-statement-------------------------+ +-CREATE TYPE-statement--------------------------+ +-CREATE VIEW-statement--------------------------+ +-DEALLOCATE DESCRIPTOR-statement----------------+ +-DECLARE GLOBAL TEMPORARY TABLE-statement-------+ +-DELETE-statement-------------------------------+ +-DESCRIBE-statement-----------------------------+ +-DESCRIBE CURSOR-statement----------------------+ +-DESCRIBE INPUT-statement-----------------------+ +-DESCRIBE PROCEDURE-statement-------------------+ +-DESCRIBE TABLE-statement-----------------------+ +-DISCONNECT-statement---------------------------+ +-DROP-statement---------------------------------+ +-EXECUTE IMMEDIATE-statement--------------------+ +-GET DESCRIPTOR-statement-----------------------+ +-GRANT-statement--------------------------------+ +-INSERT-statement-------------------------------+ +-LABEL-statement--------------------------------+ +-LOCK TABLE-statement---------------------------+ +-MERGE-statement--------------------------------+ +-REFRESH TABLE-statement------------------------+ +-RELEASE-statement------------------------------+ +-RELEASE SAVEPOINT-statement--------------------+ +-RENAME-statement-------------------------------+ +-REVOKE-statement-------------------------------+ +-ROLLBACK-statement-----------------------------+ +-SAVEPOINT-statement----------------------------+ +-SELECT INTO-statement--------------------------+ +-SET CONNECTION-statement-----------------------+ +-SET CURRENT DEBUG MODE-statement---------------+ +-SET CURRENT DECFLOAT ROUNDING MODE-statement---+ +-SET CURRENT DEGREE-statement-------------------+ +-SET CURRENT IMPLICIT XMLPARSE OPTION-statement-+ +-SET CURRENT TEMPORAL SYSTEM_TIME-statement-----+ +-SET DESCRIPTOR-statement-----------------------+ '-SET ENCRYPTION PASSWORD-statement--------------' SQL-routine-body (続き) |--+-SET PATH-statement-----------+-----------------------------| +-SET RESULT SETS-statement----+ +-SET SCHEMA-statement---------+ +-SET TRANSACTION-statement----+ +-TRANSFER OWNERSHIP-statement-+ +-TRUNCATE-statement-----------+ +-UPDATE-statement-------------+ '-VALUES INTO-statement--------'
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-----+-------------------------------------------|
説明
- OR REPLACE
- 現行サーバーにこのプロシージャーの定義が存在する場合に、その定義を置き換える、という動作を指定します。実際には、カタログで既存の定義を削除してから新しい定義に置き換える、という動作になりますが、例外として、このプロシージャーに対して与えられていた特権は影響を受けません。現行サーバーにこのプロシージャーの定義が存在しなければ、このオプションは無視されます。既存のプロシージャーを置き換えるには、新しい定義の specific-name および procedure-name が古い定義の specific-name および procedure-name と同じであるか、新しい定義のシグニチャーが古い定義のシグニチャーと一致している必要があります。そうでなければ、新しいプロシージャーが作成されます。
- procedure-name
- プロシージャーを指定します。名前、スキーマ名、パラメーターの数
の組み合わせで、現行サーバーに存在しているプロシージャーを識別してはなりません。
SQL 命名の場合、プロシージャーは、暗黙または明示修飾子で指定されたスキーマ内に作成されます。
システム命名の場合、プロシージャーは、修飾子によって指定されたスキーマ内に作成されます。 修飾子を指定しなかった場合:
- CURRENT SCHEMA 特殊レジスターの値が *LIBL である場合、プロシージャーは、 現行ライブラリー (*CURLIB) 内に作成されます。
- そうでない場合、プロシージャーは現行スキーマ内に作成されます。
スキーマ名 は、QSYS2、QSYS、QTEMP、または SYSIBM にはできません。
- (parameter-declaration,...)
- プロシージャーのパラメーターの数とそれぞれのパラメーターのデータ・タイプを指定します。
プロシージャーに関するパラメーターは、入力専用、出力専用、または
入出力両用に使用できます。
SQL プロシージャーに許されるパラメーターの最大数は 2000 です。
- IN
- パラメーターが、プロシージャーへの入力パラメーターであることを指定します。
プロシージャー内でパラメーターに対する変更が行われても、制御が戻った
後で、呼び出し元の SQL アプリケーションがその変更内容を使用することはできません。デフォルトは IN です。
配列タイプ、XML タイプ、または LOB タイプ のパラメーターは、読み取り専用です。
- OUT
- パラメーターが、プロシージャーから戻される出力パラメーターであることを示します。 プロシージャー内でこのパラメーターが設定されていない場合は、NULL 値が戻されます。
- INOUT
- パラメーターが、このプロシージャー用の入出力両方のパラメーターであることを指定します。 プロシージャー内でパラメーターが設定されなければ、入力値が戻されます。INOUT パラメーター がデフォルトと共に定義されていて、プロシージャーの呼び出し時にそのデフォルトが使用される場合、 パラメーターに戻される値はありません。
- parameter-name
- パラメーター名を指定します。この名前は、このプロシージャー 用の他のパラメーター名 と同じものであってはなりません。
- data-type
- パラメーターのデータ・タイプを指定します。
このデータ・タイプは、組み込みデータ・タイプまたは特殊データ・タイプにすることができます。
- built-in-type
- 組み込みデータ・タイプを指定します。 それぞれの組み込みデータ・タイプの詳細については、CREATE TABLEを参照してください。
- distinct-type-name
- 特殊タイプを指定します。パラメーターの長さ、精度、または位取り属性は、
特殊タイプのソース・タイプの属性 (CREATE TYPE で指定された属性) と同じになります。特殊タイプの作成についての詳細は、CREATE TYPE (特殊)を参照してください。.
特殊タイプの名前が修飾されていない場合、データベース・マネージャーは、SQL パス上のスキーマを検索することでそのスキーマ名を解決します。
- 配列タイプ名
- 配列タイプを指定します。
配列タイプの名前が修飾されていない場合、データベース・マネージャーは、SQL パス上のスキーマを検索することでそのスキーマ名を解決します。
CCSID が指定されている場合、プロシージャーに渡される前に、パラメータ ーはその CCSID に変換されます。CCSID が指定されていない場合は、CCSID は、プロシージャーの呼び出し時点における現行サーバーのデフォルトの CCSID によって決まります。
- default
- パラメーターのデフォルト値を指定します。デフォルト値は、定数、特殊レジスター、グローバル変数、式、またはキーワード NULL にすることができます。式は、集約関数および列名を含まない、式で
定義されている任意の式です。デフォルト値が指定されていない場合、パラメーターにデフォルト値がないため、プロシージャーの呼び出し時に省略できません。式ストリングの
最大長は 64K です。
デフォルトの式で SQL データを変更することはできません。式は、 パラメーターのデータ・タイプに対して割り当ての互換性がなければなりません 。デフォルト式の中で参照されるすべてのオブジェクト は、プロシージャーが作成されるときに存在している必要があります。
デフォルト式内でリスト中の数値定数を区切る区切り記号として 使用するコンマの後には、スペースが 1 つ必要です。
デフォルトを指定できません。- OUT パラメーターに対して
- 配列タイプのパラメーターに対して
- LANGUAGE SQL
- このプロシージャーを SQL だけで記述する、ということを指定します。
- SPECIFIC specific-name
- 関数の固有名を指定します。特定名の詳細については、CREATE PROCEDUREの『プロシージャーに特定の名前を指定する』を参照してください。
- DETERMINISTIC または NOT DETERMINISTIC
- このプロシージャーが、同じ IN 引数および INOUT 引数を指定し
て呼び出された場合に、常に同じ結果を戻すかどうかを指定します。
デフォルトは NOT DETERMINISTIC です。
- NOT DETERMINISTIC
- このプロシージャーは、同じ IN 引数および INOUT 引数を指定し て呼び出された場合に、データベース内の参照先データが変更されていなく ても、必ずしも同じ結果を戻すとは限りません。
- DETERMINISTIC
- このプロシージャーは、同じ IN 引数および INOUT 引数を指定し て呼び出された場合に、データベース内の参照先データが変更されていない 限り、常に同じ結果を戻します。
- MODIFIES SQL DATA、READS SQL DATA、または CONTAINS SQL
- このプロシージャーまたはこのプロシージャーから呼び出すルーチンで実行できる SQL ステートメントの種別を指定します。データベース・マネージャーは、このプロシージャーとこのプロシージャーから呼び出すすべてのルーチンで実行する SQL ステートメントがその指定内容と整合しているかどうかを検査します。デフォルトは、MODIFIES SQL
DATA です。このオプションは、
すべてのパラメーター・デフォルト式に適用されます。 各ステートメントの分類については、SQL ステートメントの特性を参照してください。
- MODIFIES SQL DATA
- このプロシージャーで、どのプロシージャーでもサポートされない ステートメントを除くすべての SQL ステートメントを実行できることを指定します。
- READS SQL DATA
- このプロシージャーが、データ・アクセス種別 READS SQL DATA、CONTAINS SQL、または NO SQL を指定したステートメントを実行できるように指定します。
- CONTAINS SQL
- このプロシージャーが、データ・アクセス種別 CONTAINS SQL または NO SQL のステートメントのみを実行できるように指定します。
- CALLED ON NULL INPUT
- 引数値のいずれかまたは全部がヌルである場合にプロシージャーを呼び出すことを指定します。この指定は、ヌル引数値のテストを行うようにプロシージャーをコーディングする必要があります。
- INHERIT SPECIAL REGISTERS
- 特殊レジスターの既存の値は、プロシージャーに入った後に継承されることを示します。
- DYNAMIC RESULT SETS integer
- プロシージャーから戻すことのできる結果セットの最大数を指定します。
integer の最小値はゼロ、最大値は 32767 です。デフォルトは DYNAMIC RESULT SETS 0 です。
結果セットは、対応するカーソルがオープンした順序で返されます。ただし、プロシージャーで 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 行目から始まります。
結果セットの詳細については、SET RESULT SETSを参照してください。
- DISALLOW DEBUG MODE、ALLOW DEBUG MODE、または DISABLE DEBUG MODE
-
プロシージャーを Unified Debugger でデバッグできるように作成するかどうかを示します。DEBUG MODE を指定する場合は、SET OPTION ステートメント内の DBGVIEW オプションを指定してはなりません。
- DISALLOW DEBUG MODE
- プロシージャーは Unified Debugger でデバッグできません。プロシージャーの DEBUG MODE 属性が DISALLOW の場合、後でプロシージャーを変更してデバッグ・モード属性を変えることができます。
- ALLOW DEBUG MODE
- プロシージャーは Unified Debugger でデバッグすることができます。プロシージャーの DEBUG MODE 属性が ALLOW の場合、後でプロシージャーを変更してデバッグ・モード属性を変えることができます。
- DISABLE DEBUG MODE
- プロシージャーは Unified Debugger でデバッグできません。プロシージャーの DEBUG MODE 属性が DISABLE の場合、後でプロシージャーを変更してデバッグ・モード属性を変えることはできません。
DEBUG MODE を指定せずに SET OPTION ステートメント内の DBGVIEW オプションを指定した場合、プロシージャーを Unified Debugger でデバッグすることはできませんが、システム・デバッグ機能を使用してデバッグできる場合があります。 DEBUG MODE オプションも DBGVIEW オプションも指定しない場合は、CURRENT DEBUG MODE 特殊レジスターでのデバッグ・モードが使用されます。
- FENCED または NOT FENCED
- このパラメーターは、他のプロダクトとの互換性を保持するために許可されており、DB2® for i で使用されることはありません。
- PROGRAM TYPE MAIN または PROGRAM TYPE SUB
- プロシージャーをプログラム (*PGM) として作成するか、サービス・プログラム (*SRVPGM) のプロシージャーとして作成するかを指定します。
- PROGRAM TYPE MAIN
- プロシージャーがプログラム (*PGM) として作成されることを指定します。
- PROGRAM TYPE SUB
- プロシージャーがサービス・プログラム (*SRVPGM) のプロシージャーとして作成されることを指定します。
通常、PROGRAM TYPE SUB プロシージャーのパフォーマンスは、PROGRAM TYPE MAIN プロシージャーよりも若干優れています。
- OLD SAVEPOINT LEVEL または NEW SAVEPOINT LEVEL
- このプロシージャーに入ったときに、新しいセーブポイント・レベルを
作成するかどうかを指定します。
- OLD SAVEPOINT LEVEL
- 新しいセーブポイント・レベルを作成しません。 このプロシージャー内で、OLD SAVEPOINT LEVEL が暗黙的または明示的に指 定された SAVEPOINT ステートメントが発行された場合、SAVEPOINT ステート メントはプロシージャーの呼び出し元と同じセーブポイント・レベルで作成されます。 これはデフォルトです。
- NEW SAVEPOINT LEVEL
- このプロシージャーに入ったときに、新しいセーブポイント・レベルが 作成されます。 プロシージャー内に設定されているすべてのセーブポイントは、この プロシージャーが呼び出されたレベルより深くネストされた セーブポイント・レベルで作成されます。 したがって、プロシージャー内のどの新規セーブポイントも、同じ名前を持つ 上位のセーブポイント・レベル (例えば呼び出し側プログラムのセーブポイント ・レベル) で設定されている既存のセーブポイントと競合することはありません。
- COMMIT ON RETURN
- データベース・マネージャーが、プロシージャーからの戻りと同時にトランザクション
をコミットするかどうかを指定します。
- NO
- データベース・マネージャーは、プロシージャーから戻ったときにコミットを行いません。 NO がデフォルトです。
- YES
- データベース・マネージャーは、プロシージャーから正常に戻ったときにコミットを行います。
プロシージャーの戻り時にエラーがあった場合は、コミットは行われません。
コミット操作の対象には、呼び出し側のアプリケーション・プロセスと このプロシージャーが行う作業が含まれます。
プロシージャーが結果セットを戻す場合に、結果セットに関連したカーソル をコミット後に使用できるようにするには、カーソルを WITH HOLD として 定義しておく必要があります。
- AUTONOMOUS
- 呼び出し側アプリケーションから独立した作業単位でプロシージャーが実行されることを 指定します。このオプションが指定されていると、 データベースは常にプロシージャーから戻された SQLSTATE に 基づいて、自律型プロシージャーのトランザクション作業をコミット またはロールバックします。SQLSTATE が無条件な成功または警告を 示している場合、トランザクションはコミットされます。他のすべての SQLSTATE の 場合、自律型プロシージャーの作業単位はロールバックされます。
- 自律型プロシージャーの内部からの、トリガー、関数、またはプロシージャーの起動 は、そのトリガー、関数、またはプロシージャーが、別の活動化グループの下で実行するように明示的に作成されたものでない限り、 自律型プロシージャーの作業単位の一部になります。
- 自律型プロシージャーを別の自律型プロシージャーから直接または間接に呼び出すことはできません。
- AUTONOMOUS を指定する場合、DYNAMIC RESULT SETS 0 を指定する必要があります。
- CONCURRENT ACCESS RESOLUTION
- データベース・マネージャーが更新プロセスの過程にあるデータを待つかどうかを指定します。DEFAULT がデフォルトです。
- DEFAULT
- このプロシージャーに関する並行アクセスの解決方法を明示的に設定しないことを指定します。このプロシージャーの呼び出し時に有効だった値が使用されます。
- WAIT FOR OUTCOME
- データベース・マネージャーが更新プロセスの過程にあるデータのコミットまたはロールバックを待つ、という動作を指定します。
- USE CURRENTLY COMMITTED
- データベース・マネージャーが更新プロセスの過程にあるデータを検出したときに現時点でのコミット済みバージョンのデータを使用する、という動作を指定します。
- 読み取りトランザクションと削除/更新トランザクションの間でロックの競合が発生した場合に、この文節の適用対象になるのは、分離レベル CS のスキャンです (CS KEEP LOCKS のスキャンは対象になりません)。
- SYSTEM_TIME SENSITIVE
- 静的および動的 SQL ステートメントの両方でのシステム期間テンポラル表への参照が、CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターの値の影響を受けるかどうかを決定します。YES がデフォルトです。
- YES
- システム期間テンポラル表への参照は、CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターの値の影響を受けます。
- NO
- システム期間テンポラル表の参照は、CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターの値の影響を受けません。
- WRAPPED obfuscated-statement-text
- エンコードされたプロシージャー定義を指定します。WRAP スカラー関数を使用して CREATE PROCEDURE ステートメント をエンコードできます。
- SET OPTION ステートメント
- プロシージャーを作成するときに使用するオプションを指定します。
これらのオプションは、すべてのデフォルト値式にも適用されます。 例えば、デバッグ可能なプロシージャーを作成するときは、次のステートメントを含めることができます。
各オプションのデフォルト値は、作成時に有効だったオプションによって異なります。詳しくは、SET OPTIONを参照してください。SET OPTION DBGVIEW = *SOURCE
オプション CLOSQLCSR、CNULRQD、CNULIGN、COMPILEOPT、NAMING、SQLCA は、CREATE PROCEDURE ステートメントでは使用できません。デフォルト値式を処理するときには、オプション ALWCPYDTA、 CONACC、DATFMT、DATSEP、DECFLTRND、DECMPT、DECRESULT、
DFTRDBCOL、LANGID、 SQLCURRULE、SQLPATH、SRTSEQ、TGTRLS、TIMFMT、および TIMSEP が使用されます。 - SQL-routine-body
- 単一の SQL-procedure-statement (複合ステートメントを含む) を指定します。SQL プロシージャーの定義に関する詳細については、SQL 制御ステートメント
を参照してください。
CONNECT、SET CONNECTION、RELEASE、DISCONNECT、および SET TRANSACTION ステートメントは、 リモート・アプリケーション・サーバー上で実行中のプロシージャー内で使用することはできません。 COMMIT および ROLLBACK ステートメントは、 ATOMIC SQL プロシージャーまたはリモート・アプリケーション・サーバーへの接続上で実行中のプロシージャー内で使用することはできません。
REPLACE キーワードを指定する ALTER PROCEDURE (SQL)、ALTER FUNCTION (SQL スカラー)、および ALTER FUNCTION (SQL 表) は、SQL-routine-body では使用できません。
注
プロシージャー定義に関する一般考慮事項: プロシージャーの定義に関する一般情報については、CREATE PROCEDUREを参照してください。
プロシージャーの所有権: SQL 名が指定されている場合、
- 作成したプロシージャーが入れられるスキーマと同じ名前のユーザー・プロファイルが存在する場合、プロシージャーの所有者 はそのユーザー・プロファイルです。
- その他の場合は、プロシージャーの所有者 は、この ステートメントを実行しているスレッドのユーザー・プロファイルまたは グループ・ユーザー・プロファイルです。
システム名を指定した場合は、プロシージャーの所有者 は、この ステートメントを実行しているスレッドのユーザー・プロファイルまたはグループ・ユーザー・プロファイルです。
プロシージャーの権限 : SQL 名を使用する場合 は、プロシージャーは、*PUBLIC に対するシステム権限 *EXCLUDE を使用して 作成されます。 システム名を使用する場合、プロシージャーは、スキーマの作成権限 (CRTAUT) パラメーターによって決められる *PUBLIC に対する権限を使用して作成されます。
プロシージャーの所有者がグループ・プロファイルのメンバー (GRPPRF キー ワード) であり、グループ権限が指定されている (GRPAUT キーワード) 場合 は、そのグループ・プロファイルにも、そのプロシージャーに対する権限が与えられます。
- 既存のコメントまたはラベルは破棄されます。
- 権限を持つユーザーは維持されます。オブジェクト所有者は変更される可能性があります。
- 現在のジャーナル監査は保持されます。
プロシージャー内のエラー処理: プロシージャー本体のそれぞれの SQL ステートメントごとに起こりうる例外について考慮すべき点があります。 例外 SQLSTATE は、複合ステートメント内のハンドラーを使用してプロシージャー内で処理されないと、プロシージャーの呼び出し元に戻されます。 プロシージャーによってエラーが戻されると、プロシージャーに渡された引数の値のうち OUT パラメーターに対応するものは未定義になり、INOUT パラメーターに対応するものは変わりません。
プロシージャーの作成: SQL プロシージャーが作成される際、SQL は、 組み込み SQL ステートメントと一緒に C ソース・コードが収められる一時ソース・ファイルを作成します。 次いで、CRTPGM または CRTSRVPGM コマンドを使用して、プログラムまたはサービス・プログラム・オブジェクトを作成します。 プログラムの作成に使用される SQL オプションは、CREATE PROCEDURE ステ ートメントの実行時に有効なオプションです。AUTONOMOUS が指定されている場合、プログラム またはサービス・プログラムは ACTGRP(QSQAUTOAG) を使用して作成されます。 それ以外の場合は、プログラムは、ACTGRP(*CALLER) を使用して作成します。
SQL プロシージャーが作成されると、そのプロシージャーの 属性は、作成されたプログラム・オブジェクトまたはサービス・プログラム・オブジェクト内に保管されます。 *PGM または *SRVPGM オブジェクトが保管された後、このシステムまたは別のシステムに 復元されると、属性が使用されてカタログが更新されます。
特定のプロシージャー名は、それが有効なシステム名である場合は、ソース・ファイルのメンバーの名前、ならびに、プログラム・オブジェクトの名前として使用されます。 プロシージャー名が有効なシステム名でない場合は、固有名が生成されます。同じ名前のソース・ファイル・メンバーが既に存在している場合は、そのメンバーがオーバーレイされます。 同じ名前のモジュールやプログラムが既に存在している場合、オブジェクトはオーバーレイされずに、固有名が生成されます。 これらの固有名は、システム表名の生成に関する規則に従って生成されます。
プロシージャーの呼び出し: DECLARE PROCEDURE ステートメントで、 作成されたプロシージャーと同じ名前のプロシージャーを定義し、 そのプロシージャー名が変数によって識別されていない静的 CALL ステートメントが、 同じソース・プログラムから実行される場合は、CREATE PROCEDURE ステートメントの属性ではなく、 DECLARE PROCEDURE ステートメントの属性が使用されます。
CREATE PROCEDURE ステートメントが適用されるのは、静的および動的 CALL ステートメント、ならびにそのプロシージャー名が変数によって識別されている CALL ステートメントです。
SQL プロシージャーは、SQL CALL ステートメントを使用して呼び出す必要があります。 SQL プロシージャーは、呼び出されると、呼び出し側プログラムの活動化グループ内で実行します。
SQL プロシージャー は *TERASPACE ストレージ・モデルで作成されます。自律型 SQL プロシージャーがジョブ内で 起動される場合、QSQAUTOAG 活動化グループ内で実行するすべてのプロシージャー は *TERASPACE ストレージ・モデルを使用しなければなりません。
難読化されたステートメント: CREATE PROCEDURE ステートメント は、難読化された形式で実行できます。難読化されたステートメントでは、 WRAPPED キーワードの前にあるプロシージャー名とパラメーターのみが判読 可能です。ステートメントの残りは、判読できないが、難読化されたステートメントをサポートするデータベース・サーバー によってデコード可能なように、エンコードされます。難読化されたステートメント は、WRAP スカラー関数を呼び出すことによって生成できます。難読化されたステートメントからプロシージャーが 作成されるときに指定されるデバッグ・オプションはすべて無視されます。 難読化されたステートメントから作成されたプロシージャーを 難読化がサポートされていないリリースにリストアすることはできません。
デフォルト値の設定: プロシージャーのパラメーターがデフォルト値を指定して定義され ていれば、そのプロシージャーの呼び出し時にパラメーターはデフォルト値に設定されますが、 それは、対応する引数に値が与えられていない場合か、引数が DEFAULT と指定されている場合に限ります。
従属オブジェクト: SQL ルーチンは、SQL-routine-body で参照されるオブジェクトに従属します。 従属オブジェクトの名前は、カタログ・ビュー SYSROUTINEDEP に保管されます。 SQL-routine-body のオブジェクト参照が完全修飾名である場合、または非修飾名が現行スキーマによって SQL 命名で修飾されている場合、SYSROUTINEDEP 内のオブジェクトのスキーマ名は、指定された名前か現行スキーマの値に設定されます。 それ以外の場合は、スキーマ名は、特定のスキーマ名に設定されません。 名前を特定のスキーマ名に設定しないと、DROP ステートメントおよび ALTER ステートメントは、ルーチンが変更中または除去中のオブジェクトに従属しているかどうかを判別することができません。
代替構文: 以下のキーワードは、旧リリースとの互換性を維持するためにサポートされている同義語です。 これらのキーワードは標準キーワードではないので、原則として使用しないようにしてください。
- キーワード VARIANT と NOT VARIANT は、NOT DETERMINISTIC と DETERMINISTIC の同義語として使用することができます。
- キーワード NULL CALL は、CALLED ON NULL INPUT の同義語として使用できます。
- DYNAMIC RESULT SET、RESULT SETS、および RESULT SET は、DYNAMIC RESULT SETS の同義語として使用できます。
例
社員の給与の中央値を戻す SQL プロシージャーを作成します。 給与の中央値を超える給与を得ている全社員の氏名、肩書き、および給与の入った結果セットを戻します。
CREATE PROCEDURE MEDIAN_RESULT_SET (OUT medianSalary DECIMAL(7,2))
LANGUAGE SQL
DYNAMIC RESULT SETS 1
BEGIN
DECLARE v_numRecords INTEGER DEFAULT 1;
DECLARE v_counter INTEGER DEFAULT 0;
DECLARE c1 CURSOR FOR
SELECT salary
FROM staff
ORDER BY salary;
DECLARE c2 CURSOR WITH RETURN FOR
SELECT name, job, salary
FROM staff
WHERE salary > medianSalary
ORDER BY salary;
DECLARE EXIT HANDLER FOR NOT FOUND
SET medianSalary = 6666;
SET medianSalary = 0;
SELECT COUNT(*) INTO v_numRecords FROM STAFF;
OPEN c1;
WHILE v_counter < (v_numRecords / 2 + 1)
DO FETCH c1 INTO medianSalary;
SET v_counter = v_counter + 1;
END WHILE;
CLOSE c1;
OPEN c2;
END