MySQL 5.7 PREPARE、EXECUTE、DEALLOCATE语句介绍
语句的名字不区分大小写。准备好的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 ;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26506993/viewspace-2098186/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26506993/viewspace-2098186/
MySQL 5.7 PREPARE、EXECUTE、DEALLOCATE语句介绍相关推荐
- mysql5.7语句建库_MySQL 5.7 PREPARE、EXECUTE、DEALLOCATE语句介绍
PREPARE语句准备好一条SQL语句,并分配给这条SQL语句一个名字供之后调用.准备好的SQL语句通过EXECUTE命令执行,通过DEALLOCATE PREPARE命令释放掉. 语句的名字不区分大 ...
- mysql execute using_MySQL:将过程参数传递给EXECUTE USING语句
这是 MySQL 5.1. (注意:我意识到有更好的方法来做这个特定的例子,这不是我真正的代码) 这是我想要做的: 下面的过程被创建,但是当我调用它时,我得到"ERROR 1210(HY00 ...
- mysql 8.0 一条insert语句的具体执行流程分析(三)
代码版本:mysql 8.0.22 编程语言:c++ && c++11 && c++14 && c++17 上一篇文章:mysql 8.0 一条inse ...
- mysql查询未提交事务的sql语句
mysql查询未提交事务的sql语句,找出未提交事务执行的SQL语句 mysql开启事务后没有提交就退出,事务长时间running状态,进程又处于Sleep状态,有可能后续导致其他事物超时失败 常见原 ...
- 如何在mysql查找效率慢的SQL语句
如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启 ...
- mysql 8.0 一条insert语句的具体执行流程分析(二)
继续上一篇文章:mysql 8.0 一条insert语句的具体执行流程分析(一)_一缕阳光的博客-CSDN博客 由于最近换工作一直在试用期内,在拼命的学习.总结中,因此没有时间写文章,今天转正了腾出来 ...
- MySQL中的几类日志文件介绍
MySQL中的几类日志文件介绍 关于Mysql日志 splunk内置了两种mysql的日志,分别是mysqld以及mysql_error mysqld_error Standard mysql err ...
- mysql介绍索引类型的章节_mysql索引总结--mysql索引类型以及创建的详细介绍
关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型 ...
- mysql创建用户表的sql语句,mysql创建表的sql语句
mysql 动态sql语句,如何用一款小工具大大加速MySQL SQL语句优化(附源,mysql分页查询sql语句,mysql创建表的sql语句 mysql建表语句_计算机软件及应用_IT/计算机_专 ...
最新文章
- matlab plot绘图函数官方详解
- 【Matlab 控制】多智能体一致性收敛仿真
- Elasticsearch:用于内容丰富的文本分析
- socket用起始码分割_常用条码Code128码及EAN13码的介绍
- git 撤销merge_相见恨晚的 Git 命令动画演示,一看就懂!
- Spring 三层架构
- Educational Codeforces Round 67 E.Tree Painting (树形dp)
- 2020年第六届 美亚杯电子取证 团体赛 wp
- mac怎么用ntfs硬盘 NTFS移动硬盘怎么在mac上使用
- 从无刷直流电动机控制系统电磁兼容设计,谈电磁干扰原理
- 内存频率,CPU频率,主板频率之间的制约
- PLSQL官网, 及个版本下载地址和下载方法
- 1. 激活函数(Activation functions)
- 史上最详细店铺运营方案,新手必看!
- EPS在倾斜摄影“房地一体”项目中的应用及操作简介
- 清华大学出版数据结构第五版的链表的使用方法_JavaScript 中的数据结构:写给前端软件工程师...
- 详解ES6中的 let 和const
- python语言程序设计 嵩天老师(第七周)
- 《第一行代码Android》笔记
- JO、JNO、JB、JNB命令详解(从原理上)