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