次の方法で共有


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

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

ms175498.note(ja-jp,SQL.90).gifメモ :
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 行目の前に設定されます。
  • 順方向専用カーソルの場合、ストアド プロシージャが完了した時点でカーソルが最後の行の後にあれば、呼び出し元のバッチ、ストアド プロシージャ、またはトリガには空の結果セットが返されます。
    ms175498.note(ja-jp,SQL.90).gifメモ :
    空の結果セットは、NULL 値と同じではありません。
  • スクロール可能なカーソルの場合、ストアド プロシージャの実行が終了した時点で、呼び出し元のバッチ、ストアド プロシージャ、またはトリガに結果セット内のすべての行が返されます。結果セットが返されるとき、カーソル位置はプロシージャで最後にフェッチを行った位置のままです。
  • カーソルがクローズしている場合、カーソルの種類にかかわらず、呼び出し元のバッチ、ストアド プロシージャ、またはトリガには NULL 値が返されます。カーソルがパラメータに割り当てられていて、そのカーソルが一度も開かれない場合も、同じ結果になります。
    ms175498.note(ja-jp,SQL.90).gifメモ :
    カーソルがクローズしているかどうかが問題になるのは、結果セットが返される時点のみです。たとえば、プロシージャの途中でカーソルを閉じて、その後で再び開いて、そのカーソルの結果セットを呼び出し元のバッチ、ストアド プロシージャ、またはトリガに返すのは有効な操作です。

次の例では、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)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手