sql >> Databáze >  >> RDS >> Oracle

Vkládání více řádků se sekvencí v Oracle

Omezení pro vícetabulkové vložky zahrnují:

  • V žádné části příkazu insert nelze zadat sekvenci. Vložení více tabulek je považováno za jeden příkaz SQL. Proto první odkaz na NEXTVAL vygeneruje další číslo a všechny následující odkazy v příkazu vrátí stejné číslo.

To není tak docela pravda – můžete použít sekvenci, ale ta má vždy stejnou hodnotu, takže může být užitečné vytvořit nadřazené a podřízené záznamy najednou odkazem na stejnou sekvenci.

Pokud chcete nadále používat insert all můžete obejít to pomocí nedeterministické funkce, která získá sekvenční hodnotu:

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              

Ale to je trochu trapné. Pravděpodobně je lepší použít jednotlivé příkazy vložení - použití vícetabulkového vložení do jedné tabulky vám stejně moc nezíská - nebo spouštěč pro nastavení jedinečného sloupce ze sekvence nebo zobrazení CTE/inline pro generování hodnot vložit.



  1. Jak aplikovat funkci na každý prvek sloupce pole v Postgresu?

  2. Relační databáze

  3. C# volání oracle uložené funkce

  4. Existuje způsob, jak získat přístup k hodnotě předchozího řádku v příkazu SELECT?