Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Inserindo várias linhas com sequência no Oracle


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.