第21課 使用遊標
阿新 • • 發佈:2020-07-20
第21課 使用遊標
21.1 遊標
有時,需要在檢索出來的行中前進或後退一行或多行,這就是遊標的用途所在。遊標(cursor)是一個儲存在DBMS伺服器上的資料庫查詢,它不是一條SELECT語句,而是被該語句檢索出來的結果集。在儲存了遊標之後,應用程式可以根據需要滾動或瀏覽其中的資料。
21.2 使用遊標
使用遊標涉及幾個明確的步驟:
- 在使用遊標前,必須宣告(定義)它。這個過程實際上沒有檢索資料,它只是定義要使用的SELECT語句和遊標選項。
- 一旦宣告,就必須開啟遊標以供使用。這個過程用前面定義的SELECT語句把資料實際檢索出來。
- 對於填有資料的遊標,根據需要取出(檢索)各行。
- 在結束遊標使用時,必須關閉遊標,可能的話,釋放遊標(有賴於具體的DBMS)。
21.2.1 建立遊標
使用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值)的所有顧客的遊標。
21.2.2 使用遊標
使用OPEN CURSOR語句開啟遊標,這條語句很簡單,在大多數DBMS中的語法相同:
OPEN CURSOR CustCursor
現在可以用FETCH語句訪問遊標資料了。FETCH指出要檢索哪些行,從何處檢索它們以及將它們放於何處(如變數名)。第一個例子使用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中。對於檢索出來的資料不做任何處理。
下一個例子(也使用Oracle語法)中,從第一行到最後一行,對檢索出來的資料進行迴圈:
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;
21.2.3 關閉遊標
下面是DB2、Oracle和PostgreSQL的語法:
CLOSE CustCursor
CLOSE語句用來關閉遊標。一旦遊標關閉,如果不再次開啟,將不能使用。第二次使用它時不需要再宣告,只需用OPEN開啟它即可。
21.3 小結
我們在本課講授了什麼是遊標,為什麼使用遊標。