美文网首页
mysql存储过程调用

mysql存储过程调用

作者: 无拘无束的思想家 | 来源:发表于2022-04-28 23:31 被阅读0次

    创建两个表

    分别在两个库中创建两张表,建表语句分别如下:
    test1(mytest1的库中)

    -- ----------------------------
    -- Table structure for test1
    -- ----------------------------
    DROP TABLE IF EXISTS `test1`;
    CREATE TABLE `test1` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `age` int(11) DEFAULT NULL,
      `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `status` varchar(1) COLLATE utf8_unicode_ci DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    -- ----------------------------
    -- Records of test1
    -- ----------------------------
    INSERT INTO `test1` VALUES ('1', '12', '111', '1');
    INSERT INTO `test1` VALUES ('2', '32', '222', '1');
    INSERT INTO `test1` VALUES ('3', '22', '333', '1');
    
    

    test2表(mytest2的库中)

    DROP TABLE IF EXISTS `test2`;
    CREATE TABLE `test2` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `age` int(11) DEFAULT NULL,
      `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    

    实现的功能

    1.创建游标c1遍历 test1表,取出所有字段数据信息v_id,v_name,v_age
    2.根据c1.v_id查询test2表中是否包含有重复记录,如果有记录,并且test1表中的status 状态为0的时候才会更新test2记录,将test1表中的status 状态 0→1
    3.如果c1.v_id查询test2表中没有包含重复的记录,则直接插入test2表中,并且将status状态 0→1

    存储过程的实现

    DELIMITER //
     CREATE PROCEDURE GetScoreByStu (out result VARCHAR(300))
    BEGIN
    
    DECLARE v_id int DEFAULT 0;
    DECLARE v_name VARCHAR(20);
    DECLARE v_age int;
    -- 定义循环条件
        DECLARE flag INT DEFAULT 0;
        DECLARE v_count INT DEFAULT 0;
        DECLARE v_status INT DEFAULT 0;
     -- SELECT student_score FROM tb_students_score WHERE student_name=name;
    DECLARE v_result VARCHAR(300) DEFAULT '';
    
    -- 申明游标
    DECLARE c1 CURSOR FOR SELECT id,name,age from test1;
    --  当没有行可以循环时  done 为真
    declare continue  handler for sqlstate '02000' set flag =1;
    
    OPEN c1;
    
    -- 遍历所有行
    -- repeat
    while flag<>1 do
     --  获取订单号
     fetch c1 into v_id,v_name,v_age;
        -- SET @sqlcmd = CONCAT(v_id,'---',v_name,'---',v_age); 
        -- SELECT @sqlcmd ; /*输出执行的sql语句*/
    
        SET @sqlcmd = CONCAT('SELECT COUNT(0) into @v_count from  mytest2.test2 where id=',v_id);   
         
         SELECT @sqlcmd ;   /*输出执行的sql语句*/
        PREPARE gsql from @sqlcmd;
      EXECUTE gsql;
      DEALLOCATE PREPARE gsql;
        
        IF @v_count=0 THEN
                SET @sqlcmd = CONCAT('insert into mytest2.test2 (id,name,age) values(',v_id,',',v_name,',',v_age,')');  
         
                 SELECT @sqlcmd ;   /*输出执行的sql语句*/
                PREPARE gsql from @sqlcmd;
                EXECUTE gsql;
                DEALLOCATE PREPARE gsql;
        ELSE
             SET @sqlcmd = CONCAT('update  mytest2.test2 set name=',v_name,',age=',v_age,' where id=',v_id);    
         
                 SELECT @sqlcmd ;   /*输出执行的sql语句*/
                PREPARE gsql from @sqlcmd;
                EXECUTE gsql;
                DEALLOCATE PREPARE gsql;
        END IF;
    
                -- 最后 全部更新完成之后,直接回写源表 对应的状态值为1,默认值为0
             SET @sqlcmd = CONCAT('update  mytest1.test1 set status=1 where id=',v_id,' and status<>1');    
         
                 SELECT @sqlcmd ;   /*输出执行的sql语句*/
                PREPARE gsql from @sqlcmd;
                EXECUTE gsql;
                DEALLOCATE PREPARE gsql;
        -- select @v_count;
    
    -- 直到完成结束重复;
    -- until flag  end repeat;
    end while;
    CLOSE c1;
    
    
    -- set @v_result=1;
    
    -- SELECT @v_result;
     END //
    
    

    调用方式

    set @num='';
    call GetScoreByStu(@num);
    

    相关文章

      网友评论

          本文标题:mysql存储过程调用

          本文链接:https://www.haomeiwen.com/subject/csujyrtx.html