mysql存储过程动态sql
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相关推荐
- 取第N个排序的元素之Mysql存储过程动态SQL order by offset实现案例
Mysql 动态取第N个元素 简介 基于mysql实现对某个表的某个字段按照顺(逆)序取第N个排序对应的元素,该语句通过存储过程结合预处理实现,也可在程序语言里通过SQL拼接实现. 示例 --1存储过 ...
- 【MySQL 中 动态sql,游标_】
MySQL 中 动态sql,游标_SQLServer MySQL的技术博客_51CTO博客
- mysql防注入pdo_mysql PDO和存储过程动态SQL注入
正如我在许多文章中看到的那样,存储过程中的动态SQL容易受到SQL注入的攻击.但是,如果我们将先前的PDO与准备好的语句一起使用,这仍然不安全吗? 例: CREATE PROCEDURE my_sp( ...
- oracle 动态声明变量_oracle存储过程动态sql变量赋值
如何动态执行存储过程或函数 目前在Oracle数据库存储过程研发过程中,遇到需要从某张表中读取存储过程名并进行动态执行的情况,经查找资料,制作成DEMO,并通过测试,现共享下,以备其他同事遇到此种情况 ...
- mysql动态sql是什么,mysql中动态sql的一次实际应用
一.前言 本次实际应用中,使用到了如下几个要点: mysql的动态建表; mysql的多表插入; mysql的多表更新; mysql的多表删除; 二.使用场景 2.1 动态建表 要求建立多个表,例如电 ...
- MyBatisPlus自动生成代码springboot+mybatis+mysql 以及动态sql生成方法(测试可用版)
用了一段时间的springboot,想着百度一下自动生成代码的方式,包括后面如何生成动态sql方法的方式. 摸索了几天,整理一下: ** 1 自动生成代码方式:com.baomidou.mybatis ...
- oracle创建存储过程动态sql,Oracle存储过程使用动态SQL
Oracle存储过程使用动态SQL 有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者.试验步骤如下: 1:DDL和DML /*** DDL ***/ begin ...
- oracle存储过程动态sql单引号拼接和变量拼接
1.单引号的作用 在oracle中单引号主要有两个作用: 一是字符串都用单引号引用,例如'abc':二是转义符,转义符在使用时一般会出现多个连在一起的单引号,相对难理解一些.下面举例说明. 实例1:s ...
- oracle存储过程动态SQL中引号的使用
写存储过程时,引号是一个永远避不开的祸,如果只是单个引号的话很好用,比如向表中插入数据, 1.直接插(字符型加上引号就行) INSERT INTO DEPT (DEPTNO,DNAME,LOC) VA ...
最新文章
- [LeetCode226]Invert Binary Tree
- Java基础之参数传递
- 单模光纤和多模光纤的区别_多模光纤和单模光纤的区别与应用
- 基于Asterisk的VoIP开发指南(2)——Asterisk AGI程序编写指南
- 基于Go实现的秒杀系统
- xml转java代码_java 中xml转换为Bean实例解析(纯代码)
- JavaWeb——response与request
- 王思祺2015080360030的第一次作业完全版
- Atitit.biz业务系统 面向框架 面向模式---------数据映射imp
- Python实现基于模块的库存管理系统
- Web前端开发最常见的八种编程软件
- 7-5 统计素数并求和
- 同学聚会幽默 , 小学生搞笑图片
- RabbitMQ的ack和nack机制
- linux类mac桌面,让Linux Mint看起来更像Mac桌面的主题
- 微信小程序项目开发---第一章 制作首页
- selenium如何通过快捷键关闭浏览器打开的新页签
- 浏览器实现pdf下载、ms http下载、IE不兼容
- 提升程序员工作效率的6个工具利器
- transformers之中mt5和t5的区别