插入带有序列的两个oracle表

Ric*_*d A 3 sql oracle

我在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);
Run Code Online (Sandbox Code Playgroud)

当然,这会导致:

ORA-01776: cannot modify more than one base table through a join view
Run Code Online (Sandbox Code Playgroud)

有没有办法在不使用PL/SQL的情况下执行此操作?我非常喜欢只使用SQL来做到这一点.

Ale*_*ole 11

您可以使用insert all多表插入语法的副作用:

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 
Run Code Online (Sandbox Code Playgroud)

SQL小提琴.

从限制:

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

很明显我在values条款中使用了一个序列,所以第一句似乎不太准确; 但你不能在select零件中使用它.(我不是100%确定它是否可以values在所有版本中使用,但文档在任何情况下都有点误导,并且与自身相矛盾).

所以我利用了这样一个事实,因为它是一个单一的语句,两个引用nextval得到相同的数字,就像第三个句子所说的那样,因此在两个表中使用相同的序列值.