执行 `EXECUTE IMMEDIATE` Oracle 语句出现错误

Posted

技术标签:

【中文标题】执行 `EXECUTE IMMEDIATE` Oracle 语句出现错误【英文标题】:executing `EXECUTE IMMEDIATE ` Oracle Statement Getting Error 【发布时间】:2015-10-07 02:02:59 【问题描述】:

我是 Oracle 的新手。当我执行以下语句时

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

我出错了

从第 2 行开始的错误命令 - BEGIN EXECUTE IMMEDIATE '从双重选择 *;';结尾;

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

【问题讨论】:

您能告诉我们您通过该声明要达到的目标吗?如果你想看到一些输出,你可以简单地给select * from dual 试试这个:BEGIN EXECUTE IMMEDIATE 'SELECT * FROM DUAL';结尾;只需删除';'来自动态字符串。 @Crazy2crack 我正在尝试从这里创建一个动态查询...oracle-base.com/articles/8i/native-dynamic-sql @Ganesh_Devlekar - 那篇文章中的截断示例是错误的,它也不应该在动态字符串中包含分号。单行查询示例没问题,注意它有一个into 子句。查询的数据必须去某个地方。 【参考方案1】:

问题是'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 语句的结尾和匿名块的结尾; 在字符串结尾之前会有一个分号 字面量,另一个跟在单引号后面。

【讨论】:

或者换句话说,SQL语言没有分号。【参考方案2】:

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

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

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

EXECUTE IMMEDIATE 中没有into 子句的select 语句将被忽略。

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

【讨论】:

【参考方案3】:

只需删除 ';'从动态字符串。试试这个:

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

【讨论】:

但它没有给出输出表。我需要为此提供变量吗?? 你可以简单地使用'Select * from dual;',不需要给beginend;你发现那句话有什么问题吗? @Crazy2crack Select * from dual; 给了我一行但BEGIN EXECUTE IMMEDIATE 'SELECT * FROM DUAL'; END; 不会 @Ganesh_Devlekar - the dynamic query isn't executed if you don't have an into clause。 Praveen 的回答表明了这一点。

以上是关于执行 `EXECUTE IMMEDIATE` Oracle 语句出现错误的主要内容,如果未能解决你的问题,请参考以下文章

Oracle EXECUTE IMMEDIATE 未执行存储过程中的预期操作

PL/SQL里 execute immediate的用法 谁给解释下

ORACLE EXECUTE IMMEDIATE 小结

oracle EXECUTE IMMEDIATE动态执行sql及异常信息打印

oracle EXECUTE IMMEDIATE动态执行sql及异常信息打印

Oracle中Execute Immediate用法