ALTER MODULE ステートメント
ALTER MODULE ステートメントは、モジュールの定義を変更します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。許可
ステートメントの許可 ID によって保持される特権には、モジュールの所有権、および ALTER MODULE ステートメント内で指定されている SQL ステートメントを呼び出すために必要なすべての特権も含まれていなければなりません。構文
説明
- module-name
- 変更するモジュールを識別します。 module-name は、現行サーバーに存在するモジュールを示していなければなりません (SQLSTATE 42704)。 指定する名前はモジュールの別名であってはなりません (SQLSTATE 560CT)。 ADD
- モジュールにオブジェクトを追加するか、本体なしでモジュール内に既に存在するルーチン定義に本体を追加します。 ユーザー定義タイプまたはグローバル変数を追加する場合、モジュール内に既存のユーザー定義タイプまたはグローバル変数をオブジェクトに指定しないでください。 ユーザー定義タイプまたはグローバル変数が存在しなかった場合は、これがモジュールに追加され、そのモジュールでのみ使用できるようになります。ルーチンを追加する場合は、指定されたルーチンが存在していないなら、ルーチンが追加されます。 ルーチンを追加する場合、指定されたルーチンが存在しているなら、既存のルーチン定義にはルーチン本体を含めることはできません (SQLSTATE 42723)。 このルーチン・プロトタイプは、ルーチン属性とルーチン本体を含め、新しいルーチン定義に完全に置き換わります。例外は、パブリッシュ済み属性が保持される点です。 以下のいずれかの条件が真であると、指定したルーチンは存在すると見なされます。
- 同じ固有名と同じルーチン名を持つルーチンがモジュール内に存在する。
- 指定したルーチンがプロシージャーであり、プロシージャー名が同じでパラメーター数が同じであるプロシージャーがモジュール内に存在する。 パラメーターの名前とデータ・タイプは一致していなくても構いません。
- 指定したルーチンが関数であり、関数名が同じで、かつパラメーターの数が同じでデータ・タイプが一致する関数がモジュール内に存在する。 パラメーター・データ・タイプの長さ、精度、および位取りは比較されないため、指定ルーチンが存在するかどうかを判別するときに異なる可能性があります。 パラメーターの名前は一致していなくても構いません。
- モジュール条件定義 (module-condition-definition)
- モジュール条件を追加します。
- 条件名
- 条件の名前。 この名前は、モジュール内の既存の条件を識別するものであってはなりません。 condition-name は修飾なしで指定しなければなりません (SQLSTATE 42601)。 条件の名前は、モジュール内で固有でなければなりません。 FOR SQLSTATE string-constant
- 条件に関連付ける SQLSTATE を指定します。 string-constant は単一引用符で囲まれている 5 つの文字として指定しなければならず、SQLSTATE クラス (最初の 2 文字) は '00' にすることはできません。 これはオプション節です。
モジュール機能定義 (module-function-definition) - 関数を追加するための構文は、CREATE FUNCTION ステートメントと同じです。ただし、CREATE キーワードと function-name および specific-name の両方は修飾なしで指定しなければならない点は異なります (SQLSTATE 42601)。 関数がモジュール内で固有の場合、新しい関数が追加されます。 関数が、本体 (SQL ルーチン本体または EXTERNAL NAME 節) を含まない既存の関数と一致する場合、この関数プロトタイプは、パブリッシュ済み属性が保持されるという例外を除き、新しい定義によって置き換わります。
モジュール関数定義では、SOURCE 節、TEMPLATE 節、または LANGUAGE OLEDEB オプションを指定することはできません (SQLSTATE 42613)。
モジュール・プロシージャー定義 - プロシージャーを定義するための構文は、CREATE PROCEDURE ステートメントと同じです。ただし、CREATE キーワードと procedure-name および specific-name の両方は修飾なしで指定しなければならない点は異なります (SQLSTATE 42601)。 プロシージャー・シグニチャーがモジュール内で固有の場合、新しいプロシージャーが追加されます。 プロシージャーが、本体 (SQL ルーチン本体または EXTERNAL NAME 節) を含まない既存のプロシージャーと一致する場合、このプロシージャー・プロトタイプは、パブリッシュ済み属性が保持されるという例外を除き、新しい定義によって置き換わります。 SYS_INIT というモジュール初期化プロシージャーを追加する場合に限り、プロシージャーの名前を
SYS_
で始めることができます。 詳細は注を参照してください。 モジュール・タイプ定義 - ユーザー定義タイプを定義するための構文は、CREATE TYPE ステートメントと同じです。ただし、CREATE キーワードと type-name は修飾なしで指定しなければなりません (SQLSTATE 42601)。 ユーザー定義タイプの名前は、モジュール内で固有でなければなりません。 構造化タイプをモジュール内で定義することはできません。 このタイプ定義をサポートするのに必要な生成済み関数も、モジュールで定義されます。 モジュール・ユーザー定義タイプがパブリッシュされると、生成関数になります。 モジュール変数定義 (module-variable-definition)
- 変数を定義するための構文は CREATE VARIABLE ステートメントと同じです。ただし、CREATE キーワードと variable-name は修飾なしで指定しなければなりません (SQLSTATE 42601)。 変数の名前は、モジュール内で固有でなければなりません。
DROP - モジュールの指定部分をドロップします。 モジュールの本体がドロップされない場合は、module-object-identification 構文を使用して、ドロップ対象のオブジェクトを識別します。
- BODY
- モジュール本体をドロップします。以下が含まれます。
- パブリッシュされていないすべてのオブジェクト。
- 任意のパブリッシュ済み SQL ルーチンのルーチン本体。
- 任意のパブリッシュ済み外部ルーチンの EXTERNAL 参照。
公開 - モジュール本体をドロップします。以下が含まれます。
- モジュールに新しいオブジェクトを追加して、使用可能にし、モジュール外で使用できるようにします。 ルーチンの場合、ルーチンの実行可能本体を含まないルーチン・プロトタイプを指定できます。
- モジュール条件定義 (module-condition-definition)
- モジュール外で使用可能なモジュール条件を追加します。
- 条件名
- 条件の名前。 この名前は、モジュール内の既存の条件を識別するものであってはなりません。 condition-name は修飾なしで指定しなければなりません (SQLSTATE 42601)。 条件の名前は、モジュール内で固有でなければなりません。 FOR SQLSTATE ストリング定数
- 条件に関連付ける SQLSTATE を指定します。 string-constant は単一引用符で囲まれている 5 つの文字として指定しなければならず、SQLSTATE クラス (最初の 2 文字) は '00' にすることはできません。 これはオプション節です。
モジュール機能定義 (module-function-definition) - 関数を定義するための構文は、CREATE FUNCTION ステートメントと同じです。ただし、CREATE キーワードと function-name および specific-name の両方は修飾なしで指定しなければならない点は異なります (SQLSTATE 42601)。 この関数の定義には関数名、パラメーターの完全仕様、および戻り節が含まれていなければなりません。 パブリッシュされていないモジュール・ユーザー定義のデータ・タイプは、パラメーター・データ・タイプまたは RETURNS 節データ・タイプの候補とはなりません。 パブリッシュされていないモジュール変数は、パラメーター・データ・タイプまたは戻りデータ・タイプの ANCHOR 節内のアンカー・オブジェクトの候補とはなりません。 LANGUAGE 節を省略 (または LANGUAGE SQL を指定) し、SQL ルーチン本体を省略すると、関数プロトタイプを指定できます。 関数シグニチャーはモジュール内で固有でなければなりません。 関数の名前は、「SYS_」で始めることはできません (SQLSTATE 42939)。 モジュールに追加されたすべての SQL 関数は、コンパウンド SQL (コンパイル) ステートメントが使用された場合のように処理されます。
モジュール関数定義は、SQL ルーチン本体が NOT ATOMIC を指定するコンパウンド SQL (コンパイル済み) ステートメントの場合、RETURNS TABLE 節のみを指定できます。 モジュール関数定義では、SOURCE 節、TEMPLATE 節、または LANGUAGE OLEDEB オプションを指定することはできません (SQLSTATE 42613)。
モジュール・プロシージャー定義 - プロシージャーを定義するための構文は、CREATE PROCEDURE ステートメントと同じです。ただし、CREATE キーワードと procedure-name および specific-name の両方は修飾なしで指定しなければならない点は異なります (SQLSTATE 42601)。 プロシージャーの定義には、プロシージャー名、パラメーターの完全仕様が含まれていなければなりません。 パブリッシュされていないモジュール・ユーザー定義のデータ・タイプは、パラメーター・データ・タイプの候補とはなりません。 パブリッシュされていないモジュール変数は、パラメーター定義の ANCHOR 節内のアンカー・オブジェクトの候補とはなりません。 LANGUAGE 節を省略 (または LANGUAGE SQL を指定) し、SQL ルーチン本体を省略すると、関数プロトタイプを指定できます。 プロシージャー・シグニチャーはモジュール内で固有でなければなりません。 プロシージャーの名前は、「SYS_」で始めることはできません (SQLSTATE 42939)。 モジュール・タイプ定義
- ユーザー定義タイプを定義するための構文は、CREATE TYPE ステートメントと同じです。ただし、CREATE キーワードと type-name は修飾なしで指定しなければなりません (SQLSTATE 42601)。 パブリッシュされていないモジュール・ユーザー定義のデータ・タイプは、モジュール・ユーザー定義のデータ・タイプ定義で参照されるデータ・タイプの候補とはなりません。 パブリッシュされていないモジュール変数は、ANCHOR 節内のアンカー・オブジェクトの候補とはなりません。 ユーザー定義タイプの名前は「SYS_」で始めることはできず (SQLSTATE 42939)、モジュール内で固有でなければなりません。 構造化タイプをモジュール内で定義することはできません。 このタイプ定義をサポートするのに必要な生成済み関数も、モジュール内でパブリッシュ関数として定義されます。 モジュール変数定義 (module-variable-definition)
- 変数を定義するための構文は CREATE VARIABLE ステートメントと同じです。ただし、CREATE キーワードと variable-name は修飾なしで指定しなければなりません (SQLSTATE 42601)。 パブリッシュされていないモジュール・ユーザー定義のデータ・タイプは、変数定義内で参照されるデータ・タイプの候補とはなりません。 パブリッシュされていないモジュール変数は、ANCHOR 節内のアンカー・オブジェクトの候補とはなりません。 変数の名前は「SYS_」で始めることはできず (SQLSTATE 42939)、モジュール内で固有でなければなりません。
モジュール・オブジェクト識別 - モジュール外で使用可能なモジュール条件を追加します。
- 固有のモジュール・オブジェクトを指定します。
- module-function-designator
- 単一のモジュール関数を一意的に識別します。
- FUNCTION 修飾されていない関数名
- 特定の関数を指定します。unqualified-function-name という名前の関数インスタンスがモジュール内に 1 つだけ存在している場合にのみ有効です。 指定する関数には、任意の数のパラメーターを定義できます。 モジュールに指定の名前の関数が存在しない場合は、エラーが生じます (SQLSTATE 42704)。 モジュール内に関数の複数のインスタンスがあると、エラーが生じます (SQLSTATE 42725)。 FUNCTION 非修飾関数名 (データ・タイプ、...)
- 関数を固有に指定する関数シグニチャーを指定します。 関数解決のアルゴリズムは使用されません。 非修飾関数名 (unqualified-function-name)
- 関数の名前を指定します。 データ・タイプ
- 値は、関数が当初定義された際に (対応する位置に) 指定されたデータ・タイプと一致していなければなりません。 データ・タイプの数、およびデータ・タイプを論理的に連結した値が、
特定の関数インスタンスを識別するのに使用されます。
data-type が修飾なしの場合は、SQL パス上でスキーマを検索してタイプ名が決定されます。 REFERENCE タイプに指定するデータ・タイプ名にも同様の規則が当てはまります。
パラメーター化データ・タイプの長さ、精度、または位取りを指定する必要はありません。 空の括弧をコーディングすることによって、 一致データ・タイプの検索時にそれらの属性を無視するように指定することができます。 FLOAT() は、パラメーター値によって異なるデータ・タイプ (REAL または DOUBLE) を表すので、使用できません (SQLSTATE 42601)。 長さ、精度、または位取りをコーディングする場合、 その値は、関数が定義された際に指定された値と完全に一致していなければなりません。
0<n<25 は REAL を意味し、24<n<54 は DOUBLE を意味するので、 FLOAT(n) のタイプは、n に定義された値と一致している必要はありません。 マッチングは、タイプが REAL か DOUBLE かに基づいて行われます。 モジュールに、指定したシグニチャーを持つ関数がない場合は、 エラー (SQLSTATE 42883) になります。
SPECIFIC FUNCTION 非修飾の特定名 - 関数の定義時に指定された名前、またはデフォルト値として与えられた名前を使用して、特定のユーザー定義関数を指定します。 unqualified-specific-name は、モジュール内の特定の関数インスタンスを指定していなければなりません。そうでない場合、エラーが戻されます (SQLSTATE 42704)。
モジュール・プロシージャー指定子 (module-procedure-designator) - 単一のモジュール・プロシージャーを一意的に識別します。
- PROCEDURE 非修飾プロシージャー名 (unqualified-procedure-name)
- 特定のプロシージャーを指定します。unqualified-procedure-name という名前のプロシージャー・インスタンスがモジュール内に 1 つだけ存在している場合にのみ有効です。 指定するプロシージャーには、任意の数のパラメーターを定義できます。 モジュールにこの名前のプロシージャーが存在しない場合は、エラーが戻されます (SQLSTATE 42704)。 モジュール内にプロシージャーの複数のインスタンスがあると、エラーが戻されます (SQLSTATE 42725)。 PROCEDURE 非修飾プロシージャー名 (データ・タイプ)
- プロシージャーを一意的に固有に識別するプロシージャー・シグニチャーを指定します。 プロシージャー解決のアルゴリズムは使用されません。
- 非修飾プロシージャー名 (unqualified-procedure-name)
- プロシージャーの名前を指定します。 データ・タイプ
- 値は、プロシージャーが当初定義された際に (対応する位置に) 指定されたデータ・タイプと一致していなければなりません。 データ・タイプの数、およびデータ・タイプを論理的に連結した値が、
特定のプロシージャー・インスタンスを識別するのに使用されます。
data-type が修飾なしの場合は、SQL パス上でスキーマを検索してタイプ名が決定されます。 REFERENCE タイプに指定するデータ・タイプ名にも同様の規則が当てはまります。
パラメーター化データ・タイプの長さ、精度、または位取りを指定する必要はありません。 空の括弧をコーディングすることによって、 一致データ・タイプの検索時にそれらの属性を無視するように指定することができます。
FLOAT() は、パラメーター値によって異なるデータ・タイプ (REAL または DOUBLE) を表すので、使用できません (SQLSTATE 42601)。 長さ、精度、または位取りをコーディングする場合、 その値は、プロシージャーが定義された際に指定された値と完全に一致していなければなりません。
0<n<25 は REAL を意味し、24<n<54 は DOUBLE を意味するので、 FLOAT(n) のタイプは、n に定義された値と一致している必要はありません。 マッチングは、タイプが REAL か DOUBLE かに基づいて行われます。
モジュールに、指定したシグニチャーを持つプロシージャーがない場合は、エラーが戻されます (SQLSTATE 42883)。
SPECIFIC PROCEDURE 非修飾の特定名 - プロシージャーの定義時に指定された名前、またはデフォルト値として与えられた名前を使用して、特定のプロシージャーを指定します。 unqualified-specific-name は、モジュール内の特定のプロシージャー・インスタンスを指定していなければなりません。そうでない場合、エラーが戻されます (SQLSTATE 42704)。
TYPE タイプ名 - モジュールのユーザー定義タイプを指定します。 type-name は修飾なしで指定する必要があり (SQLSTATE 42601)、モジュール内に存在するユーザー定義タイプを指定しなければなりません (SQLSTATE 42704)。 VARIABLE 変数名
- モジュールのグローバル変数を指定します。 variable-name は修飾なしで指定する必要があり (SQLSTATE 42601)、モジュール内に存在するグローバル変数を指定しなければなりません (SQLSTATE 42704)。 CONDITION 条件名
- モジュールの条件を指定します。 condition-name は修飾なしで指定する必要があり、モジュール内に存在する条件を指定しなければなりません (SQLSTATE 42737)。
- 単一のモジュール関数を一意的に識別します。
ルール
- モジュール内のオブジェクトの名前は「SYS_」で始めることはできません。ただし例外は、明確に指定された SYS_INIT プロシージャー名です (SQLSTATE 42939)。
- ALTER MODULE DROP FUNCTION: この関数は、行権限または列マスクの定義で参照されている場合はドロップできません (SQLSTATE 42893)。
- ALTER MODULE DROP VARIABLE: この変数は、行権限または列マスクの定義で参照されている場合はドロップできません (SQLSTATE 42893)。
- ALTER MODULE DROP BODY: このモジュールは、行権限または列マスクの定義で参照されている場合はドロップできません (SQLSTATE 42893)。
注
- モジュール初期化: モジュールは SYS_INIT という特別な初期化プロシージャーを持つことができます。これは、モジュール・ルーチンまたはモジュール・グローバル変数に対して初めて参照が行われる際に暗黙的に実行されます。 SYS_INIT プロシージャーはパラメーターなしでインプリメントする必要があり、結果セットを戻すことはできません。また、パブリッシュできない SQL または外部プロシージャーがこのプロシージャーになり得ます (SQLSTATE 428HP)。 SYS_INIT プロシージャーが失敗すると、モジュール初期化の原因となったステートメントに関してエラーが戻ります (SQLSTATE 56098)。
- モジュール条件の使用: モジュール条件を使用できるのは、SIGNAL ステートメント、RESIGNAL ステートメント、またはコンパウンド SQL (コンパイル済み) ステートメント内にあるハンドラー宣言だけです。
- 無効化: ルーチン・プロトタイプが ADD アクションを使用して置換されると、パブリッシュ済みモジュール・ルーチンに依存するすべてのオブジェクトが無効化されます。 DROP BODY が発行されると、パブリッシュ済みモジュール・ルーチンに依存しているすべてのオブジェクトが無効化されます。
- 難読化: ALTER MODULE ADD FUNCTION、ALTER MODULE ADD PROCEDURE、ALTER MODULE PUBLISH FUNCTION、および ALTER MODULE PUBLISH PROCEDURE ステートメントを、難読化形式でサブミットできます。 難読化されたステートメントでは、ルーチン名とそのパラメーターのみを判読できます。 残りのステートメントは、読み取れないようにエンコードされますが、データベース・サーバーによりデコードできます。 難読化ステートメントの作成は、DBMS_DDL.WRAP 関数を呼び出すことによって行えます。
例
CREATE MODULE INVENTORY
ALTER MODULE INVENTORY ADD
TYPE ITEMLIST AS INTEGER ARRAY[VARCHAR(100)]
ALTER MODULE INVENTORY ADD
VARIABLE ITEMS ITEMLIST
ALTER MODULE INVENTORY PUBLISH
PROCEDURE UPDATE_ITEM(NAME VARCHAR(100), QUANTITY INTEGER)
BEGIN
SET ITEMS[NAME] = QUANTITY;
END
ALTER MODULE INVENTORY PUBLISH
FUNCTION CHECK_ITEM(NAME VARCHAR(100)) RETURNS INTEGER
RETURN ITEMS[NAME]