MySQL预处理语句PREPARE、EXECUTE、DEALLOCATE使用大全
说明
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
PREPARE语句准备好一条SQL语句,并分配给这条SQL语句一个名字供之后调用。准备好的SQL语句通过EXECUTE命令执行,通过DEALLOCATE PREPARE命令释放掉。
语句的名字不区分大小写。准备好的SQL语句名字可以是字符串,也可以是用户指定的包含SQL文本的变量。PREPARE中的SQL文本必须代表一条单独的SQL语句而不能是多条SQL语句。在SQL语句中,? 字符用来作为后面执行查询使用的一个参数。? 不能加上引号,即使打算将它们绑定到字符变量中也不可以。
如果准备好的SQL语句名字已经存在,它会在新语句被准备好前释放掉。这意味着,如果一条新的语句包含错误且不能被准备好,这时会返回错误并且准备好的SQL语句将不再存在。
准备好的语句范围是创建它的会话,具有下列特点:
准备好的语句在其他会话无效;
当会话结束时,不管会话是正常结束还是异常结束,这个会话中准备好的SQL语句将不再存在。如果自动连接功能开启,客户端不会被通知连接丢失。
在存储过程或函数里面的准备好的语句,在存储过程或函数执行结束后,会继续存在,可以在存储过程或包外面继续被执行。
示例
mysql> SET @a=10;
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE STMT FROM 'SELECT * FROM dept2 LIMIT ?';
Query OK, 0 rows affected (0.08 sec)
Statement prepared
mysql> EXECUTE STMT USING @a;
+--------+-------+
| deptno | dname |
+--------+-------+
| 10 | A |
| 20 | B |
| 30 | C |
| 40 | D |
| 50 | E |
| 60 | F |
| 70 | G |
| 80 | H |
| 90 | I |
| 100 | J |
+--------+-------+
10 rows in set (0.02 sec)
mysql> SET @skip=1; SET @numrows=5;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE STMT FROM 'SELECT * FROM dept2 LIMIT ?, ?';
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE STMT USING @skip, @numrows;
+--------+-------+
| deptno | dname |
+--------+-------+
| 20 | B |
| 30 | C |
| 40 | D |
| 50 | E |
| 60 | F |
+--------+-------+
5 rows in set (0.00 sec)
mysql> DEALLOCATE PREPARE STMT;
Query OK, 0 rows affected (0.00 sec)
mysql> EXECUTE STMT USING @skip, @numrows;
ERROR 1243 (HY000): Unknown prepared statement handler (STMT) given to EXECUTE
mysql> PREPARE STMT FROM 'SELECT * FROM dept2 LIMIT ?, ?';
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE STMT USING @skip, @numrows;
+--------+-------+
| deptno | dname |
+--------+-------+
| 20 | B |
| 30 | C |
| 40 | D |
| 50 | E |
| 60 | F |
+--------+-------+
5 rows in set (0.00 sec)
示例存储过程
delimiter $$
create procedure registerSQLReference(
IN the_table_name VARCHAR(80),
IN the_sql_script_version VARCHAR(80),
IN the_sql_script_name VARCHAR(80),
IN the_install_version VARCHAR(80),
IN the_execution_duration VARCHAR(80),
IN the_sql_script_description VARCHAR(200)
)
BEGIN
declare column_exist INT DEFAULT 0;
declare the_query VARCHAR(500);
select '[INFO] Check if the column C_CHANGE_DESCRIPTION exists in the table @VERSION_LEVEL_TABLE_NAME';
set column_exist = is_ChangeDescColumnExist ('@VERSION_LEVEL_TABLE_NAME');
IF column_exist = 0
THEN
select '[INFO] VERSION LEVEL TABLE does not contain C_CHANGE_DESCRIPTION column.';
set @v_the_table_name=the_table_name;
select concat('INSERT INTO ', @v_the_table_name, ' VALUES (?, ?, ?, ?, ?) ') into the_query;
SET @stmt=the_query;
PREPARE STMT FROM @stmt;
select concat('[INFO] the_query=', the_query );
set @v_the_sql_script_version=the_sql_script_version;
set @v_the_sql_script_name=the_sql_script_name;
set @v_date=now();
set @v_the_install_version=the_install_version;
set @v_the_execution_duration=the_execution_duration;
EXECUTE STMT using @v_the_sql_script_version , @v_the_sql_script_name, @v_date, @v_the_install_version, @v_the_execution_duration;
ELSE
select '[INFO] VERSION LEVEL TABLE contains C_CHANGE_DESCRIPTION column.';
select concat('INSERT INTO ', the_table_name, ' VALUES (?, ?, ?, ?, ?, ?) ') into the_query;
SET @stmt=the_query;
PREPARE STMT FROM @stmt;
select concat('[INFO] the_query=', the_query );
set @v_the_sql_script_version=the_sql_script_version;
set @v_the_sql_script_name=the_sql_script_name;
set @v_date=now();
set @v_the_install_version=the_install_version;
set @v_the_execution_duration=the_execution_duration;
set @v_the_sql_script_description=the_sql_script_description;
select concat('[INFO] the_query=', the_query);
EXECUTE the_query using @v_the_sql_script_version , @v_the_sql_script_name, @v_date, @v_the_install_version, @v_the_execution_duration, @v_the_sql_script_description;
END IF;
DEALLOCATE PREPARE STMT;
END$$
delimiter;
MySQL预处理语句PREPARE、EXECUTE、DEALLOCATE使用大全的更多相关文章
- Mysql预处理语句prepare、execute、deallocate
前言 做CTF题的时候遇到的所以参考资料学习一波.... MySQL的SQL预处理(Prepared) 一.SQL 语句的执行处理 1.即时 SQL 一条 SQL 在 DB 接收到最终执行完毕返回,大 ...
- MySQL 预处理语句prepare、execute、deallocate的使用
所以对于中文乱码,需要去check的地方有如下3个:1.mysql窗口的字符编码(xshell连接的远程工具的字符集设置):2.数据库的字符编码(show variables like '%char% ...
- PHP MySQL 预处理语句
PHP MySQL 预处理语句 预处理语句对于防止 MySQL 注入是非常有用的. 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下: 预 ...
- mysql之预处理语句prepare、execute、deallocate
预制语句的SQL语法基于三个SQL语句: PREPARE stmt_name FROM preparable_stmt; EXECUTE stmt_name [USING @var_name [, @ ...
- MySQL预处理语句
预制语句的SQL语法基于三个SQL语句: PREPARE stmt_name FROM preparable_stmt; EXECUTE stmt_name [USING @var_name [, @ ...
- mysql -- 预处理语句
所谓预处理,即在真正执行某条SQL语句之前,先将SQL语句准备好,在执行过程中再绑定数据 语法: 准备预处理 prepare 预处理名字 from ‘要执行的SQL语句’ 执行预处理 execute ...
- 吴裕雄--天生自然 PHP开发学习:MySQL 预处理语句
<?php $servername = "localhost"; $username = "root"; $password = "admin& ...
- PHP MySQL -处理语句
PHP MySQL 预处理语句 预处理语句对于防止 MySQL 注入是非常有用的. 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下: 预 ...
- MySQL 游标(PREPARE预处理语句)
概述 本章节介绍使用游标来批量进行表操作,包括批量添加索引.批量添加字段等.如果对存储过程.变量定义.预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇 ...
- 理解Mysql prepare预处理语句
MySQL 5.1对服务器一方的预制语句提供支持.如果您使用合适的客户端编程界面,则这种支持可以发挥在MySQL 4.1中实施的高效客户端/服务器二进制协议的优势.候选界面包括MySQL C API客 ...
随机推荐
- 【超强SQL】WordPress批量修改指定分类下所有文章状态
前阵子主题君的某一个手游下载站的某一个分类,被百度K了,导致整个分类的文章收录都没了,这时候如果想要回复权重,就需要把这个分类的文章都删除了. 下面主题君给大家分享一段巨牛逼的SQL, WordPre ...
- # [NOIP2011 提高组] 铺地毯
传送锚点:https://www.luogu.com.cn/problem/P1003 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形 ...
- [COCI2008-2009 #2] PERKET
传送锚点:https://www.luogu.com.cn/problem/P2036 题目描述 Perket 是一种流行的美食.为了做好 Perket,厨师必须谨慎选择食材,以在保持传统风味的同时尽 ...
- 最小生成树Kruskal算法的实现原理
到底什么是最小生成树 最小生成树算法应用范围比较广,例如在网络的铺设当中难免会出现环路,需要要生成树算法来取出网络中的环,防止网络风暴的发生.那到底什么是最小生成树呢?我这里就不给严谨的定义了,这种定 ...
- Android 12(S) MultiMedia Learning(七)NuPlayer GenericSource
本节来看一下NuPlayer Source中的GenericSource,GenericSource主要是用来播放本地视频的,接下来着重来看以下5个方法: prepare,start,pause,se ...
- Python实现五子棋人机对战的二次开发
Python实现人机对战的二次开发 在网上找到了一个使用python实现五子棋游戏,其中通过加入一个简单的AI算法实现了人机对战的功能,我觉得这个人机对战还是蛮有意思的,下面我分析一下五子棋游 ...
- 电源电路E24系列反馈电阻计算表格
可调电源,包括DCDC.LDO电路的设计中,经常需要计算反馈电阻进行选型.为了提高效率,优化选型采购,抽空做了个表格进行快速计算. 1.一般反馈电阻电路如下. 输出电压公式为:Vout=Vfb*(Rh ...
- js 求任意两数之间的和
知识点:函数的传参,函数的返回值 函数的传参 函数的参数包括以下两种类型: 1.形参:在定义函数时,声明的参数变量仅在函数内部可见: 2.实参:在调用函数时,实际传入的值. 示例 我们在定义函数的时候 ...
- Windows下cmd命令行ssh连接Linux服务器
1.window+R键进入运行 2.输入cmd,运行命令行工具 3.使用,命令ssh连接服务器 ssh -t 用户名@ip地址 -p 22 例如: 输入密码,显示连接成功
- UDP端口探活的那些细节
一 背景 商业客户反馈用categraf的net_response插件配置了udp探测, 遇到报错了,如图 udp是无连接的,无法用建立连接的形式判断端口. 插件最初的设计是需要配置udp的发送字符 ...