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