OUTPUT パラメータでの cursor データ型の使用

Transact-SQL ストアド プロシージャは、OUTPUT パラメータにのみ cursor 型を使用できます。パラメータに cursor 型を指定するときは、VARYING パラメータと OUTPUT パラメータの両方が必要です。パラメータに VARYING キーワードを指定するときは、データ型を cursor 型にして、OUTPUT キーワードを指定する必要があります。

注意

cursor 型は OLE DB、ODBC、ADO、DB-Library などのデータベース API からアプリケーション変数にバインドすることができません。アプリケーションでストアド プロシージャを実行するには OUTPUT パラメータがバインドされている必要があるので、cursor 型の OUTPUT パラメータを指定したストアド プロシージャはデータベース API から呼び出すことができません。そのようなストアド プロシージャは、cursor 型の OUTPUT 変数を Transact-SQL の cursor 型のローカル変数に代入したときのみ、Transact-SQL バッチ、ストアド プロシージャ、またはトリガから呼び出すことができます。

cursor 出力パラメータ

プロシージャの実行時には、次の規則が cursor 出力パラメータに適用されます。

  • 順方向専用カーソルの場合、カーソルの結果セットとして返される行は、ストアド プロシージャの実行が終了したときにカーソルがあった位置以降の行に限られます。たとえば、次のようになります。

    • RS という名前の 100 行から構成される結果セットに対するプロシージャ内で、スクロールできないカーソルが開かれます。

    • プロシージャにより結果セット RS の最初の 5 行がフェッチされます。

    • プロシージャが呼び出し元に戻ります。

    • 呼び出し元に返される結果セット RS は RS の 6 行目から 100 行目までで構成され、呼び出し元のカーソルは RS の 1 行目の前に置かれます。

  • 順方向専用カーソルの場合、ストアド プロシージャが完了した時点でカーソルが 1 行目の前にあれば、呼び出し元のバッチ、ストアド プロシージャ、またはトリガには結果セット全体が返されます。結果セットが返されるとき、カーソル位置は 1 行目の前に設定されます。

  • 順方向専用カーソルの場合、ストアド プロシージャが完了した時点でカーソルが最後の行の後にあれば、呼び出し元のバッチ、ストアド プロシージャ、またはトリガには空の結果セットが返されます。

    注意

    空の結果セットは、NULL 値と同じではありません。

  • スクロール可能なカーソルの場合、ストアド プロシージャの実行が終了した時点で、呼び出し元のバッチ、ストアド プロシージャ、またはトリガに結果セット内のすべての行が返されます。結果セットが返されるとき、カーソル位置はプロシージャで最後にフェッチを行った位置のままです。

  • カーソルがクローズしている場合、カーソルの種類にかかわらず、呼び出し元のバッチ、ストアド プロシージャ、またはトリガには NULL 値が返されます。カーソルがパラメータに割り当てられていて、そのカーソルが一度も開かれない場合も、同じ結果になります。

    注意

    カーソルがクローズしているかどうかが問題になるのは、結果セットが返される時点のみです。たとえば、プロシージャの途中でカーソルを閉じて、その後で再び開いて、そのカーソルの結果セットを呼び出し元のバッチ、ストアド プロシージャ、またはトリガに返すのは有効な操作です。

次の例では、cursor データ型の出力パラメータ @currency_cursor を指定したストアド プロシージャを作成します。作成したストアド プロシージャはバッチで呼び出します。

まず、Currency テーブルに対してカーソルを宣言し、そのカーソルを開くプロシージャを作成します。

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ( 'dbo.uspCurrencyCursor', 'P' ) IS NOT NULL
    DROP PROCEDURE dbo.uspCurrencyCursor;
GO
CREATE PROCEDURE dbo.uspCurrencyCursor 
    @CurrencyCursor CURSOR VARYING OUTPUT
AS
    SET NOCOUNT ON;
    SET @CurrencyCursor = CURSOR
    FORWARD_ONLY STATIC FOR
      SELECT CurrencyCode, Name
      FROM Sales.Currency;
    OPEN @CurrencyCursor;
GO

次に、cursor 型のローカル変数を宣言し、そのローカル変数にカーソルを代入するプロシージャを実行し、代入したカーソルから行をフェッチするというバッチを実行します。

USE AdventureWorks2008R2;
GO
DECLARE @MyCursor CURSOR;
EXEC dbo.uspCurrencyCursor @CurrencyCursor = @MyCursor OUTPUT;
WHILE (@@FETCH_STATUS = 0)
BEGIN;
     FETCH NEXT FROM @MyCursor;
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor;
GO