mysql存储过程调用

2022-04-28  本文已影响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);
上一篇下一篇

猜你喜欢

热点阅读