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.