上一节中讲解了存储过程的声明和参数类型。此章讲解一个操作实际表的例子。
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...原创...不总结永远一知半解,一知半解比无知更可怕