最近学习使用MySQL数据库对一些数据进行处理,用到了存储过程。我把使用过程中遇到的一些问题写下来,方便以后再次使用时少进一些坑。
原始表
一、无参数存储过程test1
#定义分割符为双斜杠
DELIMITER //
use cai// -- 打开数据库,这是存放存储过程的数据库。
drop procedure if EXISTS test1 // -- 删除已存在的存储过程。
CREATE PROCEDURE test1() -- 开始定义无参存储过程。
BEGIN
select * from cp_table; -- 要执行的内容
END //
DELIMITER ;
CALL test1(); -- 调用定义的存储过程。
注意:DELIMITER定义分割符后面不人有注解,不然当你执行时会没有一点反应。
二、有参数存储过程test1(IN tableName_source varchar(50),IN columnName varchar(50))
正确写法
#重定义分割符为双斜杠
DELIMITER //
use cai// -- 打开数据库,这是存放存储过程的数据库。
drop procedure if EXISTS test1 // -- 删除已存在的存储过程。
CREATE PROCEDURE test1(IN tableName_source varchar(50),IN columnName varchar(50)) -- 开始定义无参存储过程。
BEGIN
-- 要执行的内容
DECLARE temp_user_sql VARCHAR(500); -- 声明一个变量
SET temp_user_sql =CONCAT('SELECT * FROM ',tableName_source,' order by issue2,',columnName); -- 把参数与sql语句段拼成一条完整的sql语句,并存到变量中
set @temp_works_sql=temp_user_sql; -- 将连成成的字符串赋值给一个变量(可以之前没有定义,但要以@开头)
prepare stmt from @temp_works_sql; -- 预处理需要执行的动态SQL,其中stmt是一个变量
EXECUTE stmt; -- 执行上面拼成的sql语句
deallocate prepare stmt; -- 放掉预处理段
END //
#重定义分割符为分号
DELIMITER ;
CALL test1('cp_table','number1'); -- 调用定义的存储过程。
错误写法
#重定义分割符为双斜杠
DELIMITER //
use cai// -- 打开数据库,这是存放存储过程的数据库。
drop procedure if EXISTS test1 // -- 删除已存在的存储过程。
CREATE PROCEDURE test1(IN tableName_source varchar(50),IN columnName varchar(50)) -- 开始定义无参存储过程。
BEGIN
-- 要执行的内容
SELECT * FROM tableName_source order by issue2,columnName;
END //
#重定义分割符为分号
DELIMITER ;
CALL test1('cp_table','number1'); -- 调用定义的存储过程。
报错:11:47:15 CALL test1('cp_table','number1') Error Code: 1146. Table 'cai.tablename_source' doesn't exist 0.000 sec
在网上参考了:
zuihongyan518的文章《MySQL 存储过程 CONCAT 字符串拼接》