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);