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


SQL プロシージャーからの結果セットの戻り

SQL プロシージャーから結果セットを戻す方法は、外部ストアード・プロシージャーから結果セットを戻す方法に似ています。 SQL プロシージャーからの結果セットを受け入れるには、クライアント・アプリケーションは CLI、 JDBC、または SQLJ アプリケーション・プログラミング・インターフェースを使用する必要があります。他の SQL プロシージャーを呼び出す SQL プロシージャーは、それらのプロシージャーからの結果セットを受け入れることができます。 SQL プロシージャーからの結果セットを戻すには、以下のような SQL プロシージャーを作成します。

  1. CREATE PROCEDURE ステートメントの DYNAMIC RESULT SETS 文節を使用して、SQL プロシージャーによって戻される結果セットの数を宣言します。
  2. DECLARE CURSOR ステートメントを使用してカーソルを宣言します。
  3. OPEN CURSOR ステートメントを使用してカーソルをオープンします。
  4. カーソルをクローズせずに SQL プロシージャーを終了します。

たとえば、INOUT パラメーター threshold の値に応じて、単一の結果セットを戻す SQL プロシージャーを以下のように作成できます。

   CREATE PROCEDURE RESULT_SET (INOUT threshold SMALLINT)
   LANGUAGE SQL
   DYNAMIC RESULT SETS 1
   BEGIN
      DECLARE cur1 CURSOR WITH RETURN TO CALLER FOR
          SELECT name, job, years
          FROM staff
          WHERE years < threshold;
      OPEN cur1;
   END

呼び出し元またはクライアントへ結果セットを戻す

ご使用のアプリケーションがネストされた SQL プロシージャーから結果セットを戻す場合には、 DECLARE CURSOR ステートメントの WITH RETURN 文節を使用して DB2 が適切な位置に結果セットを戻すようにする必要があります。ターゲット SQL プロシージャーが結果セットを呼び出し元 SQL プロシージャーに戻す場合には、呼び出し元は ALLOCATE CURSOR および ASSOCIATE RESULT SET LOCATOR ステートメントを使用して結果セットにアクセスし、使用する必要があります。

クライアントへ結果セットを戻す

SQL プロシージャーからの結果セットをクライアント・アプリケーションに必ず戻すようにするには、結果セットに関連した DECLARE CURSOR ステートメントの WITH RETURN TO CLIENT 文節を使用します。次の例では、 SQL プロシージャー "CLIENT_SET" は DECLARE CURSOR ステートメントの WITH RETURN TO CLIENT 文節を使用してクライアント・アプリケーションに結果セットを戻します。これは、"CLIENT_SET" がネストされた SQL プロシージャーの CALL ステートメントであるときも同様です。

   CREATE PROCEDURE CLIENT_SET()
   DYNAMIC RESULT SETS 1
   LANGUAGE SQL
   BEGIN
      DECLARE clientcur CURSOR WITH RETURN TO CLIENT
          FOR SELECT name, dept, job
          FROM staff
          WHERE salary > 20000;
      OPEN clientcur;
   END

呼び出し元へ結果セットを戻す

呼び出し元がクライアント・アプリケーションであるかまたは別の SQL プロシージャーであるかにかかわりなく SQL プロシージャーの直接の呼び出し元へ結果セットを戻すには、結果セットに関連した DECLARE CURSOR ステートメントの WITH RETURN TO CALLER 文節を使用します。次の例では、 SQL プロシージャー "CALLER_SET" は、 WITH RETURN TO CALLER 文節を使用して結果セットを CALLER_SET の呼び出し元に戻します。

   CREATE PROCEDURE CALLER_SET()
   DYNAMIC RESULT SETS 1
   LANGUAGE SQL
   BEGIN
      DECLARE clientcur CURSOR WITH RETURN TO CALLER
          FOR SELECT name, dept, job
          FROM staff
          WHERE salary > 15000;
      OPEN clientcur;
   END

呼び出し元として結果セットを受け取る

呼び出し元の SQL プロシージャーがターゲット SQL プロシージャーから結果セットを受け取ることを期待している場合には、 ALLOCATE CURSOR および ASSOCIATE RESULT SET LOCATOR ステートメントを使用して結果セットにアクセスし、使用する必要があります。

ASSOCIATE RESULT SET LOCATOR
呼び出し元に 1 つまたは複数の結果セットを戻すターゲット SQL ステートメントへの CALL ステートメントの後は、呼び出し元の SQL プロシージャーはこのステートメントを発行して、戻される結果セットにそれぞれ結果セット・ロケーター変数を割り当てる必要があります。たとえば、ターゲット SQL プロシージャーから 3 つの結果セットを受け取るはずの呼び出し元 SQL プロシージャーは、以下のような SQL で構成されるかもしれません。

   DECLARE result1 RESULT_SET_LOCATOR VARYING;
   DECLARE result2 RESULT_SET_LOCATOR VARYING;
   DECLARE result3 RESULT_SET_LOCATOR VARYING;
   CALL targetProcedure();
   ASSOCIATE RESULT SET LOCATORS(result1, result2, result3)
      WITH PROCEDURE targetProcedure;

ALLOCATE CURSOR
呼び出し元 SQL プロシージャーで ALLOCATE CURSOR ステートメントを使用して、ターゲット SQL プロシージャーから戻された結果セットをオープンします。 ALLOCATE CURSOR ステートメントを使用するには、 ASSOCIATE RESULT SET LOCATORS ステートメントを通して結果セットは既に結果セット・ロケーターに関連していなければなりません。 SQL プロシージャーが ALLOCATE CURSOR ステートメントを発行すると、ALLOCATE CURSOR で宣言されているカーソル名を使用して結果セットから行を取り出すことができます。前述の ASSOCIATE LOCATORS の例を拡張するには、以下のような SQL を使用して SQL プロシージャーは最初に戻された結果セットから行を取り出すことができます。

   DECLARE result1 RESULT_SET_LOCATOR VARYING;
   DECLARE result2 RESULT_SET_LOCATOR VARYING;
   DECLARE result3 RESULT_SET_LOCATOR VARYING;
   CALL targetProcedure();
   ASSOCIATE RESULT SET LOCATORS(result1, result2, result3)
      WITH PROCEDURE targetProcedure;
   ALLOCATE rsCur CURSOR FOR result1;
   WHILE (at_end = 0) DO
      SET total1 = total1 + var1;
      SET total2 = total2 + var2;
      FETCH FROM rsCur INTO var1, var2;
   END WHILE;


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