1. 程式人生 > 其它 >mysql 必知必會整理—遊標[十四]

mysql 必知必會整理—遊標[十四]

前言

簡單介紹一下游標。

正文

需要MySQL 5 MySQL 5添加了對遊標的支援,因此,本章內容適用於MySQL 5及以後的版本。

有時,需要在檢索出來的行中前進或後退一行或多行。這就是使用遊標的原因。

遊標(cursor)是一個儲存在MySQL伺服器上的資料庫查詢,它不是一條SELECT語句,而是被該語句檢索出來的結果集。

在儲存了遊標之後,應用程式可以根據需要滾動或瀏覽其中的資料。

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

只能用於儲存過程 不像多數DBMS,MySQL遊標只能用於儲存過程(和函式)

使用說明

使用遊標涉及幾個明確的步驟。

  1. 在能夠使用遊標前,必須宣告(定義)它。這個過程實際上沒有檢索資料,它只是定義要使用的SELECT語句。

  2. 一旦聲明後,必須開啟遊標以供使用。這個過程用前面定義的SELECT語句把資料實際檢索出來。

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

  4. 在結束遊標使用時,必須關閉遊標。

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

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

然後查詢出來是:

下一節觸發器。