VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

PREPARE

功能描述

创建一个预备语句。

预备语句是服务端的对象,可以用于优化性能。在执行PREPARE语句的时候,指定的查询被解析、分析、重写。当发出[EXECUTE]()语句的时候,预备语句被规划和执行。这种设计避免了重复解析、分析工作。

PREPARE语句创建后在整个数据库会话期间一直存在,一旦创建成功,即便是在事务块中创建,事务回滚,PREPARE也不会删除。只能通过显式调用[DEALLOCATE]()进行删除,会话结束时,PREPARE也会自动删除。

本文档只介绍PREPARE语句兼容MySQL的特性,原Vastbase的PREPARE语法未做删除和修改,详见PREPARE

Vastbase在MySQL兼容模式下,支持PREPARE如下特性用法:

  • 支持PREPARE FROM语法。
  • statement支持加单引号,且单引号内的statement必须是单个query。加单引号的场景,statement除了SELECT、INSERT、UPDATE、DELETE、MERGE INTO或VALUES语句外,还支持其他最终会转换成SelectStmt的语句,如部分SHOW系列语句等。
  • statement 中的绑定参数支持使用?,需要先将b_compatibility_mode设置为on,且不能同时在一个语句中同时使用$?作为参数占位符。将b_compatibility_mode设置为on后,?将不能作为操作符使用。

注意事项

  • 该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。
  • 如果创建预备语句的PREPARE语句声明了一些参数,那么传递给EXECUTE语句的必须是一个兼容的参数集,否则就会生成一个错误。

语法格式

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

参数说明

  • name

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

  • data_type

    参数的数据类型。

  • statement

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

示例

示例1:prepare from语法为SQL语句命名,并用EXECUTE执行。

1、创建测试表并插入数据。

CREATE TABLE example(id  INTEGER NOT NULL,c2  character(16));
insert into example values(generate_series(1,10),'test1');

2、用prepare from语法为SQL语句命名,并用EXECUTE执行。

  • 命名SELECT语句并执行。

    PREPARE stmt1 FROM 'SELECT * from example limit 3';
    EXECUTE stmt1;
    

    返回结果为:

    id |        c2
    ----+------------------
    1 | test1
    2 | test1
    3 | test1
    (3 rows)
    
  • 命名INSERT语句,执行该语句并查看插入结果。

    PREPARE stmt2 FROM 'insert into example(id) values(102)';
    EXECUTE stmt2;
    select * from example where id=102;
    

    返回结果为:

    id  | c2
    -----+----
    102 |
    (1 row)
    
  • 命名UPDATE语句,执行该语句并查看更新结果。

    PREPARE stmt3 FROM  update example set c2='test01' where id=$1;
    EXECUTE stmt3(102);
    select * from example where id=102;
    

    返回结果为:

    id  |        c2
    -----+------------------
    102 | test01
    (1 row)
    
  • 命名DELETE语句,执行该语句并查看结果。

    PREPARE stmt4 FROM delete from example where id=1;
    EXECUTE stmt4;
    select * from example order by id;
    

    返回结果为:

    id  |        c2
    -----+------------------
    2 | test1
    3 | test1
    4 | test1
    5 | test1
    6 | test1
    7 | test1
    8 | test1
    9 | test1
    10 | test1
    102 | test01
    (10 rows)
    

3、在视图[pg_prepared_statements]()中查看名称为stmt3的语句。

select * from pg_prepared_statements where name='stmt3';

返回结果为:

 name  |                            statement                            |         prepare_time          | parameter_types | from_sql
-------+-----------------------------------------------------------------+-------------------------------+-----------------+----------
 stmt3 | PREPARE stmt3 FROM  update example set c2='test01' where id=$1; | 2023-08-22 10:15:14.913309+08 | {integer}       | t
(1 row)

示例2: 在prepare语句中使用单引号和?

1、创建测试表并插入数据。

CREATE TABLE test(name text, age int);
INSERT INTO test values('a',18);

2、调用prepare语句执行查询,并用EXECUTE执行。

PREPARE stmt FROM SELECT * FROM test;
EXECUTE stmt;

返回结果为:

 name | age 
------+-----
 a    |  18
(1 row)

3、设置GUC参数b_compatibility_mode为on。

set b_compatibility_mode to on;

4、在prepare语句中使用?

PREPARE stmt1 FROM 'SELECT sqrt(pow(?,2) + pow(?,2)) as test';;
EXECUTE stmt1 USING 6,8;

返回结果为:

 test
------
   10
(1 row)