Szukam dobrego sposobu wykonywania wstawień wielorzędowych w bazie danych Oracle 9. Poniższe działa w MySQL, ale nie wydaje się być obsługiwane w Oracle.
INSERT INTO TMP_DIM_EXCH_RT
(EXCH_WH_KEY,
EXCH_NAT_KEY,
EXCH_DATE, EXCH_RATE,
FROM_CURCY_CD,
TO_CURCY_CD,
EXCH_EFF_DATE,
EXCH_EFF_END_DATE,
EXCH_LAST_UPDATED_DATE)
VALUES
(1, 1, '28-AUG-2008', 109.49, 'USD', 'JPY', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(2, 1, '28-AUG-2008', .54, 'USD', 'GBP', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(3, 1, '28-AUG-2008', 1.05, 'USD', 'CAD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(4, 1, '28-AUG-2008', .68, 'USD', 'EUR', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(5, 1, '28-AUG-2008', 1.16, 'USD', 'AUD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(6, 1, '28-AUG-2008', 7.81, 'USD', 'HKD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008');
sequnce.nextval
jak to jest zakazaneunion
odselect
. Zamiast tego możemy iść zINSERT ALL
.W Oracle, aby wstawić wiele wierszy do tabeli t za pomocą kolumn col1, col2 i col3, można użyć następującej składni:
źródło
SELECT 1 FROM DUAL
robi.INSERT ALL
wymagaSELECT
podzapytania. Aby obejść ten problem,SELECT 1 FROM DUAL
służy do podania jednego wiersza fałszywych danych.Użyj programu ładującego SQL *. To wymaga trochę konfiguracji, ale jeśli nie jest to jednorazowe, warto.
Utwórz tabelę
Utwórz CSV
Utwórz plik kontrolny modułu ładującego
Uruchom komendę SQL * Loader
Potwierdź wstawienie
Program SQL * Loader ma wiele opcji i może przyjąć prawie dowolny plik tekstowy jako dane wejściowe. Możesz nawet wstawić dane do pliku kontrolnego, jeśli chcesz.
Oto strona z kilkoma szczegółami -> Moduł ładujący SQL *
źródło
fruit_id "fruit_seq.nextval"
W definicji kolumnyIlekroć muszę to zrobić, buduję prosty blok PL / SQL za pomocą lokalnej procedury takiej jak ta:
źródło
Jeśli masz już wartości, które chcesz wstawić do innej tabeli, możesz wstawić z instrukcji select.
W przeciwnym razie możesz wymienić kilka instrukcji wstawiania w jednym wierszu i przesłać zbiorczo kilka zapytań, aby zaoszczędzić czas na coś, co działa zarówno w Oracle, jak i MySQL.
Rozwiązanie @Espo jest również dobrym rozwiązaniem, które będzie działać zarówno w Oracle, jak i MySQL, jeśli danych nie ma jeszcze w tabeli.
źródło
możesz wstawić za pomocą pętli, jeśli chcesz wstawić losowe wartości.
źródło
Można również użyć kursorów, chociaż jest to nieefektywne. Poniższy post stackoverflow omawia użycie kursorów:
WSTAW i AKTUALIZUJ rekord za pomocą kursorów w Oracle
źródło
Oto bardzo przydatna wskazówka krok po kroku dotycząca wstawiania wielu wierszy w Oracle:
https://livesql.oracle.com/apex/livesql/file/content_BM1LJQ87M5CNIOKPOWPV6ZGR3.html
Ostatni krok:
źródło
W moim przypadku byłem w stanie użyć prostej instrukcji insert, aby zbiorczo wstawić wiele wierszy do TABELI_A, używając tylko jednej kolumny z TABELI_B i uzyskać inne dane w innym miejscu (sekwencja i wartość zakodowana na stałe):
Wynik:
itp
źródło