CREATE DEFINER = `root`@`%` PROCEDURE `NewProc`(IN `USER_ID` varchar(36),IN `USER_NAME`
varchar(36))BEGIN
declare SQL_FOR_SELECT varchar(500); -- 定义预处理sql语句
set SQL_FOR_SELECT = "select * from user where user_id = ? and user_name = ? ";
-- 拼接查询sql语句
set @sql = SQL_FOR_SELECT;
PREPARE stmt FROM @sql; -- 预处理动态sql语句
set @parm1 = USER_ID; -- 传递sql动态参数
set @parm2 = USER_NAME;
EXECUTE stmt USING @parm1 , @parm2; -- 执行sql语句
deallocate prepare stmt; -- 释放prepare
set @sql = SQL_FOR_SELECT;
PREPARE stmt FROM @sql; -- 预处理动态sql语句
set @parm1 = '2'; -- 传递sql动态参数
set @parm2 = 'lisi';
EXECUTE stmt USING @parm1 , @parm2; -- 执行sql语句
deallocate prepare stmt; -- 释放prepare
END;
这样,我们就可以真正的使用不同的参数(当然也可以在存储过程中通过逻辑生成不同的参数)来使用动态sql了。
几个注意:
存储动态SQL的值的变量不能是自定义变量,必须是用户变量或者全局变量 如:set sql = 'xxx'; prepare stmt from sql;是错的,正确为: set @sql = 'xxx'; prepare stmt from @sql;
即使 preparable_stmt 语句中的 ? 所代表的是一个字符串,你也不需要将 ? 用引号包含起来。
如果动态语句中用到了 in ,正常写法应该这样:select * from table_name t where t.field1 in (1,2,3,4,...);
则sql语句应该这样写:set @sql = "select * from user where user_id in (?,?,?) "
因为有可能我不确定in语句里有几个参数,所以我试过这么写
set @sql = "select * from user where user_id in (?) "
然后参数我传的是 "'1','2','3'" 我以为程序会将我的动态sql解析出来(select * from user where user_id in ('1','2','3')) 但是并没有解析出来,在写存储过程in里面的列表用个传入参数代入的时候,就需要用到如下方式:
1.使用find_in_set函数
1 |
|
2.还可以比较笨实的方法,就是组装字符串,然后执行
1 2 3 4 5 6 7 8 9 10 11 |
|
以上就是mysql 存储过程中使用动态sql语句的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
更多相关阅读请进入《mysql》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。