ALTER PROCEDURE (SQL)
ALTER PROCEDURE (SQL) ステートメントは、現行サーバーでプロシージャーを変更します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むことができ、また対話式に呼び出すこともできます。 これは、動的に準備できる実行可能ステートメントです。
権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- ステートメント内で識別されるプロシージャーに対しては次のもの。
- そのプロシージャーに対する ALTER 特権、および
- そのプロシージャーを含むライブラリーに対する *EXECUTE システム権限
- データベース管理者権限
特殊タイプが parameter-declaration 内で参照される場合、ステートメントの権限 ID によって保持される特権に、少なくとも次のいずれか 1 つが含まれなければなりません。
- ステートメント内で識別された、それぞれの特殊タイプごとに、
- その特殊タイプに対する USAGE 特権、および
- その特殊タイプを含むライブラリーに対する *EXECUTE システム権限
- 管理権限
SQL 特権に対応するシステム権限の説明については、『関数またはプロシージャーへの権限を検査する際の対応するシステム権限』および 『特殊タイプへの権限を検査する際の対応するシステム権限』を参照してください。
構文
>>-ALTER--------------------------------------------------------> >--+-PROCEDURE--procedure-name--+------------------------------+-+--> | '-(--+--------------------+--)-' | | | .-,--------------. | | | | V | | | | '---parameter-type-+-' | '-SPECIFIC PROCEDURE--specific-name---------------------------' .-ALTER-. >--+-+-------+--option-list---------+-------------------------->< '-REPLACE--routine-specification-' routine-specification |--+-------------------------------------+--+-------------+-----> '-(--+---------------------------+--)-' '-option-list-' | .-,---------------------. | | V | | '---parameter-declaration-+-' >--+----------------------+--SQL-routine-body-------------------| '-SET OPTION-statement-' parameter-declaration .-IN----. |--+-------+--parameter-name--data-type--+----------------+-----| +-OUT---+ '-default-clause-' '-INOUT-' parameter-type |----data-type--------------------------------------------------| 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-. .-NOT DETERMINISTIC-. (1) |--+--------------+--+-------------------+----------------------> '-DETERMINISTIC-----' .-MODIFIES SQL DATA-. .-CALLED ON NULL INPUT-. >--+-------------------+--+----------------------+--------------> +-READS SQL DATA----+ '-CONTAINS SQL------' .-INHERIT SPECIAL REGISTERS-. >--+---------------------------+--------------------------------> .-DYNAMIC RESULT SETS 0--------. >--+------------------------------+--+---------------------+----> '-DYNAMIC RESULT SETS--integer-' +-ALLOW DEBUG MODE----+ +-DISABLE DEBUG MODE--+ '-DISALLOW DEBUG MODE-' .-FENCED-----. .-OLD SAVEPOINT LEVEL . >--+------------+--+---------------------+----------------------> '-NOT FENCED-' '-NEW SAVEPOINT LEVEL ' .-COMMIT ON RETURN NO--. >--+-+----------------------+-+---------------------------------> | '-COMMIT ON RETURN YES-' | '-AUTONOMOUS---------------' >--+---------------------------------------------------------------+--| | .-DEFAULT---------------------. | '-CONCURRENT ACCESS RESOLUTION--+-+-USE CURRENTLY COMMITTED-+-+-' | '-U-----------------------' | '-+-WAIT FOR OUTCOME-+--------' '-W----------------'
- option-list 内の文節は、どのような順番で指定してもかまいません。
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--)-' | | | | | | '-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-----------------------------------------------|
説明
- PROCEDURE または SPECIFIC PROCEDURE
- 変更するプロシージャーを識別します。プロシージャー名 は、現行サーバーに存在している SQL プロシージャーを識別していなければなりません。
指定したプロシージャーが変更されます。 プロシージャーの所有者とプロシージャーに関するすべての特権は、保持されます。
- PROCEDURE procedure-name
- プロシージャーを名前によって識別します。 procedure-name は、ただ 1 つの SQL プロシージャーを識別していなければなりません。 このプロシージャーには、パラメーターをいくつでも定義することができます。 指定されたスキーマまたは暗黙のスキーマの中に、 指定された名前のプロシージャーが複数ある場合、エラーが戻されます。
- PROCEDURE procedure-name (parameter-type,...)
- プロシージャーを一意的に識別するプロシージャー・シグニチャーによって、プロシージャーを識別します。
procedure-name (parameter-type,...) では、指定されたプロシージャー・シグニチャーを持つ SQL プロシージャーを識別する必要があります。指定されたパラメーターは、プロシージャーの作成時に指定された、
対応する位置にあるデータ・タイプと一致していなければなりません。
変更される特定のプロシージャー・インスタンスを識別する場合、データ・タイプの数とデータ・タイプの論理連結が使用されます。
データ・タイプの同義語は、一致として扱われます。
デフォルトがあるパラメーターは、このシグニチャーに含まれていなければなりません。
プロシージャー名 () を指定する場合、識別されるプロシージャー にパラメーターを使用することはできません。
- procedure-name
- プロシージャーの名前を識別します。
- (parameter-type,...)
- プロシージャーのパラメーターを識別します。
非修飾の特殊タイプ名または配列タイプ名を指定する場合、データベース・マネージャーはその特殊タイプまたは配列タイプのスキーマ名を解決するための SQL パスを検索します。
長さ属性、精度属性、あるいは位取り属性があるデータ・タイプの場合、以下のいずれかを使用します。
- 中が空の括弧は、データ・タイプが一致しているか否かの判別時にデータベース・マネージャーによって属性が無視されることを示します。 例えば、DEC() は、DEC(7,2) のデータ・タイプで定義されたプロシージャーのパラメーターに一致するものとみなされます。 ただし、精度値は特定のデータ・タイプ (REAL または DOUBLE) を示すため、 中が空の括弧で FLOAT を指定することはできません。
- 長さ属性、精度属性、あるいは位取り属性に特定の値を指定する場合、その値は、 CREATE PROCEDURE ステートメントの中で暗黙的または明示的に指定された値と正確に一致している必要があります。 データ・タイプが FLOAT の場合、 突き合わせはデータ・タイプ (REAL または DOUBLE) に基づいて行われるので、 精度は指定された値に厳密に一致している必要はありません。
- 長さ属性、精度属性、または位取り属性が明示的に指定されておらず、空の括弧も指定されていない場合、該当のデータ・タイプのデフォルト属性が暗黙指定されます。暗黙の長さは、CREATE PROCEDURE ステートメントの中で暗黙的または明示的 に指定された値と正確に一致している必要があります。
FOR DATA 文節または CCSID 文節の指定はオプショナルです。 いずれの文節も指定しないと、データ・タイプが一致するかどうかを判定する場合に、データベース・マネージャーが属性を無視することを示します。 どちらか一方の文節を指定する場合は、CREATE PROCEDURE ステートメントに 暗黙的または明示的に指定されている値と一致させる必要があります。
- AS LOCATOR
- プロシージャーが、このパラメーターのロケーターを受け取るように定義されることを示します。 AS LOCATOR を指定する場合は、データ・タイプは LOB または LOB に基づく特殊タイプでなければなりません。
- SPECIFIC PROCEDURE specific-name
- プロシージャーを特定名によって識別します。 specific-name は、現行サーバーに存在してい る特定のプロシージャーを識別していなければなりません。
- ALTER option-list
- プロシージャーの 1 つ以上のオプションが変更されることを示します。 ALTER PROCEDURE ALTER option-list が指定されてオプションが指定されない場合は、既存のプロシージャー定義での値が使用されます。 各オプションの説明については、CREATE PROCEDURE (SQL)を参照してください。
- REPLACE routine-specification
- オプションおよびパラメーターを含む既存のプロシージャー定義を、このステートメントで指定したものに置き換えることを示します。
プロシージャーを置き換えると、すべてのオプションの値が置き換えられます。
オプションを指定しない場合は、新規 SQL プロシージャーが作成されるときと同じデフォルトが使用されます。詳しくは、CREATE PROCEDURE (SQL)を参照してください。
ルーチンにコメントやラベルがある場合は、ルーチン定義からコメントやラベルが削除されます。
- (parameter-declaration,…)
- プロシージャーのパラメーターの数、および各パラメーターのデータ・タイプと名前を指定します。
プロシージャーに関するパラメーターは、入力専用、出力専用、または入出力両用に使用できます。
SQL プロシージャーに許されるパラメーターの最大数は 2000 です。
- IN
- パラメーターが、プロシージャーへの入力パラメーターであることを指定します。
- OUT
- パラメーターが、プロシージャーから戻される出力パラメーターであることを示します。 プロシージャー内でこのパラメーターが設定されていない場合は、NULL 値が戻されます。
- INOUT
- パラメーターが、このプロシージャー用の入出力両方のパラメーターであることを指定します。 プロシージャー内でパラメーターが設定されなければ、入力値が戻されます。INOUT パラメーター がデフォルトと共に定義されていて、プロシージャーの呼び出し時にそのデフォルトが使用される場合、 パラメーターに戻される値はありません。
- parameter-name
- SQL 変数として使用するパラメーターの名前を指定します。この名前は、このプロシージャー 用の他の parameter-name と同じものであってはなりません。
- data-type
- パラメーターのデータ・タイプを指定します。 CCSID が指定されている場合、プロシージャーに渡される前に、パラメータ ーはその CCSID に変換されます。CCSID が指定されていない場合は、CCSID は、プロシージャーの呼び出し時点における現行サーバーのデフォルトの CCSID によって決まります。
- default-clause
- パラメーターのデフォルト値を指定します。デフォルト値は、定数、特殊レジスター、グローバル変数、式、またはキーワード NULL にすることができます。式は、集約関数および列名を含まない、式で
定義されている任意の式です。デフォルト値が指定されていない場合、パラメーターにデフォルト値がないため、呼び出し時に省略できません。式ストリングの
最大長は 64K です。
デフォルトの式で SQL データを変更することはできません。式は、 パラメーターのデータ・タイプに対して割り当ての互換性がなければなりません 。デフォルト式の中で参照されるすべてのオブジェクト は、プロシージャーが作成されるときに存在している必要があります。
デフォルト式内でリスト中の数値定数を区切る区切り記号として 使用するコンマの後には、スペースが 1 つ必要です。
デフォルトを指定できません。- OUT パラメーターに対して
- 配列タイプのパラメーターに対して
- option-list
- 変更されるプロシージャーのオプションのリスト。これらのオプションは、前記の ALTER option-list に記載したものと同じです。具体的なオプションを指定しない場合は、新規プロシージャーが作成されるときと同じデフォルトが使用されます。 詳しくは、CREATE PROCEDURE (SQL)を参照してください。
- SET OPTION ステートメント
- プロシージャーを作成するときに使用するオプションを指定します。
例えば、デバッグ可能なプロシージャーを作成するときは、次のステートメントを含めることができます。
詳しくは、SET OPTIONを参照してください。SET OPTION DBGVIEW = *SOURCE
オプション CLOSQLCSR、CNULRQD、COMPILEOPT、NAMING、SQLCA は、ALTER PROCEDURE ステートメントでは使用できません。デフォルト値式を処理するときには、オプション ALWCPYDTA、 CONACC、DATFMT、DATSEP、DECFLTRND、DECMPT、DECRESULT、
DFTRDBCOL、LANGID、 SQLCURRULE、SQLPATH、SRTSEQ、TGTRLS、TIMFMT、および TIMSEP が使用されます。 - SQL-routine-body
- 複合ステートメントも含め、単一の SQL ステートメントを指定します。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 を参照してください。ALTER PROCEDURE (SQL) を使用すると、プロシージャーに関する特権を保持したままで、個々の属性またはルーチン指定を変更できます。
ALTER PROCEDURE REPLACE に関する考慮事項: SQL プロシージャー定義が置き換えられる際、SQL は、組み込み SQL ステートメントと一緒に C ソース・コードが収められる一時ソース・ファイルを作成します。次いで、CRTPGM コマンドを使用して、プログラム・オブジェクトを作成します。 プログラムの作成に使用される SQL オプションは、ALTER PROCEDURE (SQL) ステ ートメントの実行時に有効なオプションです。プログラムは、ACTGRP(*CALLER) を使用して作成します。
SQL プロシージャーが変更された場合、新規 *PGM または *SRVPGM オブジェクトが作成され、プロシージャーの属性は、作成されたプログラム・オブジェクトに保管されます。*PGM オブジェクトや *SRVPGM オブジェクトが保管された上でこのシステムや別のシステムに復元されると、カタログは、それらの属性を使用して自動的に更新されます。
特定名は、それが有効なシステム名である場合は、ソース・ファイルのメンバーの名前、ならびに、プログラム・オブジェクトの名前として使用されます。 プロシージャー名が有効なシステム名でない場合は、固有名が生成されます。同じ名前のソース・ファイル・メンバーが既に存在している場合は、そのメンバーがオーバーレイされます。 同じ名前のモジュールやプログラムが既に存在している場合、オブジェクトはオーバーレイされずに、固有名が生成されます。 これらの固有名は、システム表名の生成に関する規則に従って生成されます。
ターゲット・リリースに関する考慮事項: SQL プロシージャー定義が置き換えられる場合、ターゲット・リリースは、ユーザーが明示的に別のターゲット・リリースを指定しないかぎり、ALTER ステートメントが実行される現行リリースになります。 ターゲット・リリースは、SET OPTION ステートメントで TGTRLS キーワードを使用することで明示的に指定できます。 ALTER が RUNSQLSTM または CRTSQLxxx コマンドのソースで指定された場合、TGTRLS キーワードもそのコマンドに指定できます。
プロシージャー定義が置換されない場合、既存プロシージャーのターゲット・リリースが保持されます。ただし、プロシージャーのターゲット・リリース・レベルが、最も初期にサポートされたリリース・レベルより前である場合を除きます。 この場合、ターゲット・リリースは、最も初期にサポートされたリリース・レベルに変更されます。
難読化されたステートメント: 難読化されたステートメントを 使用して作成したプロシージャーを変更できます。ステートメントを変更すると、 カタログに保存されているエンコードされたバージョンのステートメントが変更されるため、 SQL ステートメントの最大長を超えることがあります。これが起こると、エラーが発行され、 変更は失敗します。
代替構文: 以下のキーワードは、旧リリースとの互換性を維持するためにサポートされている同義語です。 これらのキーワードは標準キーワードではないので、原則として使用しないようにしてください。
- キーワード VARIANT と NOT VARIANT は、NOT DETERMINISTIC と DETERMINISTIC の同義語として使用することができます。
- キーワード NULL CALL は、CALLED ON NULL INPUT の同義語として使用できます。
- DYNAMIC RESULT SET、RESULT SETS、および RESULT SET は、DYNAMIC RESULT SETS の同義語として使用できます。
例
SQL プロシージャーからの戻り時に SQL の変更がコミットされるように SQL プロシージャーでの定義を変更します。
ALTER PROCEDURE UPDATE_SALARY_2
ALTER COMMIT ON RETURN YES