声明游标
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()