本文主講SQL Server數據庫中 遊標CURSOR
的使用,歡迎閱讀~
📋本文目錄
前言
將SQL嵌入到高級語言中混合編程,SQL語句負責操縱數據庫,高級語言語句負責控制邏輯流程。
數據庫工作單元與源程序工作單元之間的通信主要包括:
(1) 向主語言傳遞SQL語句的執行狀態信息,使主語言能夠據此信息控制程序流程,主要用SQL通信區( SQL Communication Area, SQLCA)實現。
(2) 主語言向SQL語句提供參數,主要用主變量(host variable) 實現。
(3) 將SQL語句查詢數據庫的結果交主語言處理,主要用主變量和遊標(cursor) 實現。
ps:SQL語句中使用的主語言程序變量簡稱爲主變量,根據其作用的不同又可分爲輸入主變量和輸出主變量
爲什麼要使用遊標
👀SQL語言是面向集合的,一條SQL語句可以產生或處理多條記錄;而主語言是面向記錄的,一組主變量一次只能存放一條記錄。
所以僅僅使用主變量並不能完全滿足SQL語句嚮應用程序輸出數據的要求,爲此嵌入式SQL引入了遊標的概念,用來協調這兩種不同的處理方式~
遊標是系統爲用戶開設的數據緩衝區,存放SQL語句的執行結果,每個遊標區都有一個名字。
用戶可以用SQL語句逐一從遊標中獲取記錄,並賦給主變量,交由主語言進一步處理~
使用遊標的SQL語句
一般情況下,SELECT語句查詢結果是多條記錄,因此需要用遊標機制將多條記錄一次一條地送給主程序處理,從而把對集合的處理轉換爲對單個記錄的處理。
使用遊標的步驟:
(1)說明遊標
用DECLARE
語句爲一條SELECT語句定義遊標:
EXEC SQL DECLARE<遊標名> CURSOR FOR <SELECT 語句>;
ps:定義遊標僅僅是一條說明性語句, 這時關係數據庫管理系統並不執行SELECT語句。
(2)打開遊標
用OPEN語句將定義的遊標打開。
EXEC SQL OPEN <遊標名>;
打開遊標實際上是執行相應的SELECT語句,把查詢結果取到緩衝區中。這時遊標處於活動狀態,指針指向查詢結果集中的第一條記錄。
(3)推進遊標指針並取當前記錄
EXEC SQL FETCH <遊標名>
INTO <主變量>[<指示變量>][,<主變量>[<指示變量>]]...;
其中主變量必須與SELECT語句中的目標列表達式具有一一對應關係。
用FETCH
語句把遊標指針向前推進一條記錄,同時將緩衝區中的當前記錄取出來送至主變量供主語言進一步處理。通過循環執行FETCH語句逐條取出結果集中的行進行處理。
(4)關閉遊標
用CLOSE語句關閉遊標,釋放結果集佔用的緩衝區及其他資源。
EXEC SQL CLOSE <遊標名>;
遊標被關閉後就不再和原來的查詢結果集相聯繫。但被關閉的遊標可以再次被打開,與新的查詢結果相聯繫。
🌟來看實例:
IF (exists (select * from sys.objects where name = 'proc_cursor'))
DROP PROCEDURE proc_cursor
GO
CREATE PROCEDURE proc_cursor --創建存儲過程
AS
DECLARE @Sno char(9) --定義變量
DECLARE @Sname char(20) --定義變量
DECLARE mycursor CURSOR FOR select Sno, Sname from Student --聲明遊標
OPEN mycursor --打開遊標
FETCH NEXT FROM mycursor INTO @Sno, @Sname
WHILE(@@FETCH_STATUS = 0) --遍歷所有的數據,@@FETCH_STATUS函數返回值爲0表示FETCH語句執行成功
BEGIN
PRINT '遊標成功取出一條數據:'
PRINT @Sno
PRINT @Sname
PRINT '-----------------------'
FETCH NEXT FROM mycursor INTO @Sno, @Sname --取下一條遊標數據
END
CLOSE mycursor --關閉遊標
DEALLOCATE mycursor --刪除遊標
GO
EXEC proc_cursor
GO
ps:一些 Transact-SQL 系統函數的名稱以兩個 at 符號 (@@) 開頭。 儘管在舊版 SQL Server 中,@@函數稱爲全局變量,但它們不是變量,不具有等同於變量的行爲。 @@函數是系統函數,語法遵循函數規則。詳細可參考:變量 (Transact-SQL)
這是Student表,對照着看下面的執行結果~
可以看到查詢結果集合中的記錄被一條一條地輸出了,達到了我們的目的👏
那,數據庫SQL語句中CURSOR(遊標)的簡單使用 就介紹完啦,感謝閱讀~😊
如文中有不恰當的地方,望提出指正~
- 安利一下:【吐血整理】數據庫的規範化