As restrições em inserções de várias tabelas incluem:
- Você não pode especificar uma sequência em nenhuma parte de uma instrução de inserção multitabela. Uma inserção multitabela é considerada uma única instrução SQL. Portanto, a primeira referência a NEXTVAL gera o próximo número e todas as referências subsequentes na instrução retornam o mesmo número.
Isso não é bem verdade - você pode usar uma sequência, ela sempre obtém o mesmo valor, então pode ser útil criar registros pai e filho de uma só vez, referindo-se à mesma sequência.
Se você quiser continuar usando
insert all
você poderia contorne isso usando uma função não determinística que obtém o valor da sequência: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
Mas isso é um pouco estranho. Você provavelmente está melhor usando instruções de inserção individuais - usar uma inserção de várias tabelas em uma única tabela não está realmente ganhando muito de qualquer maneira - ou um gatilho para definir a coluna exclusiva da sequência ou uma visualização CTE/inline para gerar os valores inserir.