mysql 必知必會整理—遊標[十四]
阿新 • • 發佈:2021-10-09
前言
簡單介紹一下游標。
正文
需要MySQL 5 MySQL 5添加了對遊標的支援,因此,本章內容適用於MySQL 5及以後的版本。
有時,需要在檢索出來的行中前進或後退一行或多行。這就是使用遊標的原因。
遊標(cursor)是一個儲存在MySQL伺服器上的資料庫查詢,它不是一條SELECT語句,而是被該語句檢索出來的結果集。
在儲存了遊標之後,應用程式可以根據需要滾動或瀏覽其中的資料。
遊標主要用於互動式應用,其中使用者需要滾動螢幕上的資料,並對資料進行瀏覽或做出更改。
只能用於儲存過程 不像多數DBMS,MySQL遊標只能用於儲存過程(和函式)
使用說明
使用遊標涉及幾個明確的步驟。
-
在能夠使用遊標前,必須宣告(定義)它。這個過程實際上沒有檢索資料,它只是定義要使用的SELECT語句。
-
一旦聲明後,必須開啟遊標以供使用。這個過程用前面定義的SELECT語句把資料實際檢索出來。
-
對於填有資料的遊標,根據需要取出(檢索)各行。
-
在結束遊標使用時,必須關閉遊標。
在宣告遊標後,可根據需要頻繁地開啟和關閉遊標。在遊標開啟後,可根據需要頻繁地執行取操作。
DECLARE命名遊標,並定義相應的SELECT語句,根據需要帶WHERE和其他子句。
例如,下面的語句定義了名為ordernumbers的遊標,使用了可以檢索所有訂單的SELECT語句。
create PROCEDURE processorders() BEGIN DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; END;
這裡只是定義了但是並沒有使用。
然後我們將其刪除:
DROP PROCEDURE processorders
從新建立一個完整的例子。
create PROCEDURE processorders() BEGIN DECLARE done Boolean DEFAULT 0; DECLARE o INT; DECLARE t DECIMAL(8,2); -- DECLARE the CURSOR DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; -- DECLARE conitnue handle DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done =1; -- Create a table to store the results CREATE TABLE if not EXISTS ordertotals ( order_num INT, total DECIMAL(8,2) ); -- open the CURSOR OPEN ordernumbers; -- loop through all rows REPEAT -- Get order number FETCH ordernumbers into o; -- Get the total for this order CALL ordertotal(o,1,t); -- INSERT orderr and total into ordertotals INSERT INTO ordertotals(order_num, total) VALUES(o,t); -- end REPEAT UNTIL done END REPEAT; -- close the CURSOR CLOSE ordernumbers; END;
這是一個相對簡單的例子。
首先定義了一個ordernumbers。
然後DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done =1; 定義了一個觸發條件,當 SQLSTATE '02000'的時候執行SET done =1。
通過fetch 把結果放到 o 中,然後呼叫儲存過程ordertotal,將該訂單的結果查出來,然後就存入到ordertotals表中。
CALL processorders
然後查詢出來是:
結
下一節觸發器。