sql >> Database >  >> RDS >> Oracle

Meerdere rijen met volgorde invoegen in Oracle

De beperkingen op multitable-inzetstukken zijn onder meer:

  • U kunt in geen enkel deel van een insert-instructie voor meerdere tabellen een reeks specificeren. Een insert met meerdere tabellen wordt beschouwd als een enkele SQL-instructie. Daarom genereert de eerste verwijzing naar NEXTVAL het volgende getal, en alle volgende verwijzingen in de instructie retourneren hetzelfde getal.

Dat is niet helemaal waar - u kunt een reeks gebruiken, deze krijgt alleen altijd dezelfde waarde, dus het kan handig zijn om in één keer bovenliggende en onderliggende records te maken door naar dezelfde reeks te verwijzen.

Als u insert all wilt blijven gebruiken je zou werk daar omheen door een niet-deterministische functie te gebruiken die de reekswaarde krijgt:

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              

Maar dat is een beetje onhandig. U bent waarschijnlijk beter af met het gebruik van individuele insert-statements - het gebruik van een multitable-insert in een enkele tabel levert u toch niet echt veel op - of een trigger om de unieke kolom uit de reeks in te stellen, of een CTE/inline-weergave om de waarden te genereren om in te voegen.



  1. Parametersnuiven, insluiten en de RECOMPILE-opties

  2. Retourneer het aantal rijen dat wordt beïnvloed door UPDATE-instructies

  3. Resultaten van een opgeslagen procedure invoegen in een tijdelijke tabel

  4. Geldige tijdreeksindelingen voor SQLite-datum-/tijdfuncties