Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.
准备将在以后执行的语句,或者定义游标。
PREPARE statement-name FROM statement [ FOR { UPDATE [ cursor-concurrency ] | READ ONLY } ] [ DESCRIBE describe-type INTO [ [ SQL ] DESCRIPTOR ] descriptor ] [ WITH EXECUTE ]
statement-name : identifier or hostvar
statement : string or hostvar
describe-type : [ ALL | BIND VARIABLES | INPUT | OUTPUT | SELECT LIST ] [ LONG NAMES [ [ [ OWNER. ]TABLE. ]COLUMN ] | WITH VARIABLE RESULT ]
cursor-concurrency : BY { VALUES | TIMESTAMP | LOCK }
statement-name 语句名可以是标识符或主机变量。但在使用多个 SQLCA 时不能使用标识符。否则,两个预准备语句可能具有相同的语句号,而这可能导致执行或打开错误的语句。此外,建议不要将标识符用于多线程应用程序的语句名,因为语句名可能由多线程同时引用。
DESCRIBE 子句 如果使用了 DESCRIBE INTO DESCRIPTOR,则会在指定的描述符中对准备好的语句进行说明。说明类型可能是 DESCRIBE 语句所允许的任何说明类型。
FOR UPDATE | FOR READ ONLY 定义游标使用语句时的游标可更新性。FOR READ ONLY 游标不能在 UPDATE(定位)或 DELETE(定位)操作中使用。FOR READ ONLY 是缺省设置。
为响应指定 FOR UPDATE 的游标的任何请求,SQL Anywhere 提供了对值敏感的游标或敏感性未定型的游标。不敏感的游标或者敏感性未定型游标不能更新。
BY VALUES | BY TIMESTAMP 数据库服务器通过利用键集决定的游标,这样,如果在滚动结果集过程中修改或删除了行,则会通过该游标通知应用程序。
BY LOCK 子句 数据库服务器在结果集的读取行上获得意图行锁。这些锁是长期锁,会一直保留到对事务执行提交或回退。
WITH EXECUTE 子句 如果使用了 WITH EXECUTE 子句,则当且仅当此语句不是 CALL 或 SELECT 语句且不含任何主机变量时才会执行。成功执行后,此语句立即被删除。如果 PREPARE 和 DESCRIBE(如果有)成功执行,但该语句却无法执行,则会设置警告 SQLCODE 111, SQLSTATE 01W08,但不会删除该语句。
DESCRIBE INTO DESCRIPTOR 和 WITH EXECUTE 子句可以提高性能,因为它们减少了所需的客户/服务器通信。
WITH VARIABLE RESULT 子句 WITH VARIABLE RESULT 子句用于描述可能有多个结果集(具有不同列数或列类型)的过程。
如果使用 WITH VARIABLE RESULT,则数据库服务器在 DESCRIBE 子句之后将 SQLCOUNT 值设置为下列值之一:
0 结果集可能更改:应该在每个 OPEN 语句后重新描述过程调用。
1 结果集是固定的。不需要重新进行描述。
出于兼容性考虑,仍然支持准备 COMMIT、PREPARE TO COMMIT 和 ROLLBACK 语句。但是,建议用静态嵌入式 SQL 执行所有的事务管理操作,因为某些应用程序环境可能需要它。此外,其它嵌入式 SQL 系统不支持动态事务管理操作。
PREPARE 语句准备 statement 中指定的 SQL 语句,并使准备好的语句与 statement-name 关联。在执行语句或者打开游标(如果是 SELECT 或 CALL 语句的话)时,引用上述语句名称。statement-name 可以是在自动包含的 sqlca.h 头文件中定义的 a_sql_statement_number 类型的主机变量。如果将标识符用于 statement-name,则每个模块只有一个语句可使用此 statement-name 进行准备。
如果将主机变量用作 statement-name,则它必须是短整型。sqlca.h 中含有此类型的类型定义,名为 a_sql_statement_number。SQL 预处理器识别此类型,因此可在 DECLARE 节中使用。由于主机变量在 PREPARE 语句中由数据库定义,因此无需进行初始化。
无。
此前使用同一名称准备的所有语句都会丢失。
仅当使用了 WITH EXECUTE 且执行成功时,才会在使用后删除此语句。在其它情况下,应当确保每次使用后都删除语句。如果未执行此操作,则不回收与此语句关联的内存。
SQL/2008 PREPARE 是可选 SQL/2008 语言功能 B031 "基本动态 SQL" 的一部分。可选的 FOR UPDATE、FOR READ ONLY、DESCRIBE 和 WITH EXECUTE 子句是服务商扩充。
下面的语句准备一个简单查询:
EXEC SQL PREPARE employee_statement FROM 'SELECT Surname FROM Employees';