PREPARE

功能描述

创建一个预备语句。

预备语句是服务端的对象,可以用于优化性能。在执行PREPARE语句的时候,指定的查询被解析、分析、重写。当随后发出EXECUTE语句的时候,预备语句被规划和执行。这种设计避免了重复解析、分析工作。PREPARE语句创建后在整个数据库会话期间一直存在,一旦创建成功,即便是在事务块中创建,事务回滚,PREPARE也不会删除。只能通过显式调用DEALLOCATE进行删除,会话结束时,PREPARE也会自动删除。

注意事项

相比于原始的openGauss,dolphin对于PREPARE语法的修改为:

  1. 支持 PREPARE FROM 语法。

  2. statement 支持加单引号,且单引号内的statement必须是单个query。加单引号的场景,statement除了SELECT、INSERT、UPDATE、DELETE、MERGE INTO或VALUES语句外,还支持其他最终会转换成SelectStmt的语句,如部分SHOW系列语句等。

  3. statement 中的绑定参数支持使用?,需要先将dolphin.b_compatibility_mode设置为on,且不能同时在一个语句中同时使用$?作为参数占位符。将dolphin.b_compatibility_mode设置为on后,?将不能作为操作符使用。

语法格式

  1. PREPARE name [ ( data_type [, ...] ) ] { AS | FROM } statement;
  2. PREPARE name [ ( data_type [, ...] ) ] { AS | FROM } 'statement';

参数说明

  • name

    指定预备语句的名称。它必须在该会话中是唯一的。

  • data_type

    参数的数据类型。

  • statement

    是SELECT INSERT、UPDATE、DELETE、MERGE INTO或VALUES语句之一。

示例

  1. openGauss=# CREATE TABLE test(name text, age int);
  2. CREATE TABLE
  3. openGauss=# INSERT INTO test values('a',18);
  4. INSERT 0 1
  5. openGauss=# PREPARE stmt FROM SELECT * FROM test;
  6. PREPARE
  7. openGauss=# EXECUTE stmt;
  8. name | age
  9. ------+-----
  10. a | 18
  11. (1 row)
  12. openGauss=# set dolphin.b_compatibility_mode to on;
  13. SET
  14. openGauss=# PREPARE stmt1 FROM 'SELECT sqrt(pow(?,2) + pow(?,2)) as test';;
  15. PREPARE
  16. openGauss=# EXECUTE stmt1 USING 6,8;
  17. test
  18. ------
  19. 10
  20. (1 row)