我在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来做到这一点。
您可以为此使用insertall多表插入语法的副作用:
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在所有版本中使用它,但是该文档在任何情况下都存在误导性,并且自相矛盾)。
values
select
因此,我利用了这样一个事实,因为它是一条语句,所以两个引用都nextval获得了相同的数字(如第三个句子所说),因此在两个表中都使用了相同的序列值。
nextval