1.1 SET DEFERRED_PREPARE 语句
使用 SET DEFERRED_PREPARE 语句来控制客户端处理是否推迟将 PREPARE 语句发送到数据库服务器,直到发送 OPEN 或 EXECUTE 语句为止。
仅 GBase 8s 支持此语句,这是对 SQL 的 ANSI/ISO 标准的扩展。您仅可随同 GBase 8s ESQL/C 使用此语句。
语法

用法
在缺省情况下,SET DEFERRED_PREPARE 语句导致应用程序推迟将 PREPARE 语句发送到数据库服务器,直到执行 OPEN 或 EXECUTE 语句。实际上,PREPARE 语句与其他语句捆绑在一起,以便在客户端和服务器之间发送消息的一个来回,而不是两个。此 Deferred-Prepare 特性可影响下列动态 SQL 语句的系列:
l 随同 FETCH 或 PUT 语句操作的 PREPARE、DECLARE、OPEN 语句块
l EXECUTE 或 EXECUTE IMMEDIATE 语句跟随的 PREPARE
您可为 SET DEFERRED_PREPARE 指定 ENABLED 或 DISABLED 选项。
如果您未指定选项,则缺省的是 ENABLED。下列示例缺省地启用 Deferred-Prepare 特性:
EXEC SQL set deferred_prepare;
ENABLED 选项在应用之内启用 Deferred-Prepare 特性。下列示例显式地指定 ENABLED 选项:
EXEC SQL set deferred_prepare enabled;
在应用发出 SET DEFERRED_PREPARE ENABLED 之后,在该应用中为后续的 PREPARE 语句启用 Deferred-Prepare 特性。然后,该应用表现下列行为:
l 序列 PREPARE、DECLARE、OPEN 以 OPEN 语句将 PREPARE 语句发送到数据库服务器。如果准备好的语句有语法错误,则数据库服务器不将错误消息返回给应用,直到应用为准备好的语句声明游标并打开该游标。
l 序列 PREPARE、EXECUTE 随同 EXECUTE 语句将 PREPARE 语句发送到数据库服务器。如果准备好的语句包含语法错误,则数据库服务器不将错误消息返回到应用,直到应用尝试执行该准备好的语句为止。
如果在包含 DESCRIBE 语句的 PREPARE、DECLARE、OPEN 语句块中启用 Deferred-Prepare,则 DESCRIBE 语句必须跟在 OPEN 语句而不是 PREPARE 语句之后。如果 DESCRIBE 跟着 PREPARE,则 DESCRIBE 语句导致错误。
使用 DISABLED 选项来在该应用之内禁用 Deferred-Prepare 特性。下列示例指定 DISABLED 选项:
EXEC SQL set deferred_prepare disabled;
如果您指定 DISABLED 选项,则当执行 PREPARE 语句时,应用将每一 PREPARE 语句发送到数据库服务器。
SET DEFERRED_PREPARE 的示例
下列代码段展示带有 PREPARE、EXECUTE 语句块的 SET DEFERRED_PREPARE 语句。在此情况下,数据库服务器立即执行 PREPARE 和 EXECUTE 语句:
EXEC SQL BEGIN DECLARE SECTION;
int a;
EXEC SQL END DECLARE SECTION;
EXEC SQL allocate descriptor ‘desc’;
EXEC SQL create database test;
EXEC SQL create table x (a int);
/* 启用 Deferred-Prepare 特性 */
EXEC SQL set deferred_prepare enabled;
/* 准备 INSERT 语句 */
EXEC SQL prepare ins_stmt from ‘insert into x values(?)’;
a = 2;
EXEC SQL EXECUTE ins_stmt using :a;
if (SQLCODE)
printf(“EXECUTE : SQLCODE is %d\n”, SQLCODE);
随同 OPTOFC 使用 Deferred-Prepare
您可组合地使用 Deferred-Prepare 与“Open-Fetch-Close 优化”(OPTOFC)。OPTOFC 特性推迟将 OPEN 消息发送到数据库服务器,直到发送 FETCH 消息为止。如果您同时启用 Deferred-Prepare 和 OPTOFC,则发生下列情况:
l 如果准备好的语句的文本包含语法错误,则不将错误消息返回到应用,直到执行第一个 FETCH 语句为止。
l 不可执行 DESCRIBE 语句,直到 FETCH 语句之后为止。
l 在可执行 DESCRIBE 或 GET DESCRIPTOR 语句之前,您必须发出 ALLOCATE DESCRIPTOR 语句。
数据库服务器执行 SET DESCRIPTOR 语句的内部执行,设置系统描述符区域中的 TYPE、LENGTH、DATA 和其他字段。您在 FETCH 语句之后指定 GET DESCRIPTOR 语句来查看返回的数据。