ALTER PROCEDURE (外部) ステートメント
ALTER PROCEDURE (外部) ステートメントは、プロシージャーのプロパティーを変更して、既存の外部プロシージャーを変更します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。
許可
- プロシージャーのスキーマに対する ALTERIN 特権
- SYSCAT.ROUTINES カタログ・ビューの OWNER 列に記録されているそのプロシージャーの所有者
- プロシージャーのスキーマに対する SCHEMAADM 権限
- DBADM 権限
- データベースに対する CREATE_EXTERNAL_ROUTINE 権限
- DBADM 権限
- データベースに対する CREATE_NOT_FENCED_ROUTINE 権限
- DBADM 権限
fenced であるようにプロシージャーを変更するには、さらに別の権限や特権は必要ありません。
構文
説明
- procedure-designator
- 変更するプロシージャーを指定します。 procedure-designator は、現行サーバーに存在するプロシージャーを示していなければなりません。 プロシージャーの所有者およびそのプロシージャーに対するすべての特権は保存されます。 詳しくは、関数、メソッド、およびプロシージャーの指定子を参照してください。
- EXTERNAL NAME 'string' または identifier
- プロシージャーをインプリメントするユーザー作成コードの名前を指定します。
- FENCED または NOT FENCED
- プロシージャーをデータベース・マネージャーのオペレーティング環境の
プロセスまたはアドレス・スペースで実行しても安全か (NOT FENCED)、
そうでないか (FENCED) を指定します。
多くのプロシージャーは、
FENCED として実行するか NOT FENCED として実行するかの選択が可能です。
プロシージャーが FENCED に変更されると、データベース・マネージャーは、 その内部リソース (データ・バッファーなど) を fenced して、 そのプロシージャーからアクセスされないようにします。 一般に、FENCED として実行されるプロシージャーは、 NOT FENCED として実行されるものと同じようには実行されません。
注意:コーディング、レビュー、およびテストが適切に行われていないプロシージャーに NOT FENCED を使用すると、データベースの整合性が損なわれる恐れがあります。 データベース・エンジンでは、発生する可能性のある一般的な不注意による障害の多くに対して、いくつかの予防措置がとられていますが、NOT FENCED ストアード・プロシージャーが使用される場合には、完全な整合性を確保できません。NOT THREADSAFE を宣言したプロシージャーは、NOT FENCED には変更できません (SQLSTATE 42613)。
プロシージャーが AS LOCATOR を定義した任意のパラメーターを有していて、 NO SQL オプションも指定されている場合には、 このプロシージャーは FENCED には変更できません (SQLSTATE 42613)。
LANGUAGE OLE プロシージャーまたは CLR プロシージャーでは、このオプションを変更できません (SQLSTATE 42849)。
集約インターフェース関数のコンポーネント・ルーチンとして登録されているプロシージャーでは、このオプションを変更できません (SQLSTATE 42849)。
- EXTERNAL ACTION または NO EXTERNAL ACTION
- プロシージャーが、データベース・マネージャーによって管理されていないオブジェクトの状態を変更するアクションを取るか (EXTERNAL ACTION)、
または取らないか (NO EXTERNAL ACTION) を指定します。
NO EXTERNAL ACTION を指定した場合、
プロシージャーが外部に影響を与えないことを前提とした最適化を、システムは使用できます。
集約インターフェース関数のコンポーネント・ルーチンとして登録されているプロシージャーでは、このオプションを変更できません (SQLSTATE 42849)。
- THREADSAFE または NOT THREADSAFE
- プロシージャーを他のルーチンと同じプロセスで実行しても安全か (THREADSAFE)、
そうでないか (NOT THREADSAFE) を指定します。
プロシージャーが OLE 以外の LANGUAGE で定義される場合:
- プロシージャーが THREADSAFE として定義されている場合には、 データベース・マネージャーは他のルーチンと同じプロセスにプロシージャーを呼び出すことができます。 一般に、スレッド・セーフになるには、 プロシージャーはどのグローバルあるいは静的データ域をも使用してはなりません。 多くのプログラミング解説書には、スレッド・セーフ・ルーチンの作成に関する説明が含まれています。 FENCED および NOT FENCED プロシージャーの両方を THREADSAFE にすることができます。
- プロシージャーが NOT THREADSAFE に定義される場合には、 データベース・マネージャーは他のルーチンと同じプロセスにプロシージャーを決して呼び出しません。 fenced されたプロシージャーだけが、NOT THREADSAFE になり得ます (SQLSTATE 42613)。
このオプションは LANGUAGE OLE プロシージャーを変更できません (SQLSTATE 42849)。
集約インターフェース関数のコンポーネント・ルーチンとして登録されているプロシージャーでは、このオプションを変更できません (SQLSTATE 42849)。
- NEW SAVEPOINT LEVEL
- 新規セーブポイント・レベルをプロシージャーに対して作成することを指定します。
セーブポイント・レベルは、任意のセーブポイント関連ステートメントの参照範囲と、
セーブポイント名の比較および参照に使用される名前空間を参照します。
プロシージャーのプロシージャー・レベルは NEW SAVEPOINT LEVEL にのみ変更可能です。
集約インターフェース関数のコンポーネント・ルーチンとして登録されているプロシージャーでは、このオプションを変更できません (SQLSTATE 42849)。
規則
-
以下のスキーマのプロシージャーは変更できません (SQLSTATE 42832)。
- SYSIBM
- SYSFUN
- SYSPROC
例
ALTER PROCEDURE PARTS_ON_HAND() NOT FENCED