mysql 存储过程中使用动态sql语句


当前第2页 返回上一页

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

select * from table_name t where find_in_set(t.field1,'1,2,3,4');

2.还可以比较笨实的方法,就是组装字符串,然后执行

1

2

3

4

5

6

7

8

9

10

11

DROP PROCEDURE IF EXISTS photography.Proc_Test;

CREATE PROCEDURE photography.`Proc_Test`(param1 varchar(1000))

BEGIN

set @id = param1;

set @sel = 'select * from access_record t where t.ID in (';

set @sel_2 = ')';

set @sentence = concat(@sel,@id,@sel_2); -- 连接字符串生成要执行的SQL语句

prepare stmt from @sentence; -- 预编释一下。 “stmt”预编释变量的名称,

execute stmt; -- 执行SQL语句

deallocate prepare stmt; -- 释放资源

END;

以上就是mysql 存储过程中使用动态sql语句的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

centos下实现mysql远程登录

mysql行级锁实现原理是什么

mysql多表联合查询操作实例分析

mysql中的事件调度基础学习教程

mysql少有人知的排序方式

mysql如何设置字符集为utf8

mysql数据库锁机制的介绍

mysql如何查询一段时间记录

mysql 教程之列类型中的日期时间型

mysql的锁详解

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...