存储过程例子

存储过程

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

猜你喜欢

转载自blog.csdn.net/tuantuanyua/article/details/73790825