mysql存储过程中,变量直接拼接在执行sql上会把变量解析成 '变量执行',比如:

DECLARE v_condition VARCHAR(4) DEFAULT 'id=1';

select * from t where v_condition

此时不会报错,实际执行的sql是 select * from t where 'id=1'

所以需要动态sql的实现如下,这里动态SQL的生成说明如下:

使用concat拼接,将变量传值进去:

set pSql = concat('update kqcard set ',vFingerIndex,' = \'', vFingerData, '\' , zkkqEnable = 1 where cardNo=\'', vCardNo ,'\';');
    prepare stmt from @Sql;  -- 预处理需要执行的动态SQL,
    EXECUTE stmt;

deallocate prepare stmt; -- 释放掉预处理段

EXECUTE prod USING替换sql语句中的占位符,后面跟要替换占位符的、占位符变量,(sql语句中的占位符是?号)

delimiter $$

DROP PROCEDURE IF EXISTS proc_sql $$ -- 判断proc_sql存储过程存在删除

CREATE PROCEDURE proc_sql () -- 创建proc_sql存储过程

BEGIN declare p1 int; -- 设置p1变量

set p1 = 11; -- 赋值p1变量等于11

set @p1 = p1; -- 赋值字符串占位符变量等于p1

PREPARE prod FROM 'select * from tb2 where nid > ?'; -- 解析字符串为sql语句

EXECUTE prod USING @p1; -- 执行sql语句,并且用占位符变量替换sql语句中的?号 DEALLOCATE

prepare prod; -- 释放解析和执行sql语句

END

$$ delimiter ;

【预处理语句】

MySQL官方将prepare、execute、deallocate统称为PREPARE STATEMENT。

即,预处理语句。

其用法十分简单:

//获取预处理语句
PREPARE stmt_name FROM preparable_stmt;

//执行预处理语句(可传入用户变量)
EXECUTE stmt_name
    [USING @var_name [, @var_name] ...];

//释放掉预处理资源
{DEALLOCATE | DROP} PREPARE stmt_name;

使用PAREPARE STATEMENT可以减少每次执行SQL的语法分析,

比如用于执行带有WHERE条件的SELECT和DELETE,或者UPDATE,或者INSERT,只需要每次修改变量值即可。

同样可以防止SQL注入,参数值可以包含转义符和定界符。

PREPARE … FROM可以直接接用户变量:

SET @sql1 = CONCAT('drop table if EXISTS ',v_table,';');

prepare stmt from @sql1;  -- 预处理需要执行的动态SQL,

每一次执行完EXECUTE时,养成好习惯,须执行DEALLOCATE PREPARE …语句,这样可以释放执行中使用的所有数据库资源(如游标)。

不仅如此,如果一个session的预处理语句过多,可能会达到max_prepared_stmt_count的上限值。

预处理语句只能在创建者的会话中可以使用,其他会话是无法使用的。而且在任意方式(正常或非正常)退出会话时,之前定义好的预处理语句将不复存在。

如果在存储过程中使用,如果不在过程中DEALLOCATE掉,在存储过程结束之后,该预处理语句仍然会有效

mysql存储过程动态sql相关推荐

  1. 取第N个排序的元素之Mysql存储过程动态SQL order by offset实现案例

    Mysql 动态取第N个元素 简介 基于mysql实现对某个表的某个字段按照顺(逆)序取第N个排序对应的元素,该语句通过存储过程结合预处理实现,也可在程序语言里通过SQL拼接实现. 示例 --1存储过 ...

  2. 【MySQL 中 动态sql,游标_】

    MySQL 中   动态sql,游标_SQLServer MySQL的技术博客_51CTO博客

  3. mysql防注入pdo_mysql PDO和存储过程动态SQL注入

    正如我在许多文章中看到的那样,存储过程中的动态SQL容易受到SQL注入的攻击.但是,如果我们将先前的PDO与准备好的语句一起使用,这仍然不安全吗? 例: CREATE PROCEDURE my_sp( ...

  4. oracle 动态声明变量_oracle存储过程动态sql变量赋值

    如何动态执行存储过程或函数 目前在Oracle数据库存储过程研发过程中,遇到需要从某张表中读取存储过程名并进行动态执行的情况,经查找资料,制作成DEMO,并通过测试,现共享下,以备其他同事遇到此种情况 ...

  5. mysql动态sql是什么,mysql中动态sql的一次实际应用

    一.前言 本次实际应用中,使用到了如下几个要点: mysql的动态建表; mysql的多表插入; mysql的多表更新; mysql的多表删除; 二.使用场景 2.1 动态建表 要求建立多个表,例如电 ...

  6. MyBatisPlus自动生成代码springboot+mybatis+mysql 以及动态sql生成方法(测试可用版)

    用了一段时间的springboot,想着百度一下自动生成代码的方式,包括后面如何生成动态sql方法的方式. 摸索了几天,整理一下: ** 1 自动生成代码方式:com.baomidou.mybatis ...

  7. oracle创建存储过程动态sql,Oracle存储过程使用动态SQL

    Oracle存储过程使用动态SQL 有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者.试验步骤如下: 1:DDL和DML /*** DDL ***/ begin ...

  8. oracle存储过程动态sql单引号拼接和变量拼接

    1.单引号的作用 在oracle中单引号主要有两个作用: 一是字符串都用单引号引用,例如'abc':二是转义符,转义符在使用时一般会出现多个连在一起的单引号,相对难理解一些.下面举例说明. 实例1:s ...

  9. oracle存储过程动态SQL中引号的使用

    写存储过程时,引号是一个永远避不开的祸,如果只是单个引号的话很好用,比如向表中插入数据, 1.直接插(字符型加上引号就行) INSERT INTO DEPT (DEPTNO,DNAME,LOC) VA ...

最新文章

  1. [LeetCode226]Invert Binary Tree
  2. Java基础之参数传递
  3. 单模光纤和多模光纤的区别_多模光纤和单模光纤的区别与应用
  4. 基于Asterisk的VoIP开发指南(2)——Asterisk AGI程序编写指南
  5. 基于Go实现的秒杀系统
  6. xml转java代码_java 中xml转换为Bean实例解析(纯代码)
  7. JavaWeb——response与request
  8. 王思祺2015080360030的第一次作业完全版
  9. Atitit.biz业务系统 面向框架  面向模式---------数据映射imp
  10. Python实现基于模块的库存管理系统
  11. Web前端开发最常见的八种编程软件
  12. 7-5 统计素数并求和
  13. 同学聚会幽默 , 小学生搞笑图片
  14. RabbitMQ的ack和nack机制
  15. linux类mac桌面,让Linux Mint看起来更像Mac桌面的主题
  16. 微信小程序项目开发---第一章 制作首页
  17. selenium如何通过快捷键关闭浏览器打开的新页签
  18. 浏览器实现pdf下载、ms http下载、IE不兼容
  19. 提升程序员工作效率的6个工具利器
  20. transformers之中mt5和t5的区别

热门文章

  1. linux文件系统实验原理,根文件系统原理
  2. 宝塔面板免费版怎样安装-宝塔Linux面板安装教程-详细步骤-命令-干什么用的
  3. matlab 基础函数 floor、conv、histeq、im2bw
  4. Android 使用CameraX拍照、预览
  5. 电子老鼠闯迷宫(广搜)noj
  6. C#如何正确调用大漠
  7. Openflow协议读书笔记
  8. golang 定义二维数组的长度
  9. 漫画版:什么是深度学习?
  10. 抖音怎么快速上热门?这招太绝了!