存储过程
while循环
CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `p_user`(IN `o_id` int,OUT `o_all_name` varchar(128))
BEGIN
#Routine body goes here...
#定义结束语
DECLARE i int default 0;
DECLARE o_parent_id int;
DECLARE o_name varchar(128);
#DECLARE o_all_name varchar(128);
while i=0 do
SELECT parent_id,name into o_id,o_name from m_organization where organ_id=o_id;
if o_id=0
THEN
set i=1;
end if;
if o_all_name is null
then
set o_all_name=o_name;
else
set o_all_name = CONCAT(o_all_name,',',o_name);
end if;
end while;
#SELECT o_all_name;
END
游标的使用
CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `p_user_result`()
BEGIN
#Routine body goes here...
#定义游标结束
DECLARE s int default 0;
DECLARE user_code VARCHAR(64);
DECLARE realname VARCHAR(128);
DECLARE mobile VARCHAR(11);
DECLARE id_number VARCHAR(24);
DECLARE device_id VARCHAR(64);
DECLARE organ_name VARCHAR(128);
DECLARE organ_id int;
#定义游标
DECLARE cur_result CURSOR FOR
SELECT
a.user_code,a.realname,a.mobile,a.id_number,a.device_id,c.organ_id
FROM
m_user a
LEFT JOIN (
SELECT distinct user_id from(
SELECT user_id from m_record_website201611
union
SELECT user_id from m_record_website201612
union
SELECT user_id from m_record_website201701
union
SELECT user_id from m_record_website201702
union
SELECT user_id from m_record_website201703
union
SELECT user_id from m_record_website201704
union
SELECT user_id from m_record_website201705
union
SELECT user_id from m_record_website201706
) a
) b
on a.user_id=b.user_id
LEFT JOIN m_organization c
on a.o_id=c.organ_id
where b.user_id is null ;
#设置终止
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' set s=1;
OPEN cur_result;
#获取游标当前指针的记录,读取一行数据并传给变量a,b
FETCH cur_result INTO user_code,realname,mobile,id_number,device_id,organ_id;
#开始循环,判断是否游标已经到达了最后作为循环条件
WHILE s <> 1 DO
#注意调用的另一个存储过程
CALL p_user(organ_id,@organ_name);
if @organ_name is not null then
#SELECT @organ_name;
INSERT INTO a_user (user_code,realname,mobile,id_number,device_id,organ_id,organ_name)VALUES (user_code,realname,mobile,id_number,device_id,organ_id, @organ_name);
#读取下一行的数据
FETCH cur_result INTO user_code,realname,mobile,id_number,device_id,organ_id;
end if ;
END WHILE;
#关闭游标
CLOSE cur_result;
#语句执行结束
END