执行 `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;'
,不需要给begin
和end
;你发现那句话有什么问题吗?
@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动态执行sql及异常信息打印