アプリケーション開発の手引き


ネストされた SQL プロシージャー

SQL プロシージャーに CALL ステートメントを組み込んで他の SQL プロシージャーを呼び出すことができます。この機能はネストされた ストアード・プロシージャーと呼ばれています。この機能によって、既存の SQL プロシージャーを再使用してもっと複雑なアプリケーションを設計することが可能になります。

ネストされた SQL プロシージャー間でのパラメーターの受け渡し

呼び出し元 SQL プロシージャー内からターゲット SQL プロシージャーを呼び出すには、呼び出し元の CALL ステートメントに適切な数およびタイプのパラメーターを含めるだけです。ターゲットが OUT パラメーターを戻す場合には、呼び出し元は戻された値を独自のステートメントで使用することができます。

たとえば、 "SALES_TARGET" という名前のターゲット SQL プロシージャーを呼び出し、 INTEGER タイプの単一の OUT パラメーターを受け入れる SQL プロシージャーを、以下のような SQL で作成できます。

   CREATE PROCEDURE NEST_SALES(OUT budget DECIMAL(11,2))
   LANGUAGE SQL
   BEGIN
      DECLARE total INTEGER DEFAULT 0;
      SET total = 6;
      CALL SALES_TARGET(total);
      SET budget = total * 10000;
   END

ネストされた SQL プロシージャーからの結果セットの戻り

ターゲット SQL プロシージャーによって結果セットが戻される場合、呼び出し元またはクライアント・アプリケーションのいずれかが結果セットを受け取ります。どちらが受け取るかは、ターゲット SQL プロシージャーが発行する DECLARE CURSOR ステートメントによって決まります。ターゲット内の WITH RETURN TO CLIENT 文節が含まれている DECLARE CURSOR ステートメントでは、呼び出し元は結果セットを受け取りません。 WITH RETURN TO CLIENT カーソルでは、結果セットはクライアント・アプリケーションに直接戻されます。

ネストされた SQL プロシージャーから結果セットを戻す方法についての詳細は、 呼び出し元またはクライアントへ結果セットを戻すを参照してください。

ネストされた SQL プロシージャーでの制約事項

アプリケーション・アーキテクチャーを設計する際には、以下のような制約事項を念頭に置いてください。

LANGUAGE
SQL プロシージャーは、 SQL または C で作成されたストアード・プロシージャーしか呼び出せません。 SQL プロシージャー内からは他のホスト言語のストアード・プロシージャーを呼び出すことはできません。

16 レベルのネスト
SQL プロシージャーでは、最大 16 レベルのネストされた呼び出ししか含められません。 SQL プロシージャー A が SQL プロシージャー B を呼び出し、 SQL プロシージャー B が SQL プロシージャー C を呼び出すシナリオは、 3 レベルのネストされた呼び出しの例です。

再帰
再帰的に呼び出す SQL プロシージャーを作成することができます。再帰的 SQL プロシージャーは、前述の最大レベルのネストについての制約事項に準拠する必要があります。

機密保護
SQL プロシージャーは、より高い SQL データ・アクセス・レベルでカタログ化されたターゲット SQL プロシージャーを呼び出すことができません。たとえば、CONTAINS SQL 文節で作成された SQL プロシージャーは CONTAINS SQL 文節または NO SQL 文節のいずれかで作成された SQL プロシージャーを呼び出せますが、 READS SQL DATA 文節または MODIFIES SQL DATA 文節のいずれかで作成された SQL プロシージャーは呼び出せません。

NO SQL 文節で作成された SQL プロシージャーは CALL ステートメントを発行できません。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]