执行`EXECUTE IMMEDIATE`Oracle语句获取错误

时间:2015-07-17 11:00:54

标签: oracle oracle11g oracle-sqldeveloper

我是Oracle的NewBie。当我执行以下声明

BEGIN
 EXECUTE IMMEDIATE  'SELECT * FROM DUAL;';
END;
 /

我收到错误

  

从命令行中的第2行开始出错 - BEGIN EXECUTE IMMEDIATE   'SELECT * FROM DUAL;';结束;

     

错误报告 - ORA-00911:无效   字符ORA-06512:第2行   00911. 00000 - “无效字符”   *原因:标识符可能不以除以外的任何ASCII字符开头              字母和数字。第一个之后也允许$#_              字符。双引号括起来的标识符可能包含              除了双引号之外的任何字符。替代报价              (q'#...#')不能使用空格,制表符或回车符              分隔符。对于所有其他上下文,请参阅SQL语言              参考手册。   *操作:

3 个答案:

答案 0 :(得分:4)

问题是;中的'SELECT * FROM DUAL;'字符。

来自documentation

execute_immediate_statement ::=
EXECUTE_IMMEDIATE dynamic_string
 { 
    INTO { define_variable [, define_variable ...] | record_name } 
  | BULK COLLECT INTO { collection_name [, collection_name ...] | :host_array_name } 
 }
   [ USING [ IN | OUT | IN OUT ] bind_argument
   [, [ IN | OUT | IN OUT ] bind_argument] ... ] [ returning_clause ] ;

...其中dynamic_string是(强调我的):

  

表示单个SQL的字符串文字,变量或表达式   声明 PL / SQL块。它必须是CHAR或VARCHAR2类型,而不是   NCHAR或NVARCHAR2。

由于除非将它们包含在单个PL / SQL块中,否则它不会接受多个语句,因此不期望;分隔符。

Using the EXECUTE IMMEDIATE Statement in PL/SQL有更好的解释:

  

在动态字符串中构造单个SQL语句时,请不要这样做   在引号内的末尾加一个分号(;)。什么时候   构造一个PL / SQL匿名块,包括分号   每个PL / SQL语句的结尾和匿名块的末尾;   在字符串结束之前会有一个分号   字面值,另一个在结束单引号后面。

答案 1 :(得分:4)

您可以通过从动态查询中删除;来修复错误。

BEGIN
 EXECUTE IMMEDIATE  'SELECT * FROM DUAL';
END;
 /

此查询不会返回任何结果;

select中没有EXECUTE IMMEDIATE子句的

into语句将被忽略。

Declare
    v_variable number;--some variable
BEGIN
     EXECUTE IMMEDIATE  'SELECT clmn FROM tbl' into v_variable;
END;
/

答案 2 :(得分:3)

只需删除';'来自dymanic字符串。试试这个:

BEGIN 
   EXECUTE IMMEDIATE 'SELECT * FROM DUAL'; 
END;