对多表插入的限制包括:
- 您不能在多表插入语句的任何部分指定序列。多表插入被视为单个 SQL 语句。因此,对 NEXTVAL 的第一次引用会生成下一个数字,并且语句中的所有后续引用都返回相同的数字。
这并不完全正确 - 您可以使用一个序列,它总是获得相同的值,因此通过引用相同的序列一次性创建父记录和子记录可能很有用。
如果您想继续使用insert all
,您可以通过使用获取序列值的非确定性函数来解决这个问题:
CREATE FUNCTION get_seq RETURN NUMBER IS
BEGIN
RETURN postal_code_seq.nextval;
END;
/
INSERT ALL
INTO POSTAL_CODE( postal_code,description)
VALUES(get_seq,'Coimbatore')
INTO POSTAL_CODE (postal_code,description)
VALUES(get_seq,'Mumbai') SELECT * FROM DUAL;
2 rows inserted.
SELECT * FROM postal_code;
POSTAL_CODE DESCRIPTION
--------------------------------------- --------------------
1 Coimbatore
2 Mumbai
但这有点尴尬。您可能最好使用单独的插入语句 - 使用多表插入到单个表中并没有真正让您获得太多 - 或者从序列中设置唯一列的触发器,或者 CTE/内联视图来生成值插入。