小编典典

按顺序插入两个Oracle表

sql

我在Oracle中有两个表,作业和参考。

我想在两个表中插入一条新记录,并使用从序列中生成的键。就像是:

insert into (
select j.jobid, j.fileid, j.jobname, r.reffileid 
from job j
inner join reference r on j.jobid=r.jobid)
values (jobidsequence.nextval, 4660, 'name', 4391);

当然,这导致:

ORA-01776: cannot modify more than one base table through a join view

有没有不使用PL / SQL的方法?我非常喜欢仅使用SQL来做到这一点。


阅读 173

收藏
2021-04-28

共1个答案

小编典典

您可以为此使用insertall多表插入语法的副作用:

insert all
into job (jobid, fileid, jobname)
values (jobidsequence.nextval, fileid, jobname)
into reference (jobid, reffileid)
values (jobidsequence.nextval, reffileid)
select  4660 as fileid, 'name' as jobname, 4391 as reffileid
from dual;

2 rows inserted.

select * from job;

     JOBID     FILEID JOBNAME  
---------- ---------- ----------
        42       4660 name

select * from reference;

     JOBID  REFFILEID
---------- ----------
        42       4391

SQL小提琴

从限制:

您不能在多表插入语句的任何部分中指定序列。多表插入被视为单个SQL语句。因此,对NEXTVAL的第一个引用将生成下一个数字,并且该语句中的所有后续引用都返回相同的数字。

显然,我在values子句中使用了一个序列,因此第一句话似乎不太准确。但您不能在select零件中使用它。(我不确定100%是否可以values在所有版本中使用它,但是该文档在任何情况下都存在误导性,并且自相矛盾)。

因此,我利用了这样一个事实,因为它是一条语句,所以两个引用都nextval获得了相同的数字(如第三个句子所说),因此在两个表中都使用了相同的序列值。

2021-04-28