关于 mysql 存储过程 传递表名作为参数,以及从存储过程返回值的方法

如果在存储过程中,想根据外面传递的表名进行操作,则需要用到prepare关键字

先举例子,如果我需要在我的存储过程中,根据外面传进来的表名,做插入操作,则是以下代码


CREATE PROCEDURE `insert_mail`(IN ptable varchar(45),
IN puserid int(11) unsigned,
IN pdataid int(11) unsigned, 
IN pvalue int(11) unsigned,
IN pstate tinyint(4) unsigned,
IN pcontent varchar(128) )
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ''
BEGIN

DECLARE operate INTEGER DEFAULT 0;
DECLARE t_error INTEGER DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error = 1;


START TRANSACTION;
set @sqlcmd1=concat("INSERT INTO ",ptable," SET `user_id`=?,`data_id`=?,`value`=?,`state`=?,`content`='",pcontent,"', `time`=UNIX_TIMESTAMP(NOW());");
set @a=puserid;
set @b=pdataid;
set @c=pvalue;
set @d=pstate;


prepare stmt from @sqlcmd1;
execute stmt USING @a,@b,@c,@d;
deallocate prepare stmt;


SELECT LAST_INSERT_ID() INTO operate;
SELECT operate;


IF t_error = 1 THEN
   ROLLBACK;
ELSE
    COMMIT;
END IF;


END;


以上语句,根据外面传递的参数进行插入操作,并且返回插入的id作为返回值(operate存储的就是返回的id).


set @sqlcmd1=concat("INSERT INTO ",ptable," SET `user_id`=?,`data_id`=?,`value`=?,`state`=?,`content`='",pcontent,"', `time`=UNIX_TIMESTAMP(NOW());");

主要是将传入的表名和传入的字符串,与语句连接起来,中间的问号,是用于等待传入参数用,传入的字符串参数必须使用concat方法链接


prepare stmt from @sqlcmd1;

将链接好的语句,赋值给stmt


execute stmt USING @a,@b,@c,@d;

执行赋值好的语句,因为此语句中含有?,因此需要提供相应的参数,使用关键字 USING

这个地方不能使用DECLARE声明的变量,也不能使用存储过程传入的参数,必须另外设置变量去存储这些值,因此才有

set @a=puserid;
set @b=pdataid;
set @c=pvalue;
set @d=pstate;

这几条语句


deallocate prepare stmt;

释放资源


SELECT LAST_INSERT_ID() INTO operate;
SELECT operate;

获取上次插入的id值,并将其返回到operate变量中



©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页