Ograniczenia dotyczące wstawek wielostolikowych obejmują:
- Nie można określić sekwencji w żadnej części wielotabelowej instrukcji INSERT. Wstawianie wielu tabel jest traktowane jako pojedyncza instrukcja SQL. Dlatego pierwsze odwołanie do NEXTVAL generuje następną liczbę, a wszystkie kolejne odwołania w instrukcji zwracają tę samą liczbę.
To nie do końca prawda — możesz użyć sekwencji, po prostu zawsze otrzymuje tę samą wartość, więc przydatne może być tworzenie rekordów nadrzędnych i podrzędnych za jednym razem, odwołując się do tej samej sekwencji.
Jeśli chcesz nadal używać insert all
mogłeś obejdź to, używając niedeterministycznej funkcji, która pobiera wartość sekwencji:
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 trochę niezręczne. Prawdopodobnie lepiej będzie, jeśli użyjesz indywidualnych instrukcji wstawiania — użycie wielotabelowego wstawiania do pojedynczej tabeli i tak nie daje wiele korzyści — lub wyzwalacza do ustawiania unikalnej kolumny z sekwencji lub widoku CTE/wbudowanego do generowania wartości do wstawienia.