我在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语句.因此,对NEXTVAL的第一个引用生成下一个数字,并且语句中的所有后续引用返回相同的数字.
很明显我在values条款中使用了一个序列,所以第一句似乎不太准确; 但你不能在select零件中使用它.(我不是100%确定它是否可以values在所有版本中使用,但文档在任何情况下都有点误导,并且与自身相矛盾).
所以我利用了这样一个事实,因为它是一个单一的语句,两个引用nextval得到相同的数字,就像第三个句子所说的那样,因此在两个表中使用相同的序列值.
| 归档时间: |
|
| 查看次数: |
7802 次 |
| 最近记录: |