【问题标题】:executing `EXECUTE IMMEDIATE ` Oracle Statement Getting Error执行 `EXECUTE IMMEDIATE` Oracle 语句出现错误
【发布时间】: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 子句。查询的数据必须去某个地方。

标签: oracle oracle11g oracle-sqldeveloper


【解决方案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 的回答表明了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2021-04-15
    • 2019-03-14
    • 2019-06-26
    • 2011-07-12
    • 2019-10-19
    相关资源
    最近更新 更多