首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >执行“`EXECUTE立即”Oracle语句出错

执行“`EXECUTE立即”Oracle语句出错
EN

Stack Overflow用户
提问于 2015-07-17 11:00:53
回答 3查看 3.2K关注 0票数 0

我是甲骨文的NewBie。当我执行以下语句时

代码语言:javascript
代码运行次数:0
运行
复制
BEGIN
 EXECUTE IMMEDIATE  'SELECT * FROM DUAL;';
END;
 /

我得到了错误作为

从行开始:2在命令-开始立即执行‘选择*从双重;结束;错误报告-或- 00911 :无效字符ORA-06512:在第2行00911。00000 -“无效字符”*原因:标识符不得以字母和数字以外的任何ASCII字符开头。在第一个字符之后也允许使用$#_。双引号所括的标识符可以包含除双引号以外的任何字符。替代引号(q‘#.#’)不能使用空格、制表符或回车作为分隔符。对于所有其他上下文,请参阅SQL语言参考手册。*行动:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-17 11:16:26

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

来自文档

代码语言:javascript
代码运行次数:0
运行
复制
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块中,所以不需要;分隔符。

在PL/SQL中使用立即执行语句有一个更好的解释

在动态字符串中构造单个SQL语句时,不要在引号的末尾包含分号(;)。在构造PL/SQL匿名块时,在每个PL/SQL语句的末尾和匿名块的末尾包含分号;在字符串文本结束之前将有一个分号,在结束单引号之后会有一个分号。

票数 4
EN

Stack Overflow用户

发布于 2015-07-17 11:17:29

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

代码语言:javascript
代码运行次数:0
运行
复制
BEGIN
 EXECUTE IMMEDIATE  'SELECT * FROM DUAL';
END;
 /

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

不带select子句的EXECUTE IMMEDIATE中的into语句将被忽略。

代码语言:javascript
代码运行次数:0
运行
复制
Declare
    v_variable number;--some variable
BEGIN
     EXECUTE IMMEDIATE  'SELECT clmn FROM tbl' into v_variable;
END;
/
票数 4
EN

Stack Overflow用户

发布于 2015-07-17 11:07:53

只需从动态string.Try中删除“;”如下:

代码语言:javascript
代码运行次数:0
运行
复制
BEGIN 
   EXECUTE IMMEDIATE 'SELECT * FROM DUAL'; 
END; 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31474308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档