【问题标题】:ORA-00926: missing VALUES keyword while using insert into table as select * from in execute immediateORA-00926: 使用 insert into table as select * from in 立即执行时缺少 VALUES 关键字
【发布时间】:2019-10-13 06:45:01
【问题描述】:

我有两个表 emp1 和 emp2 我想通过使用 emp1 和 emp2 创建 emp3 所有这些我需要执行 plsql 来自动化代码

我尝试过编码,但得到了

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

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' 和更大的表,但我需要这个逻辑,谢谢!

【问题讨论】:

    标签: sql oracle plsql dynamic-sql


    【解决方案1】:

    首先,我认为没有as

    其次,如果你把sql打印出来,问题可能就很明显了。

    你可以试试这个:

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

    【讨论】:

    • 声明 v1 varchar2(2000); begin for i in 1..2 loop v1:='insert into emp3 select * from emp'||i||'其中 1=1';立即执行 v1;结束循环;结尾;我编译了这个
    【解决方案2】:

    动态 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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多