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


mysql 存储过程中使用动态sql语句简单的存储过程各个关键字的用法:

CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`(in _xnb varchar(50))
BEGIN
	## 定义变量
	DECLARE _num FLOAT(14,6) DEFAULT 0;
	## @表示全局变量 相当于php $
	## 拼接赋值 INTO 必须要用全局变量不然语句会报错
    ## //CONCAT会把'SELECT SUM('和_xnb和') INTO @tnum FROM btc_user_coin'拼接起来,CONCAT的各个参数中间以","号分割
	SET @strsql = CONCAT('SELECT SUM(',_xnb,') INTO @tnum FROM btc_user_coin');
	## 预处理需要执行的动态SQL,其中stmt是一个变量
	PREPARE stmt FROM @strsql;  
	## 执行SQL语句
	EXECUTE stmt;  
	## 释放掉预处理段
	deallocate prepare stmt;
	## 赋值给定义的变量
	SET _num = @tnum;
	SELECT _num
END;;

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

 Mysql 5.0 以后,支持了动态sql语句,我们可以通过传递不同的参数得到我们想要的值

这里介绍两种在存储过程中的动态sql

 1.set sql = (预处理的sql语句,可以是用concat拼接的语句)

 set @sql = sql

 PREPARE stmt_name FROM @sql;

 EXECUTE stmt_name;

 {DEALLOCATE | DROP} PREPARE stmt_name;

过程过程示例:

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 = CONCAT("select * from  user  where user_id = '",USER_ID,"' and user_name = '",USER_NAME,"'");   -- 拼接查询sql语句

      set @sql = SQL_FOR_SELECT;      PREPARE stmt FROM @sql;       -- 预处理动态sql语句
      EXECUTE stmt ;                -- 执行sql语句
      deallocate prepare stmt;      -- 释放prepareEND;

上述是一个简单的查询用户表的存储过程,当我们调用此存储过程,可以根据传入不同的参数获得不同的值。

但是:上述存储过程中,我们必须在拼接sql语句之前把USER_ID,USER_NAME定义好,而且在拼接sql语句之后,我们无法改变USER_ID,USER_NAME的值,如下:

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 = CONCAT("select * from user where user_id = '",USER_ID,"' and user_name = '",USER_NAME,"'");   -- 拼接查询sql语句

       set @sql = SQL_FOR_SELECT;       PREPARE stmt FROM @sql;        -- 预处理动态sql语句
       EXECUTE stmt ;                 -- 执行sql语句
       deallocate prepare stmt;       -- 释放prepare


       set USER_ID = '2'; -- 主动指定参数USER_ID的值
       set USER_NAME = 'lisi';       set @sql = SQL_FOR_SELECT;       PREPARE stmt FROM @sql;       -- 预处理动态sql语句
       EXECUTE stmt ;                -- 执行sql语句
       deallocate prepare stmt;      -- 释放prepareEND;

 我们用call aa('1','zhangsan');来调用该存储过程,第一次动态执行,我们得到了‘张三’的信息,然后我们在第14,15行将USER_ID,USER_NAME改为lisi,我们希望得到李四的相关信息,可查出来的结果依旧是张三的信息,说明我们在拼接sql语句后,不能再改变参数了。

为了解决这种问题,下面介绍第二中方式:

2.set sql = (预处理的sql语句,可以是用concat拼接的语句,参数用 ?代替)

 set @sql = sql

 PREPARE stmt_name FROM @sql;

 set @var_name = xxx;

 EXECUTE stmt_name USING [USING @var_name [, @var_name] ...];

 {DEALLOCATE | DROP} PREPARE stmt_name;

上述的代码我们就可以改成 :

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;

    PHP的使用技巧集 PHP的使用技巧集

    PHP 独特的语法混合了 C、J*a、Perl 以及 PHP 自创新的语法。它可以比 CGI或者Perl更快速的执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多。下面介绍了十个PHP高级应用技巧。 1, 使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里

    PHP的使用技巧集 440 查看详情 PHP的使用技巧集
  •    即使 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函数

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

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

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语句的详细内容,更多请关注其它相关文章!


# 存储过程  # 产品推广网站源码  # 淘宝客seo优化  # 二维码推广网站有哪些  # 修改密码  # 就可以  # 全局变量  # 是一个  # 的是  # 解锁  # 使用技巧  # 镜像  # 过程中  # 动态sql语句  # mysql  # 东台公墓网站建设公示  # 网站推广团队游戏怎么做  # 六味斋网站优化分析  # 长春电器网站建设  # 营销产品网络推广方案模板  # 肇庆网站推广知识  # 简述网站建设的背景 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《edge浏览器》关闭翻译功能方法  PyEZ 配置提交中 RpcTimeoutError 的健壮性处理策略  《东方航空》添加乘机人方法  《oppo商城》维修服务位置  在Django中动态检查模型关联:一种灵活的解决方案  CSS过渡与滚动滚动事件结合应用_scroll与transition动画  PHP 4 函数中引用参数的默认值限制与解决方案  mysql如何配置从库只读_mysql从库只读设置方法  优化Asyncio嵌套函数调度:使用生产者-消费者模式实现并发流处理  优酷官网登录入口电脑版 优酷官网网址入口  解决Go encoding/json 将JSON大数字解析为浮点数的问题  edge浏览器怎么修改语言为中文_Edge界面语言切换教程  小米手机截图后如何查看历史_小米手机截图历史记录查看方法  优化响应式标题底部边框:CSS实现技巧与最佳实践  支付宝登录刷脸不是本人如何解决  三角洲行动2025年9月10日摩斯密码分享  Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程  Magento 2 产品保存事件中安全更新属性的最佳实践  《下一站江湖2》风神腿获取攻略  《单词速记宝》设置学习计划方法  易车网官网直达入口 易车网在线登录入口  在Django单元测试中优雅处理信号:基于环境的条件执行策略  Python实战:高效处理实时数据流中的最小/最大值  win11如何开启单声道音频 Win11为听障用户合并左右声道【辅助】  悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口  《密马》发布账号方法  教育查询官方网站入口 教育个人档案查询免费官网  抖音手机分身两个账号怎么切换?分身两个系统是一样的吗?  《360浏览器》设置摄像头权限方法  追剧达人如何发弹幕  PHP动态导航按钮:根据用户登录状态切换链接与文本  《知到》打卡课程方法  mysql镜像配置如何设置用户权限组_mysql镜像配置用户组与权限分级管理方法  精通VS Code多光标编辑以实现闪电般快速的修改  虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画  吃完饭就犯困是什么原因 餐后嗜睡如何缓解  tiktok国际版入口_tiktok官网网页版链接  谷歌邮箱怎么换绑定邮箱Gmail安全备份邮箱修改方法  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  Python中处理嵌套字典与列表的数据提取与过滤教程  OPPO手机参数配置如何开启护眼模式_OPPO手机参数配置护眼模式开启指南  德邦快递收费标准详解  《梦想世界:长风问剑录》药师一图流分享  房产|直播|视频号怎么认证开通?|直播|需要什么资质?  Git命令与VS Code UI操作的对应关系解析  火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】  ao3入口镜像地址 ao3镜像入口可靠跳转  C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧  《tt语音》超级玩家开通方法  智慧团建活动报名入口 智慧团建活动报名入口手机端官网​ 

 2019-06-24

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.