mysql_存储过程-游标

声明游标
DECLARE cursor_name CURSOR FOR select_statement
这个语句声明一个光标。也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。

打开游标
OPEN cursor_name
这个语句打开先前声明的光标。

游标FETCH
FETCH cursor_name INTO var_name [, var_name] ...
这个语句用指定的打开光标读取下一行(如果有下一行的话),
并且前进光标指针。 

关闭游标CLOSE
CLOSE cursor_name
这个语句关闭先前打开的光标。 
如果未被明确地关闭,光标在它被声明的复合语句的末
尾被关闭。
游标的特性:
READ ONLY 只读,只能取值而不能赋值;
NOT SCROOLABLE 不可回滚,只能顺序读取;
ASENSITIVE 敏感,不能在已经打开游标的表上执行
update事务;

举例:
create table stu_sumscore(name char(16),sum_score int);
delimiter //
CREATE PROCEDURE sp_cur()
BEGIN
     DECLARE done INT DEFAULT 0;
     DECLARE v_id,v_name CHAR(16);
     DECLARE v_subjectid,v_score INT;
     DECLARE cur1 CURSOR FOR SELECT distinct id FROM stu_grade;
     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
 
     OPEN cur1;
       REPEAT
          FETCH cur1 INTO v_id;
          SELECT SUM(SCORE) INTO v_score from stu_grade where id=v_id;
          SELECT name INTO v_name from stud_info where id=v_id;
          IF NOT done THEN
               INSERT INTO stu_sumscore VALUES (v_name,v_score);
          END IF;
     UNTIL done END REPEAT;
     CLOSE cur1;    /*CLOSE cur2;*/
END//
delimiter ;

如何进行多表关联的批量插入操作:
1、先采用多表关联将关联字段取出来:
select p.SERVER_USER_SN,p.SERVER_USER_SN,t.TD_CODE,p.CUSTOMER_NAME2,s.`SERVER`from plate_account_info p
join plate_service_all_info t on p.SERVER_INFO_ID=t.SERVER_INFO_ID and p.SERVER_USER_SN=t.SERVER_USER_SN
join server_info s on p.SERVER_INFO_ID=s.SERVER_INFO_ID
2、利用游标来存放多表关联的数据
3、打开游标,将关联的结果集数据一行一行的读取出来
4、利用循环语句对游标中每次读取出来的单行记录进行造数据插入到两一张表中
5、此处mysql对于游标中的多个字段列的取值只能定义变量去接受
比如:declare name char(50);
open cur1;
select next  from cur1 into name;

举例:
DROP PROCEDURE IF EXISTS test5;
delimiter //
CREATE PROCEDURE test5()
BEGIN
	DECLARE SERVER_INFO_ID INT;
  DECLARE SERVER_USER_SN INT DEFAULT NULL;
  DECLARE YW_CODE char(50) DEFAULT NULL;
  DECLARE customer_name char(200) DEFAULT NULL;
  DECLARE t_server char(50) DEFAULT NULL;
  DECLARE success_amount INT DEFAULT 100;
  DECLARE fail_amount INT DEFAULT 50;
  DECLARE unknow_amount INT DEFAULT 1;
  DECLARE submit_amount INT DEFAULT 150;
  DECLARE num INT;
  DECLARE done INT DEFAULT 0;

  DECLARE mycur CURSOR FOR SELECT a.SERVER_INFO_ID,a.SERVER_USER_SN,b.`SERVER`,c.customer_name,c.YW_CODE FROM plate_service_all_info a JOIN server_info b ON a.SERVER_INFO_ID = b.SERVER_INFO_ID
  JOIN plate_account_info c ON c.SERVER_INFO_ID = b.SERVER_INFO_ID;
  SET num =0;
  OPEN mycur;
        WHILE num<100 && done=0 Do
        FETCH mycur INTO SERVER_INFO_ID,SERVER_USER_SN,t_server,customer_name,YW_CODE;
          INSERT INTO submit_history_statistic_count VALUES ('',server_info_id, SERVER_USER_SN, YW_CODE, success_amount, fail_amount, unknow_amount, submit_amount, NOW(),NOW(), customer_name, t_server);
          SET num = num + 1;
        END WHILE;
  CLOSE mycur;
END //
delimiter ;
CALL test5()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值