Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Einfügen mehrerer Zeilen mit Sequenz in Oracle

Zu den Einschränkungen für Multitable-Inserts gehören:

  • Sie können in keinem Teil einer Einfügeanweisung für mehrere Tabellen eine Sequenz angeben. Eine Einfügung mehrerer Tabellen wird als einzelne SQL-Anweisung betrachtet. Daher generiert der erste Verweis auf NEXTVAL die nächste Zahl, und alle nachfolgenden Verweise in der Anweisung geben dieselbe Zahl zurück.

Das ist nicht ganz richtig - Sie können eine Sequenz verwenden, sie erhält nur immer denselben Wert, daher kann es nützlich sein, über- und untergeordnete Datensätze auf einmal zu erstellen, indem Sie auf dieselbe Sequenz verweisen.

Wenn Sie weiterhin insert all verwenden möchten Sie könnten Umgehen Sie das, indem Sie eine nicht deterministische Funktion verwenden, die den Sequenzwert erhält:

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              

Aber das ist etwas umständlich. Sie sind wahrscheinlich besser dran, wenn Sie einzelne Einfügeanweisungen verwenden - die Verwendung einer Einfügung mehrerer Tabellen in eine einzelne Tabelle bringt Ihnen sowieso nicht viel - oder einen Trigger, um die eindeutige Spalte aus der Sequenz festzulegen, oder eine CTE/Inline-Ansicht, um die Werte zu generieren einfügen.