Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


PREPARE

📄字数 1.8K
👁️阅读量 加载中...

PREPARE为服务端提供预处理语句SQL。可用于优化性能。执行PREPARE语句时将解析、分析和重写指定的SQL。当发出执行命令时将执行准备好的语句。这种处理避免了重复的解析分析工作,从而达到性能的提升。

提示

  1. PREPARE语句仅在当前会话中生效,会话关闭后,会释放会话的所有PREPARE语句。
  2. 可通过参数max_prepare_num设置当前会话的最大PREPARE语句数,详细说明参见参数-max_prepare_num
  3. 可通过参数prepare_reuse关闭预处理重用,详细说明参见参数-prepare_reuse
  4. 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语句。

    sql
    SQL> 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语句。

    sql
    SQL> 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只对SelectPREPARE语句有效。

2.3 示例

  • 示例1

    直接执行prepare语句pre_s。

    sql
    SQL> ?pre_s;
    
    +-------+-------+
    | COL_1 | COL_2 |
    +-------+-------+
    | 1     | 1     |
    | 2     | 2     |
    | 3     | 3     |
    +-------+-------+
  • 示例2

    执行pre_s返回一条数据,并声明为游标cur_s,获取剩余数据。

    sql
    SQL> ?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。

    sql
    SQL> 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。

    sql
    SQL> DEALLOCATE pre_s;