ORA-00926:在执行立即操作中使用插入表作为select * from时缺少VALUES关键字

时间:2019-05-27 17:34:50

标签: sql oracle plsql dynamic-sql

我有两个表emp1和emp2,我想通过使用emp1和emp2创建emp3,我需要做plsql来使代码自动化

我尝试编码但是得到了

  

ORA-00926:第9行缺少VALUES关键字ORA-06512:

declare
v1  varchar2(2000);
begin 
for i in 1..2
loop
v1:='insert into emp3 as select * from emp'||i||'where 1=1;';
execute immediate v1;
end loop;
end;

ORA-00926:缺少VALUES关键字 ORA-06512:在第9行。 我有一个更大的where条件,但是我只使用了'where 1 = 1'和更大的表,但是我需要逻辑来表示感谢!

2 个答案:

答案 0 :(得分:2)

首先,我认为没有as

第二,如果您打印出了sql,问题可能很明显。

您可以尝试以下方法:

insert into emp3 
    select * from emp'||i||' where 1=1;'

答案 1 :(得分:0)

动态SQL很难,因为它将编译错误转换为运行时错误。例如,在这种情况下,您错过了where前的前导空格:

v1:='insert into emp3 as select * from emp'||i||'where 1=1;';
------------------------------------------------^ 

这意味着您的代码尝试执行的实际SQL是

insert into emp3 as select * from emp1where 1=1;

这是无效的SQL,这就是为什么您会收到错误消息。

另一个错误是我们不需要在字符串末尾包含终止字符。因此正确的代码应该是

v1:='insert into emp3 as select * from emp'||i||' where 1=1';

将来,您应该使用包含代码来显示动态语句。您可以通过在执行语句之前将语句分配给变量来完成任务。因此,您只需要记录它,就可以简单

dbms_output.put_line(v1);

在组装的字符串中发现bloomers比尝试解释样板和变量的串联要容易得多。