PREPARE

说明

定义一个查询计划

语法

prepare ::=

p_types ::=

content ::=

参数

plan_name

要定义的查询计划名。

param_type

查询计划中参数的类型。当查询计划中需要参数时,可以事先指定各参数的类型。参数的类型可以不全部指定,但指定的那些参数类型必须是查询计划中按顺序出现的前面几个参数。对于没有指定类型的参数,如果此参数的类型不能从上下文环境中获取,则默认将其类型绑定为TEXT类型。

AS

后跟要定义的查询计划的内容,可以包括Select语句、Insert语句、Update语句、Delete语句或执行存储过程语句。

FROM

后跟要定义的查询计划的内容。同 AS 。

select_stmt

SELECT 语句(在数据库中进行数据检索)请参见 SELECT

insert_stmt

INSERT 语句(向一个基本表或视图中插入数据)请参见 INSERT

update_stmt

UPDATE 语句(更新一个基本表或视图中的一行或多行)请参见 UPDATE

delete_stmt

DELETE 语句(从一个基本表或视图中删除数据)请参见 DELETE

exec_stmt

EXEC 语句(执行单独的过程或函数)请参见 EXEC

merge_stmt

MERGE 语句(合并两个基本表或视图)请参见 MERGE

anonymous_stmt

ANONYMOUS 语句(匿名块)请参见 匿名块

注解

PREPARE 是系统扩展。

PREPARE 时使用返回结果集的存储过程没有意义,因为 EXECUTE 不支持。

示例

示例1: 定义一个查询计划

--  清理环境
DEALLOCATE PREPARE pp1;
DROP TABLE tab1 CASCADE;

--  创建表
CREATE TABLE tab1(a INT, b VARCHAR(20));


--  创建一个查询计划
PREPARE pp1 AS INSERT INTO tab1 VALUES(?, ?);

--  执行查询计划
EXECUTE pp1(1, '1');
EXECUTE pp1(2, '12');
EXECUTE pp1(3, '123');


SELECT * FROM tab1 ORDER BY a, b;
A(int)      |B(varchar)      |
----------------------------
1           |1               |
----------------------------
2           |12              |
----------------------------
3           |123             |
总数目:3


--  创建同名查询计划
--  原查询计划因被替代而失效
PREPARE pp1 AS SELECT * FROM tab1 WHERE a = ?;

--  执行查询计划
EXECUTE pp1(1);
EXECUTE pp1(2);
EXECUTE pp1(3);


--  删除查询计划和表
DEALLOCATE PREPARE pp1;
DROP TABLE tab1;

示例2: 使用存储过程定义一个查询计划

--  清理环境
DEALLOCATE PREPARE pp2;
DROP PROCEDURE proc2;
DROP TABLE tab2 CASCADE;

--  创建表
CREATE TABLE tab2(a INT, b VARCHAR(20));


CREATE PROCEDURE proc2 (INT, VARCHAR(20)) AS 
BEGIN
    INSERT INTO tab2 VALUES($1, $2);
END;
/

--  创建一个查询计划
PREPARE pp2 AS EXEC proc2(?, ?);

--  执行查询计划
EXECUTE pp2(1, '1');
EXECUTE pp2(2, '12');
EXECUTE pp2(3, '123');


SELECT * FROM tab2 ORDER BY a, b;
A(int)      |B(varchar)      |
----------------------------
1           |1               |
----------------------------
2           |12              |
----------------------------
3           |123             |
总数目:3

--  删除查询计划、存储过程和表
DEALLOCATE PREPARE pp2;
DROP PROCEDURE proc2;
DROP TABLE tab2;

示例3: 使用匿名块定义一个查询计划

--  清理环境
DEALLOCATE PREPARE pp3;
DROP TABLE tab3 CASCADE;

--  创建表
CREATE TABLE tab3(a INT, b VARCHAR(20));

--  创建一个查询计划
PREPARE pp3 AS 
DO BEGIN 
    INSERT INTO tab3 VALUES(?, ?); 
END;
/

--  执行查询计划
EXECUTE pp3(1, '1');
EXECUTE pp3(2, '12');
EXECUTE pp3(3, '123');


SELECT * FROM tab3 ORDER BY a, b;
A(int)      |B(varchar)      |
----------------------------
1           |1               |
----------------------------
2           |12              |
----------------------------
3           |123             |
总数目:3

--  删除查询计划和表
DEALLOCATE PREPARE pp3;
DROP TABLE tab3;