17.00 - 17.05 - 動的結果セットの詳細 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 詳細トピック

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Release Date
2020年6月
Content Type
プログラミング リファレンス
Publication ID
B035-1184-170K-JPN
Language
日本語 (日本)

CALLリクエストのOUTまたはINOUT値の結果には制限がありません。 動的結果セットにより、SQLプロシージャは単一または15までの結果セットを返すことができます。 各結果セットは、いくつかのSELECTリクエストを含むマクロと異なるわけではなく、単一複文リクエストに返されるのと同じように返されます。 応答はマクロからの出力と同じです。 マクロ内に複数のSELECT文がある場合、SELECTリクエストに対して複数の文の応答が作成されます。

プロシージャが実行するプロセスは次のとおりです。

  1. DYNAMIC RESULT SETS number_of_sets指定を使用して、CREATE PROCEDURE文はプロシージャが返すことのできる結果セットの最大数を確立します。number_of_setsのこの値は、0から15の範囲内です。指定された範囲は、動的結果セットにのみ適用され、INOUTまたはOUTパラメータで返される結果を含みない

    システムは、結果セットをクライアント アプリケーションに複文応答スプールの形式で返します。

  2. DECLARE CURSOR文により、プロシージャは結果セットを作成できます。DECLARE CURSOR文のSELECT句は、結果セットを決定します。DECLARE CURSOR文は、結果セット カーソルになるWITH RETURNも含みます。詳細は、Teradata Vantage™ - SQLストアド プロシージャおよび埋め込みSQL、B035-1148を参照してください。
  3. システムは、OPEN文でカーソルを開くときに結果セットを作成します。

    OPEN文により、DECLARE CURSOR文のSELECT句が実行され、結果セットが作成されます。結果セットは、開かれた順番で返されます。

    結果セットが呼び出し側に返されるようにプロシージャを終了するとき、カーソルを開いたままにする必要があります。これは、プロシージャが単一結果セットを返す場合、プロシージャが終了されるときにすべてのカーソルが閉じられる場合を対比します。また、カーソルは、複合文内でカーソルが開かれた場合に、複合文の終了時に閉じられます。

    ただし、WITH RETURN句を指定するカーソルは、プロシージャの終了時には閉じられません。プロシージャが結果カーソルを閉じる場合、結果セットは削除され、呼び出し側には返されません。

    結果セットは、開かれた順番で返されます。

  4. プロシージャがクライアントまたは外部プロシージャから呼び出される場合、複文結果の形式で結果セットが返されます。これは、複数のSELECT文を含むマクロが実行された場合に作成される形式とまったく同じです。

    最初の結果は最初の文に対するもので、プロシージャへのOUTまたはINOUT引数の結果です。2番目およびそれ以降の結果スプールは、開かれた順の結果セットの出力です。

    プロシージャの呼び出し元 結果セットを返す対象
    プロシージャ プロシージャ
    クライアント アプリケーション クライアント アプリケーション
  5. プロシージャは、DECLARE CURSOR文の動的形式を使用します。

    この場合、DECLARE CURSOR文が、静的な場合に指定するSELECT文の代わりに文の名前を指定します。

    文の名前は、PREPARE文により参照され、文字列に含まれる動的SELECT文を準備します。準備されたSELECT文は、カーソルがOPEN文で開かれるときに実行されます。

システムは、次のSQLカーソルおよび制御言語文によりこの機能をサポートします。
  • CREATE PROCEDUREおよびREPLACE PROCEDURE文DYNAMIC RESULT SETS句

    DYNAMIC RESULT SETS句は、返される結果セットの最大数を指定します。

  • DECLARE CURSOR文WITH RETURN句

    WITH RETURN句は、開かれるカーソルがクライアントまたは呼び出し側に返される結果セット カーソルであることを指定します。

    詳細は、<動的結果セットのルールと制限>および<Teradata Vantage™ - SQLストアド プロシージャおよび埋め込みSQL、B035-1148>を参照してください。

  • PREPARE文

    この文により、プロシージャは動的DECLARE CURSOR文を作成し、別の結果セットの作成を可能にします。

    PREPAREにより、動的パラメータ マーカーが許可されます。

    詳細は、<Teradata Vantage™ - SQLストアド プロシージャおよび埋め込みSQL、B035-1148>を参照してください。

  • OPEN文USING句

    USING句は、動的DECLARE CURSOR文で使用される動的パラメータ マーカーの使用をサポートします。

    詳細は、<Teradata Vantage™ - SQLストアド プロシージャおよび埋め込みSQL、B035-1148>を参照してください。

