ALLOCATE - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLストアド プロシージャおよび埋め込みSQL

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/xqq1557098602407.ditamap
dita:ditavalPath
ja-JP/xqq1557098602407.ditaval
dita:id
B035-1148
Product Category
Software
Teradata Vantage

目的

呼び出し側のストアド プロシージャから、呼び出し先のストアド プロシージャが返した結果セットを取り出せるようにします。

呼び出し

実行可能形式。

ストアド プロシージャ。

構文

ALLOCATE cursor_name CURSOR FOR PROCEDURE procedure_name ;
cursor_name
事前に開かれている参照先カーソルの名前。
procedure_name
呼び出し先のSQLストアド プロシージャの名前。

ANSI準拠

ANSI/ISO SQL:2011準拠。

許可

なし。

ルール

  • 最初にNO SCROLLでカーソルが開かれていると、そのカーソルは結果セットの「最初の行」に配置されます。

    たとえば、最初のカーソルが10行の行を返し、そのうちの3行をストアド プロシージャが読み取ったとすると、残りの7行が返されます。結果セットは4番目の行から始まりますが、その行が最初の行のように見えます。

  • 最初にSCROLLでカーソルが開かれていると、そのカーソルは直前に取り出された行の直後の行に配置されます。

    例えば、カーソルが全部で10行を返したとすると、初期位置は4番目の行になります。

  • カーソルがSCROLLで開かれていれば、呼び出し側が直前に取り出された行より前の行にカーソルを再配置できます。
  • カーソルがNO SCROLLまたはSCROLLのどちらで開かれていても、結果セットが複数ある場合には、それぞれの結果セットを連続的に取り出します。
  • プロシージャが結果セットを作成しない場合や、すべての結果セットが取り出されてしまっている場合には、SQLSTATE完了条件'02001' (返される追加の動的結果セットが存在しない)が返されます。
  • 最初の結果セットの末尾に達した時点で、そのFETCH文にはSQLSTATE '02000' (データが存在しない)が設定されます。次に続く結果セットがあるときには、その結果セットを取得するために、開いているカーソルを閉じる必要があります。
  • 追加の結果セットがないときにカーソルを閉じると、そのCLOSE文にはSQLSTATE完了条件'02001' (返される追加の動的結果セットが存在しない)が返されることになります。
  • 追加の結果セットが存在する場合、次の警告が返されます。'0100D' (返される追加の動的結果セットが存在する)。

例: ALLOCATEの使用

REPLACE PROCEDURE alloc007()
DYNAMIC RESULT SETS 1
BEGIN
    DECLARE EmpNo0  SMALLINT;
    DECLARE ProjId0 CHAR(8);
    DECLARE WkEnd0  DATE;
    DECLARE Hours0  DECIMAL(4,1);
    DECLARE ee0 CHAR(8);
    DECLARE ff0 VARCHAR(25);
    DECLARE gg0 DATE;
    DECLARE hh0 DATE;
    DECLARE ii0 DATE;
    CALL drs_temp5();
    ALLOCATE my_fetch CURSOR FOR PROCEDURE drs_temp5;
    FETCH FIRST FROM my_fetch INTO empno0,projid0,wkend0,hours0;
    INSERT INTO charges_temp2(empno0,projid0,wkend0,hours0);
    WHILE (SQLCODE = 0)
    DO
        FETCH NEXT FROM my_fetch INTO empno0,projid0,wkend0,hours0;
        IF (SQLCODE = 0)
        THEN
            INSERT INTO charges_temp2(empno0,projid0,wkend0,hours0);
        END IF;
    END WHILE;
    -- close the current result set cursor
    CLOSE my_fetch;
    -- see if there are result sets
    WHILE (SQLSTATE = '0100D')
    DO
        -- allocate the next one.
        ALLOCATE sp2 CURSOR FOR PROCEDURE drs_temp5;
        WHILE (SQLCODE = 0)
        DO
            FETCH NEXT FROM sp2 into ee0,ff0,gg0,hh0,ii0;
            IF (SQLCODE = 0)
            THEN
                INSERT INTO project_temp1(ee0,ff0,gg0,hh0,ii0);
            END IF;
        END WHILE;
        CLOSE sp2;
    END WHILE;
END;