Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (P-Z)

 

PREPARE 语句 [ESQL]

此语句用于准备将在以后执行的语句,或者用于定义游标。

语法
PREPARE statement-name
   FROM statement
[ 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 ]
参数
  • statement-name   语句名可以是标识符或主机变量。但在使用多个 SQLCA 时不能使用标识符。否则,两个预准备语句可能具有相同的语句号,而这可能导致执行或打开错误的语句。此外,建议不要将标识符用于多线程应用程序的语句名,因为语句名可能由多线程同时引用。

  • DESCRIBE 子句   如果使用了 DESCRIBE INTO DESCRIPTOR,则会在指定的描述符中对准备好的语句进行说明。说明类型可能是 DESCRIBE 语句所允许的任何说明类型。

  • 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 语句的话)时,引用上述的语句名称。statement-name 可以是在自动包含的 sqlca.h 头文件中定义的 a_sql_statement_number 类型的主机变量。如果将标识符用于 statement-name,则每个模块只有一个语句可使用此 statement-name 进行准备。

如果将主机变量用作 statement-name,则它必须是 SHORT INT 类型。sqlca.h 中含有此类型的类型定义,名为 a_sql_statement_number。SQL 预处理器识别此类型,因此可在 DECLARE 节中使用。在执行 PREPARE 语句期间,主机变量由数据库填充,不必由程序员进行初始化。

权限

无。

副作用

此前使用同一名称准备的所有语句都会丢失。

仅当使用了 WITH EXECUTE 且执行成功时,才会在使用后删除此语句。在其它情况下,应当确保每次使用后都删除语句。如果未执行此操作,则不回收与此语句关联的内存。

另请参见
标准和兼容性
  • SQL/2003   核心特性。

示例

下面的语句准备一个简单查询:

EXEC SQL PREPARE employee_statement FROM
'SELECT Surname FROM Employees';