在 OUTPUT 參數中使用 cursor 資料類型
Transact-SQL 預存程序只能在 OUTPUT 參數使用 cursor 資料類型。如果參數指定 cursor 資料類型,就需要 VARYING 和 OUTPUT 參數。如果參數指定 VARYING 關鍵字,資料類型必須為 cursor,也必須指定 OUTPUT 關鍵字。
[!附註]
cursor 資料類型不可透過 OLE DB、ODBC、ADO 以及 DB-Library 之類的資料庫 API 繫結至應用程式變數。因為必須先繫結 OUTPUT 參數,然後應用程式才能執行預存程序,所以不能從資料庫 API 呼叫具有 cursor OUTPUT 參數的預存程序。只有當 cursor OUTPUT 變數指定給 Transact-SQL 本機 cursor 變數時,才可以從 Transact-SQL 批次、預存程序或觸發程序呼叫這些程序。
cursor 輸出參數
以下規則是有關程序執行時的 cursor 輸出參數:
順向資料指標的結果集之中只會傳回執行預存程序結束時,位於或超過資料指標所在位置的資料列,例如:
一個無法捲動的資料指標在 RS 結果集 (有 100 個資料列) 的程序中開啟。
此程序擷取 RS 結果集的前 5 個資料列。
此程序傳回呼叫者。
傳回呼叫者的 RS 結果集是由 RS 的第 6 到第 100 個資料列所構成,而呼叫者中的資料指標位於 RS 的第一個資料列之前。
如果順向資料指標在預存程序完成時位於第一個資料列之前,整個結果集都會傳回呼叫的批次、預存程序或觸發程序。傳回時,資料指標的位置會設定在第一個資料列之前。
如果順向資料指標在預存程序完成時位於最後一個資料列之後,便會將空的結果集傳回呼叫的批次、預存程序或觸發程序。
[!附註]
空的結果集與 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
接下來,執行一個宣告區域資料指標變數的批次、執行此程序將資料指標指派給區域變數,再從資料指標擷取資料列。
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