BEGIN
DECLARE no_more_record INT DEFAULT 0;
DECLARE insertColumn VARCHAR(18);
DECLARE cur_record CURSOR FOR SELECT insertParam FROM testTable;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_record = 1;
OPEN cur_record;
FETCH cur_record INTO insertColumn;
WHILE no_more_record != 1 DO
IF NOT EXISTS(SELECT column1 FROM insertTable WHERE column1=insertColumn) THEN
INSERT INTO insertTable
SELECT insertColumn,colunm2,column3,colunm4 WHERE column1='123';
END IF;
FETCH cur_record INTO insertColumn;
END WHILE;
CLOSE cur_record;
END
以上代码实现的功能:为testTable字段每个insertParam添加insertTable中column1=‘123’对应的所有记录。
如果这句话比较难懂的话,可以想象以下情景:
一个班级(学生表)有小明,小刚,小红三名同学,
小明同学有苹果,橘子,梨(学生-资源表)。
现在要求所有学生都有这三种水果,也就是遍历学生表,再把小明拥有的资源复制给每个学生一份。最后学生-资源表中所有学生都对应三个水果。
以上代码完成的就是上述情景描述的功能。
一.变量说明:
1.no_more_record:用来判断查询结果集是否已遍历完;
2.continue:用来给no_more_record赋值,no_more_record初始值0,遍历完1;
3.cur_record:游标,指向结果集当前遍历记录
4.insertColumn:作为临时变量,每次遍历结果集时,把当前遍历值赋给它,用于做插入参数;
6.insertTable:被插入表
5.colunm1:用于与insertColumn比较,判断被插入表中是否有值重复的字段。
二.语句(关键字)说明:
1.DECLARE:声明变量。后面跟着变量类型(广义上的类型,比如游标类型)
2.CURSOR FOR + 查询语句:游标指向查询结果集
3.FETCH+游标+INTO+变量:当前游标指向的值赋给变量,同时游标后移
4.HANDLER FOR NOT FOUND SET+处理语句:遍历集合结束后的处理
三.注意:
使用mysql数据库时,这种写法只能放在存储过程/方法里,不可直接写成查询语句