Mysql存储过程之实表操作

上一节中讲解了存储过程的声明和参数类型。此章讲解一个操作实际表的例子。


I  have a table like this(When I browsed a tutorial about DB,they always begin like this):

(我有一个表如下:)

DROP TABLE IF EXISTS `fil_card`;
CREATE TABLE `fil_card` (
  `STAFF_ID` varchar(20) NOT NULL,
  `STAFF_NAME` varchar(20) default NULL,
  `CARD_ID` varchar(20) NOT NULL,
  PRIMARY KEY  (`STAFF_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用餐卡信息';


然后我建了一个存储过程如下:

CREATE PROCEDURE DEP_INFO(IN staffName varchar(30),OUT hasResult INT) -- 此存储过程有两个参数,IN类型的staffName,OUT类型的hasResult
BEGIN
	DECLARE strstaffID VARCHAR(30);
	DECLARE strcardID VARCHAR(30);
	DECLARE no_more_rows INT;

	DECLARE dept_inf CURSOR FOR SELECT STAFF_ID,CARD_ID FROM fil_card WHERE STAFF_NAME = staffName; -- 定义一个游标,检索与传入的staffName匹配的信息
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows =1; -- 如果游标指向一个空行,则将no_mor_rows设为1(这个自动触发)

	SET no_more_rows=0;
	
	OPEN dept_inf; -- 此时游标在第一行数据,并且它并不知道此行数据有没有值。如果dept_inf中没有值,此时也不会触发 no_more_rows =1
	SET hasResult =0;
	FETCH dept_inf INTO strstaffID,strcardID; --fetch一次,将本行的数据赋值给参数,并自动向下滑一行。(如果本行无数据,就会设置no_more_rows=1)

	IF no_more_rows=0 THEN
		SET hasResult=1;
		SELECT strstaffID,strcardID;
	ELSE
		SET hasResult=0;
		SELECT '此人名不存在' AS 消息;
	END IF;

	CLOSE dept_inf;
  SET no_more_rows=0;
END

调用:

我在navivat中新建查询直接调用

SET @staffName='齐娇';
SET @intRows =0;
CALL DEP_INFO(@staffName,@intRows);


注意:游标读出了多少字段必需要有多少个变量来接受,多一个少一个都不可以,会报如下错:

[Err] 1328 - Incorrect number of FETCH variables


比较不好的是,在Mysql的存储过程中,如果游标读出的字段与接受字段的类型不匹配,它会自动将值转换后赋值给参数,而不报错。

如用一个DATE类型的参数datx接受一个值为1的整型字段,那么select datx 其显示的是0000-00-00。



龙觉寺CSDN_BLOG...原创...不总结永远一知半解,一知半解比无知更可怕


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值