sql >> Databasteknik >  >> RDS >> Oracle

Infoga flera rader med sekvens i Oracle

Restriktionerna för inlägg med flera tabeller inkluderar:

  • Du kan inte ange en sekvens i någon del av en multitable insert-sats. En insättning med flera tabeller anses vara en enda SQL-sats. Därför genererar den första referensen till NEXTVAL nästa nummer, och alla efterföljande referenser i uttalandet returnerar samma nummer.

Det är inte riktigt sant - du kan använda en sekvens, den får bara alltid samma värde, så det kan vara användbart att skapa överordnade och underordnade poster på en gång genom att referera till samma sekvens.

Om du vill fortsätta använda insert all du kunde gå runt det genom att använda en icke-deterministisk funktion som får sekvensvärdet:

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              

Men det är lite besvärligt. Du är förmodligen bättre av att använda individuella infogningssatser - att använda en multitabellinfogning i en enda tabell ger dig inte så mycket ändå - eller en trigger för att ställa in den unika kolumnen från sekvensen, eller en CTE/inlinevy för att generera värdena att infoga.



  1. Ta bort alla poster utom den senaste?

  2. SqlConnection SqlCommand SqlDataReader ID Disposable

  3. Hur FROM_BASE64()-funktionen fungerar i MySQL

  4. MySQL High Availability Framework Explained – Del I:Introduktion