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 语句 (E-O)

 

EXECUTE IMMEDIATE 语句 [SP]

此语句用于使动态构造的语句能够从过程内执行。

语法 1
EXECUTE IMMEDIATE [ execute-option ] string-expression
execute-option:
  WITH QUOTES [ ON | OFF ]
| WITH ESCAPES { ON | OFF }
| WITH RESULT SET { ON | OFF }
语法 2
EXECUTE ( string-expression )
参数
  • WITH QUOTES 子句   当指定 WITH QUOTES 或 WITH QUOTES ON 时,字符串表达式中的任何双引号都被假定用于界定标识符。当未指定 WITH QUOTES 或指定了 WITH QUOTES OFF 时,对字符串表达式中的双引号的处理方式取决于 quoted_identifier 选项的当前设置。

    如果使用传递到存储过程中的对象名构造要执行的语句,但该名称可能需要双引号,并且当 quoted_identifier 设置为 Off 时可能调用该过程,这时使用 WITH QUOTES 非常有用。请参见quoted_identifier 选项 [兼容性]

  • WITH ESCAPES 子句   使用 WITH ESCAPES OFF 可以忽略字符串表达式中的任何转义序列(例如 \n、\x 或 \\)。例如,两个连续的反斜线仍保留为两个反斜线,而不会转换为一个反斜线。缺省设置与 WITH ESCAPES ON 相同。

    WITH ESCAPES OFF 的用途之一是为了更简便地执行引用了包含反斜杠的文件名的动态构造语句。

    在某些环境下,string-expression 中的转义序列在执行 EXECUTE IMMEDIATE 语句之前已被转换。例如,复合语句在执行之前进行语分析,转义序列会在分析过程中被转换,而不论 WITH ESCAPES 如何设置。在此类环境下,WITH ESCAPES OFF 可防止进一步的转换。例如:

    BEGIN
       DECLARE String1 LONG VARCHAR;
       DECLARE String2 LONG VARCHAR;
       EXECUTE IMMEDIATE
            'SET String1 = ''One backslash: \\\\ ''';
         EXECUTE IMMEDIATE WITH ESCAPES OFF
            'SET String2 = ''Two backslashes: \\\\ ''';
       SELECT String1, String2
    END

  • WITH RESULT SET 子句   可以通过指定 WITH RESULT SET ON 让 EXECUTE IMMEDIATE 语句返回结果集。使用该子句,包含过程被标记为返回结果集。如果未包括此子句,在该语句生成结果集的情况下,调用该过程时将报告一个错误。

    注意

    缺省选项为 WITH RESULT SET OFF,表示语句执行时不产生结果集。

注释

EXECUTE 语句扩展了可以从过程和触发器内执行的语句的范围。它使您可以执行动态预准备语句,比如用传递到过程中的参数构造的语句。

此语句中的字符串必须用单引号括起来,并且此语句必须位于一行上。

EXECUTE IMMEDIATE 执行的语句只能引用全局变量。

在 Transact-SQL 存储过程和触发器的内部只能使用语法 2。

权限

无。此语句以过程所有者的权限执行,而不是以调用过程的用户的权限执行。

副作用

无。但是,如果此语句是副作用为自动提交的数据定义语句,则会提交。

有关在过程中使用 EXECUTE IMMEDIATE 语句的详细信息,请参见在过程中使用 EXECUTE IMMEDIATE 语句

另请参见
标准和兼容性
  • SQL/2003   核心 SQL 之外的 SQL/基础特性。

示例

以下过程创建一个表,其中表名作为过程的参数提供。EXECUTE IMMEDIATE 语句必须全部在一行上。

CREATE PROCEDURE CreateTableProc(
                  IN tablename char(30)
                  )
BEGIN
   EXECUTE IMMEDIATE
   'CREATE TABLE ' || tablename ||
   ' ( column1 INT PRIMARY KEY)'
END;

调用过程并创建名为 mytable 的表:

CALL CreateTableProc( 'mytable' );

有关对返回结果集的查询使用 EXECUTE IMMEDIATE 的示例,请参见在过程中使用 EXECUTE IMMEDIATE 语句