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 AdventureWorks;
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 AdventureWorks;
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
参照
概念
OUTPUT パラメータを使用してデータを返す処理
リターン コードを使用したデータの返却
カーソル (データベース エンジン)
その他の技術情報
ストアド プロシージャからデータを返す処理
CREATE PROCEDURE (Transact-SQL)