我是Oracle的NewBie。当我执行以下声明
时BEGIN
EXECUTE IMMEDIATE 'SELECT * FROM DUAL;';
END;
/
我收到错误
从命令行中的第2行开始出错 - BEGIN EXECUTE IMMEDIATE 'SELECT * FROM DUAL;';结束;
错误报告 - ORA-00911:无效 字符ORA-06512:第2行 00911. 00000 - “无效字符” *原因:标识符可能不以除以外的任何ASCII字符开头 字母和数字。第一个之后也允许$#_ 字符。双引号括起来的标识符可能包含 除了双引号之外的任何字符。替代报价 (q'#...#')不能使用空格,制表符或回车符 分隔符。对于所有其他上下文,请参阅SQL语言 参考手册。 *操作:
答案 0 :(得分:4)
问题是;
中的'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块中,否则它不会接受多个语句,因此不期望;
分隔符。
Using the EXECUTE IMMEDIATE Statement in PL/SQL有更好的解释:
在动态字符串中构造单个SQL语句时,请不要这样做 在引号内的末尾加一个分号(;)。什么时候 构造一个PL / SQL匿名块,包括分号 每个PL / SQL语句的结尾和匿名块的末尾; 在字符串结束之前会有一个分号 字面值,另一个在结束单引号后面。
答案 1 :(得分:4)
您可以通过从动态查询中删除;
来修复错误。
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;
/
答案 2 :(得分:3)
只需删除';'来自dymanic字符串。试试这个:
BEGIN
EXECUTE IMMEDIATE 'SELECT * FROM DUAL';
END;