呼び出し側がクライアント アプリケーションであっても、別のプロシージャであっても、結果セットがプロシージャの呼び出し側に返されるように、DYNAMIC RESULT SETS句を指定する必要があります。この句はオプションで、プロシージャが結果セットを返さない場合は使用されません。DYNAMIC RESULT SETS句を指定しない場合、システムはゼロの結果セットを想定します。この合計数には、INOUTまたはOUTパラメータで返された結果は含まれていません。

結果セットは、呼び出しプロシージャまたはクライアント アプリケーションのいずれかに返すことができますが、両方に返すことはできません。

プロシージャの結果セット出力は、プロシージャOUTまたはINOUTパラメータ結果行の結果の後、応答スプールに表示されます。結果セットは、マクロがいくつかのSELECT文を実行するように作成されている場合に、応答スプールが表示される様子に似た応答スプールです。唯一異なる点は、結果セットがプロシージャからきていることを示す追加のパーセルです。

例えば、次のマクロの応答スプールとそれに続くプロシージャの応答スプールは同じですが、プロシージャ出力引数のタイトルと、マクロおよび成功の応答は異なります。

CREATE MACRO sample_m (c INTEGER) AS (
  SELECT :c+1;

  SELECT *
  FROM m1;

  SELECT *
  FROM m2
  WHERE m2.a > :c;) ;

このマクロからのBTEQ出力は次のとおりです。

EXEC sample_m(1);
 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

      (c+1)
-----------
          2

 *** Query completed. One row found. 2 columns returned.

          a                       b
-----------  ----------------------
          1   2.00000000000000E 000

 *** Query completed. One row found. 2 columns returned.

          a                       b
-----------  ----------------------
          2   4.00000000000000E 000

結果セットを使用する次のプロシージャは、同じ出力を作成します。

CREATE PROCEDURE sample_p (INOUT c INTEGER)
  DYNAMIC RESULT SETS 2
    BEGIN
       DECLARE cursor_1 CURSOR WITH RETURN FOR
         SELECT * FROM m1;
       DECLARE cursor_2 CURSOR WITH RETURN FOR
         SELECT * FROM m2 WHERE m2.a > c;
       SET c = c +1;
       OPEN cursor_1;
       OPEN cursor_2;
    END;

プロシージャからのBTEQ出力は次のとおりです。

CALL sample_p(1);
 *** Procedure has been executed.
 *** Total elapsed time was 1 second.
          1
-----------
          2

 *** Procedure has been executed. One row found. 2 columns returned.
 *** Starting Row Number: 1
 *** Database Name: FSK
 *** Procedure Name: SAMPLE_P

          a                       b
-----------  ----------------------
          1   2.00000000000000E 000

 *** Procedure has been executed. One row found. 2 columns returned.
 *** Starting Row Number: 1
 *** Database Name: FSK
 *** Procedure Name: SAMPLE_P

          a                       b
-----------  ----------------------
          2   4.00000000000000E 000

DYNAMIC結果セット句を含む呼び出されたプロシージャは、次のSQLSTATE警告を返すことがあります。

SQLSTATEコード 意味
‘0100C’ プロシージャが追加の結果セットを返しました。

プロシージャが結果セットを作成するとき、システムはこのSQLSTATE警告を返します。

‘0100E’ プロシージャが返そうとした結果セットが多すぎました。

プロシージャが、DYNAMIC RESULT SETS句で指定した数より多くの結果セット カーソルを開いたままにすると、システムはこのSQLSTATE警告コードを返します。