PREPARE
📄字数 1.8K
👁️阅读量 加载中...
PREPARE
为服务端提供预处理语句SQL。可用于优化性能。执行PREPARE
语句时将解析、分析和重写指定的SQL。当发出执行命令时将执行准备好的语句。这种处理避免了重复的解析分析工作,从而达到性能的提升。
提示
PREPARE
语句仅在当前会话中生效,会话关闭后,会释放会话的所有PREPARE语句。- 可通过参数
max_prepare_num
设置当前会话的最大PREPARE语句数,详细说明参见参数-max_prepare_num。 - 可通过参数
prepare_reuse
关闭预处理重用,详细说明参见参数-prepare_reuse。 PREPARE
方式执行DML语句,持有的依赖对象锁在事务提交时释放,事务提交后可以对依赖对象进行DDL等操作。
一、创建prepare
1.1 语法格式
1.2 参数说明
pre_name
:PREPARE
语句的名称。prepare_sql_stmt
: 预编译的SQL语句,可支持DML和DDL。
1.3 示例
示例1
创建一个名为pre_s的查询表tab_test的prepare语句。
sqlSQL> CREATE TABLE tab_test(col_1 int, col_2 int); SQL> INSERT INTO tab_test VALUES(1,1),(2,2),(3,3); SQL> SELECT * FROM tab_test; +-------+-------+ | COL_1 | COL_2 | +-------+-------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +-------+-------+ SQL> PREPARE pre_s AS SELECT * FROM tab_test; +-------+-------+ | COL_1 | COL_2 | +-------+-------+
示例2
创建一个名为pre_i的插入视图view_test1的prepare语句。
sqlSQL> CREATE TABLE table_test2(id INT,name VARCHAR); SQL> CREATE TABLE table_test3(id INT,name VARCHAR); SQL> CREATE VIEW view_test1 AS SELECT * FROM table_test2; SQL> INSERT INTO table_test2 values(1,'a')(2,'b')(3,'c'); SQL> INSERT INTO table_test3 values(11,'aa'); SQL> PREPARE pre_i AS INSERT INTO view_test1 values(1,'a'); SQL> select * from table_test2; +----+------+ | ID | NAME | +----+------+ | 1 | a | | 2 | b | | 3 | c | +----+------+
二、执行prepare
2.1 语法格式
2.2 参数说明
pre_name
:PREPARE
语句的名称。AsCursorStmt
: 将PREPARE
语句声明为游标。cursor_name
:游标名称RETURN ICONST
:执行PREPARE
语句返回的行数。剩余数据通过FETCH cursor_name
获取。
注意
AsCursorStmt
只对Select
的PREPARE
语句有效。
2.3 示例
示例1
直接执行prepare语句pre_s。
sqlSQL> ?pre_s; +-------+-------+ | COL_1 | COL_2 | +-------+-------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +-------+-------+
示例2
执行pre_s返回一条数据,并声明为游标cur_s,获取剩余数据。
sqlSQL> ?pre_s AS CURSOR cur_s return 1; +-------+-------+ | COL_1 | COL_2 | +-------+-------+ | 1 | 1 | +-------+-------+ SQL> fetch cur_s; +-------+-------+ | COL_1 | COL_2 | +-------+-------+ | 2 | 2 | | 3 | 3 | +-------+-------+
示例3
执行prepare语句pre_s前删除依赖的表tab_test。
sqlSQL> DROP TABLE tab_test; SQL> ?pre_s; Error: [E5021 L1 C32] 表或视图TAB_TEST不存在
示例4
执行prepare语句pre_i之前,对视图view_test1创建触发器trig_view_test1
sql-- 创建触发器trig_view_test1,对视图view_test1插入时,替换为对表table_test3插入 SQL> CREATE TRIGGER trig_view_test1 INSTEAD OF INSERT ON view_test1 FOR EACH ROW BEGIN INSERT INTO table_test3 VALUES(22, 'insert data'); END; / -- 执行prepare语句pre_i SQL> ?pre_i; SQL> select * from table_test2; +----+------+ | ID | NAME | +----+------+ | 1 | a | | 2 | b | | 3 | c | +----+------+ SQL> select * from table_test3; +----+-------------+ | ID | NAME | +----+-------------+ | 11 | aa | | 22 | insert data | +----+-------------+
三、释放prepare
3.1 语法格式
3.2 参数说明
pre_name
:PREPARE
语句的名称。
3.3 示例
示例
释放prepare语句pre_s。
sqlSQL> DEALLOCATE pre_s;