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


相关推荐: sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程  Selenium自动化:利用键盘模拟解决复杂日期输入框输入问题  Go App Engine 项目结构与包管理深度指南  126手机126邮箱登录_126邮箱手机登录入口官网  AO3官方镜像链接 | 最新防走失网址永久收藏  漫蛙漫画官方网站使用_漫蛙manwa网页版在线入口教程  《下一站江湖2》风神腿获取攻略  百度网盘如何设置上传限额  抖音网页版官方链接 抖音网页版官网链接入口  智慧职教mooc平台登录网址 智慧职教mooc官网直达  高德地图导航路线偏差报警频繁怎么办 高德地图路线偏差修复与优化方法  一点万象签到领积分指南  申通快件单号查询平台 申通包裹物流动态跟踪  《小黑盒》删除历史浏览方法  申通快递查询 申通物流快递单实时查询入口  《友玩*》创建群聊方法  包子漫画在线观看入口 包子漫画网正版全集链接  使用Python和GBGB API高效抓取指定日期范围和赛道比赛结果教程  使用TinyButStrong生成HTML并结合Dompdf创建PDF教程  J*a中导出MySQL表为SQL脚本的两种方法  顺丰快递收费标准查询_如何查看顺丰最新收费价格  学习通网页版课程打不开_课程无法访问时的解决方法  Safari浏览器自动填表功能失效怎么办 Safari表单管理修复  手机自动关机是怎么回事?如何修复?手机异常关机的原因排查与修复技巧  MySQL多重JOIN技巧:高效关联同一表获取多角色信息  Fedora怎么安装 Fedora Workstation安装步骤  AO3中文入口稳定分享_AO3官网HTTPS看文详解  在J*a里什么是行为抽象_抽象行为对代码复用的提升作用  广州地铁app准妈咪徽章领取方法  sublime如何处理超大文件不卡顿 _sublime打开大日志文件技巧  PHP页面重载后变量状态保持:实现用户档案连续浏览的教程  中通快递官网指定查询 中通快递单号查询平台入口  江苏大剧院会员卡购买步骤  优化长HTML属性值:SonarQube警告与实用策略  苹果电脑如何快速截图并编辑 苹果电脑截屏标注快捷操作  B站怎么快速升级 B站用户等级提升攻略【详解】  Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法  解决jQuery多计算器输入字段冲突的教程  热血江湖归来医师加点攻略  西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法  Chart.js 教程:自定义插件实现图表与图例间距调整  哔哩哔哩的|直播|间怎么送礼物_哔哩哔哩|直播|送礼操作指南  晓晓优选app支付宝绑定方法  网易云音乐闹钟铃声设置教程  快递查询,一键速查  CSS如何使用outline-offset与颜色组合突出元素边框  谷歌浏览器如何查找和删除恶意软件 谷歌浏览器内置安全清理工具使用教程  c++如何实现观察者设计模式_c++行为型设计模式实战  豆包AI怎样为教育场景定制答疑逻辑_为教育场景定制豆包AI答疑逻辑方案【方案】  12306不能订票的时间段是固定的吗? | 节假日购票时间有无变化 

 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.