SQL遊標的簡單例項
下面是一個遊標的例項,方便初學者學習,也可以防止自己忘記 。
DECLARE H_SETTLE CURSOR SCROLL FOR SELECT * FROM TABELNAME --宣告一個可迴圈操作的遊標
OPEN H_SETTLE --開啟遊標
FETCH FIRST FROM H_SETTLE INTO @VARIABLE_NAME=FIELD_NAME,@VARIABLE_NAME=FIELD_NAME --遊標移到第一個記錄
WHILE (@@FETCH_STATUS=0) --檢查遊標是不是最後一個,如果不是則進行中間的程式
BEGIN
…… --一段處理程式段
FETCH NEXT FROM H_SETTLE INTO @VARIABLE_NAME=FIELD_NAME,@VARIABLE_NAME=FIELD_NAME --遊標移到下一個記錄
END
CLOSE H_SETTLE --關閉遊標
DEALLOCATE H_SETTLE --釋放遊標
------------------------------------以上是SQL2005下的例子------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------以下是SQL2008下的例子------------------------------------
--宣告變數DECLARE @Pat_IN_HOS_ID DECIMAL(18,0)
DECLARE @IN_BILL_ID DECIMAL(18,0) --需要插入的IN_BILL_ID
DECLARE @PAT_IN_CHARGE_DOC_ID VARCHAR(35) --上一行記錄的值
DECLARE @IN_HOS_DOC_ID VARCHAR(35) --上一行記錄的值
DECLARE @CHIEF_DOC_ID VARCHAR(35) --上一行記錄的值
DECLARE @MANAGE_BED_NURSE_ID VARCHAR(35) --上一行記錄的值
--判斷臨時表是否存在,不存在在建立臨時表,用於儲存修改記錄
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[DBO].[IN_BILL_RECORD_LSG]') AND type in (N'U'))
BEGIN
--如果不存在建立一個表,用於備份要修改的資料
END
--把需要修改的記錄插入到臨時表
INSERT INTO [DBO].IN_BILL_RECORD_LSG **************************************
--定義遊標,用於迴圈處理需要處理的記錄
DECLARE CUR_INBILL CURSOR SCROLL FOR SELECT b.IN_BILL_ID,b.PAT_IN_HOS_ID FROM [DBO].IN_BILL_RECORD_EXTEND a
RIGHT JOIN [DBO].IN_BILL_RECORD b ON a.IN_BILL_ID = b.IN_BILL_ID WHERE PAT_IN_CHARGE_DOC_ID IS NULL
AND CREATE_TIME>='2014-09-09 00:00:00.000' ORDER BY b.IN_BILL_ID ASC
--開啟遊標
OPEN CUR_INBILL
FETCH FIRST FROM CUR_INBILL INTO @IN_BILL_ID,@Pat_IN_HOS_ID
WHILE (@@FETCH_STATUS=0)
BEGIN
--處理過程
--迴圈下一個遊標
FETCH NEXT FROM CUR_INBILL INTO @IN_BILL_ID,@Pat_IN_HOS_ID
END
--關閉遊標並釋放變數
CLOSE CUR_INBILL
DEALLOCATE CUR_INBILL