我是甲骨文的NewBie。当我执行以下语句时
BEGIN
EXECUTE IMMEDIATE 'SELECT * FROM DUAL;';
END;
/
我得到了错误作为
从行开始:2在命令-开始立即执行‘选择*从双重;结束;错误报告-或- 00911 :无效字符ORA-06512:在第2行00911。00000 -“无效字符”*原因:标识符不得以字母和数字以外的任何ASCII字符开头。在第一个字符之后也允许使用$#_。双引号所括的标识符可以包含除双引号以外的任何字符。替代引号(q‘#.#’)不能使用空格、制表符或回车作为分隔符。对于所有其他上下文,请参阅SQL语言参考手册。*行动:
发布于 2015-07-17 03:16:26
问题是;
字符在'SELECT * FROM DUAL;'
中。
来自文档
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语句的末尾和匿名块的末尾包含分号;在字符串文本结束之前将有一个分号,在结束单引号之后会有一个分号。
发布于 2015-07-17 03:17:29
您可以通过从动态查询中删除;
来修复错误。
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;
/
发布于 2015-07-17 03:07:53
只需从动态string.Try中删除“;”如下:
BEGIN
EXECUTE IMMEDIATE 'SELECT * FROM DUAL';
END;
https://stackoverflow.com/questions/31474308
复制