モジュール内のルーチン・プロトタイプのインプリメンテーションの追加

1 つ以上のルーチン・プロトタイプをモジュール内に定義した後、定義済みルーチン・プロトタイプのルーチン本体をインプリメントするタスクを実行できます。

始める前に

このタスクを進める前に、以下を行ってください。
  • ALTER MODULE ステートメントについての説明を確認します。
  • ALTER MODULE ステートメントの実行に必要な特権があることを確認します。

このタスクについて

モジュール SQL プロシージャーをプロトタイプとして最初に宣言することが可能です。 SQL プロシージャー・プロトタイプを使用すると、ルーチン本体のロジックを直ちに指定せずに、プロシージャーとそのパラメーターを定義することができます。

ルーチンのインプリメンテーションを完了する前にルーチン・プロトタイプを定義すると、他のルーチンを相互参照する複数のルーチンの作成順序を考慮しなくてもよいため、便利です。 プロトタイプを使用しない場合を考えましょう。 例えば A、B、C という 3 つのルーチンがあり、A が B を、B が C をそれぞれプログラムで呼び出すとすると、C、B、A という順序でルーチンを作成する必要があります。最初にルーチン・プロトタイプを作成しておくと、任意の順序でルーチンをインプリメントし、他のルーチンを名前で参照して、それを後でインプリメントすることができます。

ルーチン本体のないルーチンを呼び出すことはできません。 プロトタイプとして定義されたルーチンのルーチン本体をインプリメントすることは、ルーチンを正常に呼び出すための前提条件です。

制約事項

モジュールの制約事項については、モジュールに関する制約事項を参照してください。

手順

  1. 次のようにして ALTER MODULE ステートメントを定式化します。
    1. モジュール内にプロトタイプが既に定義されている関数またはプロシージャーをインプリメントするために、ADD 節を指定します。
    2. モジュール関数定義またはモジュール・プロシージャー定義のいずれか 1 つを指定してください。 元のプロトタイプが指定されたのと同じ方法で、オーバーライドするルーチンを指定する必要があります。 つまり、既存のルーチンと全く同じようにパラメーターを指定する必要があります (各パラメーターのパラメーター名、データ・タイプ、および IN、OUT、INOUT 属性)。
    3. 変更すべき属性値があれば、それを指定します。 何も指定しない場合、元のプロトタイプ定義の属性値が維持されます。
  2. サポートされる インターフェースから ALTER MODULE ステートメントを実行します。
  3. ステップ 1 から 2 を繰り返して、モジュール内の追加のルーチン定義を完成します。

タスクの結果

ALTER MODULE ステートメントが正常に実行されると、モジュール内のルーチンが完全に定義されて、呼び出し可能になります。 ルーチンの属性が変更されるのは、それが明示的に指定されて、しかも既存のルーチンと異なっている場合だけです。 オーバーライドされたルーチンは元の公開フラグを保持し、引き続きモジュール外部でルーチンを使用できます。

以下の例のスクリプトでは、モジュールが作成され、より複雑なプロシージャー・プロトタイプが公開されて、公開プロトタイプ用のプロシージャー定義が追加されます。

CREATE MODULE moo@

ALTER MODULE moo PUBLISH PROCEDURE prot 
(IN a INT, IN b BIGINT, IN c VARCHAR(20))
LANGUAGE SQL@

ALTER MODULE moo ADD PROCEDURE prot
(IN a INT, IN b BIGINT, IN c VARCHAR(20))
BEGIN
  DECLARE stmt VARCHAR(1000);
  DECLARE c1 CURSOR WITH RETURN FOR sl;

  SET stmt = 'SELECT 1 FROM (values(1))';
  PREPARE sl FROM stmt;
  OPEN c1;
END@


ALTER MODULE moo PUBLISH FUNCTION fprot (r1 INT)
RETURNS int@

ALTER MODULE moo ADD FUNCTION fprot (r1 INT)
RETURNS int
BEGIN
   RETURN r1-1;
END
@

次のタスク

完全なルーチン定義をモジュールに追加し終わったら、ルーチンを正常に呼び出すことができます。