9

ORA-00947: not enough values从下面的查询中得到:

insert into tableb
(colA, colb, colc, cold)
select
(select max(rec_no)+1 from tableb)
F2,
F3,
F4
from tablea;

有人可以指出正确的方法来包含插入/选择语句的子查询吗?

谢谢

4

2 回答 2

15

你只是少了一个逗号。事实上,Oracle 认为F2是您的子选择的名称。

insert into tableb
(colA, colb, colc, cold)
select
(select max(rec_no)+1 from tableb) ,   -- comma here
F2,
F3,
F4
from tablea;
于 2012-12-12T11:44:02.103 回答
7

生成唯一 ID 的唯一可靠、快速且可扩展的方法是使用序列。

“解决方案”不起作用的原因max()是一个事务不会看到另一个事务未提交的更改。因此,两个并发事务可以使用相同的值结束,max()这反过来会生成重复的 id 值。

要在您的情况下从序列创建值,您显然需要首先创建一个序列:

create sequence seq_b;

然后在您的选择语句中使用该序列:

insert into tableb
  (colA, colb, colc, cold)
select seq_b.nextval,
       F2,
       F3,
       F4
from tablea;
于 2012-12-12T12:05:28.747 回答