MariaDB CURSOR
示例一:
简单创建CURSO并打开,关闭操作
DELIMITER //
CREATE PROCEDURE
processorders() 
BEGIN
    DECLARE
ordernumbers CURSOR FOR
 
  SELECT order_num FROM orders;
END;//
DELIMITER ;
 
DELIMITER //
CREATE OR REPLACE PROCEDURE
processorders() 
BEGIN
 
  -- Declare the
cursor 
 
  DECLARE ordernumbers CURSOR FOR
 
  SELECT order_num FROM orders;
 
  -- Open the
cursor 
    OPEN
ordernumbers;
 
  -- Close the
cursor 
 
  CLOSE ordernumbers;
END;//
DELIMITER ;
 
示例二:
打开CURSOR对象并将值FETCH到指定变量中
DELIMITER //
CREATE OR REPLACE PROCEDURE
processorders() 
BEGIN
 
  -- Declare local
variables 
 
  DECLARE o INT;
 
  -- Declare the
cursor 
 
  DECLARE ordernumbers CURSOR FOR
 
  SELECT order_num FROM orders;
 
  -- Open the
cursor 
 
  OPEN ordernumbers;
 
  -- Get order number
    FETCH
ordernumbers INTO o;
 
  -- Close the
cursor 
 
  CLOSE ordernumbers;
END;//
DELIMITER ;
 
示例三:
定义CONTINUE
HANDLER并重复FETCH,直到CURSOR结束
DELIMITER //
CREATE OR REPLACE PROCEDURE
processorders() 
BEGIN
 
  -- Declare local
variables 
 
  DECLARE done BOOLEAN DEFAULT
0; 
 
  DECLARE o INT;
 
  -- Declare the
cursor 
 
  DECLARE ordernumbers CURSOR FOR
 
  SELECT order_num FROM orders;
 
  -- Declare continue handler
    DECLARE CONTINUE
HANDLER FOR SQLSTATE '02000' SET done=1;
 
  -- Open the
cursor 
 
  OPEN ordernumbers;
 
  -- Loop through all
rows 
   
REPEAT
 
      -- Get
order number
 
      FETCH
ordernumbers INTO o;
 
  -- End of loop
    UNTIL done END
REPEAT;
 
  -- Close the
cursor 
 
  CLOSE ordernumbers;
END;//
DELIMITER ;
 
示例四:
综合
DELIMITER //
CREATE OR REPLACE PROCEDURE
processorders() 
BEGIN
 
  -- Declare local
variables 
 
  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 continue handler
 
  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
order and total into ordertotals 
     
  INSERT INTO ordertotals(order_num, total)
VALUES(o, t);
 
  -- End of loop
    UNTIL done END
REPEAT;
 
  -- Close the
cursor 
 
  CLOSE ordernumbers;
END;//
DELIMITER ;
 
(jlive)[crashcourse]>CALL
processorders();
Query OK, 1 row affected (0.01
sec)
(jlive)[crashcourse]>SELECT *
FROM ordertotals;
+-----------+---------+
| order_num | total
  |
+-----------+---------+
|  
  20005 |  158.86 |
|  
  20006 |   58.30 |
|  
  20007 | 1060.00 |
|  
  20008 |  132.50 |
|  
  20009 |   40.78 |
|  
  20009 |   40.78 |
+-----------+---------+
6 rows in set (0.00 sec)
去CALL的时候不会显示任何数据,而是把通过CURSOR
FETCH到的值传入PROCEDURE
ordertotal计算出total值,最后将order_num,total插入新表ordertotals中