SQL必知必會筆記二十一(使用游標)

2021-10-08 03:17:12 字數 3716 閱讀 4929

sql檢索操作返回一組稱為結果集的行,這組返回的行都是與sql語句相匹配的行(零行或多行)。簡單地使用select語句,沒有辦法得到第一行、下一行或前10行。但這是關係dbms功能的組成部分。

結果集(result set):sql查詢所檢索出的結果。

有時,需要在檢索出來的行中前進或後退一行或多行,這就是游標的用途所在。

游標(cursor)是乙個儲存在dbms伺服器上的資料庫查詢,它不是一條select語句,而是被該語句檢索出來的結果集。在儲存了游標之後,應用程式可以根據需要滾動或瀏覽其中的資料。

不同的dbms支援不同的游標選項和特性。常見的一些選項和特性如下。

• 能夠標記游標為唯讀,使資料能讀取,但不能更新和刪除。

• 能控制可以執行的定向操作(向前、向後、第

一、最後、絕對位置、相對位置等)。

• 能標記某些列為可編輯的,某些列為不可編輯的。

• 規定範圍,使游標對建立它的特定請求(如儲存過程)或對所有請求可訪問。

• 指示dbms 對檢索出的資料(而不是指出表中活動資料)進行複製,使資料在游標開啟和訪問期間不變化。

說明:具體dbms的支援

microsoft access不支援游標,所以本課的內容不適用於microsoft access。

mysql 5已經支援游標。因此,本課的內容不適用mysql較早的版本。

sqlite支援的游標稱為步驟(step),本課講述的基本概念適用於sqlite的步驟,但語法可能完全不同。

游標主要用於互動式應用,其中使用者需要滾動螢幕上的資料,並對資料進行瀏覽或做出更改。

說明:游標與基於web的應用

游標對基於web的應用(如asp、asp.net、coldfusion、php、python、ruby、jsp等)用處不大。雖然游標在客戶端應用和伺服器會話期間存在,但這種客戶/伺服器模式不適合web應用,因為應用伺服器是資料庫客戶端而不是終端使用者。所以,大多數web應用開發人員不使用游標,他們根據自己的需要重新開發相應的功能。

使用游標涉及幾個明確的步驟:

• 在使用游標前,必須宣告(定義)它。這個過程實際上沒有檢索資料,它只是定義要使用的select語句和游標選項。

• 一旦宣告,就必須開啟游標以供使用。這個過程用前面定義的select語句把資料實際檢索出來。

• 對於填有資料的游標,根據需要取出(檢索)各行。

• 在結束游標使用時,必須關閉游標,可能的話,釋放游標(有賴於具體的dbms)。

宣告游標後,可根據需要頻繁地開啟和關閉游標。在游標開啟時,可根據需要頻繁地執行取操作。

建立游標

使用declare語句建立游標,這條語句在不同的dbms中有所不同。declare命名游標,並定義相應的select語句,根據需要帶where和其他子句。

下面是建立此游標的db2、mariadb、mysql和sql server版本:

declare custcursor cursor for select * from customers where cust_email is null

下面是oracle和postgresql版本:

declare cursor custcursor is select * from customers where cust_email is null

在上面兩個版本中,declare語句用來定義和命名游標,這裡為custcursor。select語句定義乙個包含沒有電子郵件位址(null值)的所有顧客的游標。

定義游標之後,就可以開啟它了。

使用游標

使用open cursor語句開啟游標

例如:open cursor custcursor

在處理open cursor語句時,執行查詢,儲存檢索出的資料以供瀏覽和滾動。

現在可以用fetch語句訪問游標資料了。fetch指出要檢索哪些行,從何處檢索它們以及將它們放於何處(如變數名)。

1、使用oracle語法從游標中檢索一行(第一行):

declare type custcursor is ref cursor return customers%rowtype; declare custrecord customers%rowtype begin open custcursor; fetch custcursor into custrecord; close custcursor; end;

在這個例子中,fetch用來檢索當前行(自動從第一行開始),放到宣告的變數custrecord中。對於檢索出來的資料不做任何處理。

declare type custcursor is ref cursor return customers%rowtype; declare custrecord customers%rowtype begin open custcursor; loop fetch custcursor into custrecord; exit when custcursor%notfound; ... end loop; close custcursor; end;

與前乙個例子一樣,這個例子使用fetch檢索當前行,放到乙個名為custrecord的變數中。但不一樣的是,這裡的fetch位於loop內,因此它反覆執行。**exit when custcursor%notfound使在取不出更多的行時終止處理(退出迴圈)。這個例子也沒有做實際的處理,實際例子中可用具體的處理**替換佔位符…。

3、下面是另乙個例子,這次使用microsoft sql server語法:

declare @cust_id char(10), @cust_name char(50), @cust_address char(50), @cust_city char(50), @cust_state char(5), @cust_zip char(10), @cust_country char(50), @cust_contact char(50), @cust_email char(255) open custcursor fetch next from custcursor into @cust_id, @cust_name, @cust_address, @cust_city, @cust_state, @cust_zip, @cust_country, @cust_contact, @cust_email while @@fetch_status = 0 begin fetch next from custcursor into @cust_id, @cust_name, @cust_address, @cust_city, @cust_state, @cust_zip, @cust_country, @cust_contact, @cust_email ... end close custcursor

在此例中,為每個檢索出的列宣告乙個變數,fetch語句檢索一行並儲存值到這些變數中。使用while迴圈處理每一行,條件while @@fetch_status = 0在取不出更多的行時終止處理(退出迴圈)。這個例子也不進行具體的處理,實際**中,應該用具體的處理**替換其中的…佔位符。

關閉游標

如前面幾個例子所述,游標在使用完畢時需要關閉。此外,sql server等dbms要求明確釋放游標所占用的資源。

下面是db2、oracle和postgresql的語法:

close custcursor

下面是microsoft sql server的版本:

close custcursor deallocate cursor custcursor

close語句用來關閉游標。一旦游標關閉,如果不再次開啟,將不能使用。第二次使用它時不需要再宣告,只需用open開啟它即可。

SQL 必知必會 筆記 19 使用游標

游標 cursor 是乙個儲存在dbms伺服器上的資料庫查詢,它不是一條select語句,而是被該語句檢索出來的結果集。在儲存了游標之後,應用程式可以根據需要滾動或瀏覽其中的資料。使用游標的步驟 在使用游標前,必須宣告 定義 它。這個過程實際上沒有檢索資料,它只是定義要使用的select語句和游標選...

SQL 必知必會 筆記 19 使用游標

游標 cursor 是乙個儲存在dbms伺服器上的資料庫查詢,它不是一條select語句,而是被該語句檢索出來的結果集。在儲存了游標之後,應用程式可以根據需要滾動或瀏覽其中的資料。使用游標的步驟 在使用游標前,必須宣告 定義 它。這個過程實際上沒有檢索資料,它只是定義要使用的select語句和游標選...

MySQL必知必會二十一 建立和操縱表

mysql不僅用於表資料操縱,而且還可以用來執行資料庫和表的所有操作,包括表本身的建立和處理。為利用create table建立表,必須給出下列資訊 create table語句也可能會包括其他關鍵字或選項,但至少要包括表的名字和列的細節。下面的mysql語句建立本書中所用的customers表 c...