Der beste Weg, mehrzeilige Einfügungen in Oracle durchzuführen?
-
09-06-2019 - |
Frage
Ich suche nach einer guten Möglichkeit, mehrzeilige Einfügungen in eine Oracle 9-Datenbank durchzuführen.Folgendes funktioniert in MySQL, scheint aber in Oracle nicht unterstützt zu werden.
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');
Lösung
Das funktioniert in Oracle:
insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual
Hier sollten Sie sich daran erinnern, die zu verwenden from dual
Stellungnahme.
(Quelle)
Andere Tipps
Um in Oracle mehrere Zeilen in Tabelle t mit den Spalten col1, col2 und col3 einzufügen, können Sie die folgende Syntax verwenden:
INSERT ALL
INTO t (col1, col2, col3) VALUES ('val1_1', 'val1_2', 'val1_3')
INTO t (col1, col2, col3) VALUES ('val2_1', 'val2_2', 'val2_3')
INTO t (col1, col2, col3) VALUES ('val3_1', 'val3_2', 'val3_3')
.
.
.
SELECT 1 FROM DUAL;
Verwenden Sie den SQL*Loader.Die Einrichtung erfordert ein wenig, aber wenn dies kein Einzelstück ist, lohnt es sich.
Tabelle erstellen
SQL> create table ldr_test (id number(10) primary key, description varchar2(20));
Table created.
SQL>
CSV erstellen
oracle-2% cat ldr_test.csv
1,Apple
2,Orange
3,Pear
oracle-2%
Erstellen Sie eine Loader-Steuerdatei
oracle-2% cat ldr_test.ctl
load data
infile 'ldr_test.csv'
into table ldr_test
fields terminated by "," optionally enclosed by '"'
( id, description )
oracle-2%
Führen Sie den SQL*Loader-Befehl aus
oracle-2% sqlldr <username> control=ldr_test.ctl
Password:
SQL*Loader: Release 9.2.0.5.0 - Production on Wed Sep 3 12:26:46 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Commit point reached - logical record count 3
Einfügen bestätigen
SQL> select * from ldr_test;
ID DESCRIPTION
---------- --------------------
1 Apple
2 Orange
3 Pear
SQL>
SQL*Loader verfügt über viele Optionen und kann praktisch jede Textdatei als Eingabe verwenden.Wenn Sie möchten, können Sie die Daten sogar in Ihre Steuerdatei integrieren.
Hier ist eine Seite mit einigen weiteren Details -> SQL*Loader
Wann immer ich dies tun muss, erstelle ich einen einfachen PL/SQL-Block mit einer lokalen Prozedur wie dieser:
declare
procedure ins
is
(p_exch_wh_key INTEGER,
p_exch_nat_key INTEGER,
p_exch_date DATE, exch_rate NUMBER,
p_from_curcy_cd VARCHAR2,
p_to_curcy_cd VARCHAR2,
p_exch_eff_date DATE,
p_exch_eff_end_date DATE,
p_exch_last_updated_date DATE);
begin
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
(p_exch_wh_key,
p_exch_nat_key,
p_exch_date, exch_rate,
p_from_curcy_cd,
p_to_curcy_cd,
p_exch_eff_date,
p_exch_eff_end_date,
p_exch_last_updated_date);
end;
begin
ins (1, 1, '28-AUG-2008', 109.49, 'USD', 'JPY', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
ins (2, 1, '28-AUG-2008', .54, 'USD', 'GBP', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
ins (3, 1, '28-AUG-2008', 1.05, 'USD', 'CAD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
ins (4, 1, '28-AUG-2008', .68, 'USD', 'EUR', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
ins (5, 1, '28-AUG-2008', 1.16, 'USD', 'AUD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
ins (6, 1, '28-AUG-2008', 7.81, 'USD', 'HKD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008');
end;
/
Wenn Sie die Werte, die Sie einfügen möchten, bereits in einer anderen Tabelle haben, können Sie sie über eine Select-Anweisung einfügen.
INSERT INTO a_table (column_a, column_b) SELECT column_a, column_b FROM b_table;
Andernfalls können Sie eine Reihe von Anweisungen zum Einfügen einzelner Zeilen auflisten und mehrere Abfragen in großen Mengen senden, um Zeit für etwas zu sparen, das sowohl in Oracle als auch in MySQL funktioniert.
@EspoDie Lösung von ist auch eine gute Lösung, die sowohl in Oracle als auch in MySQL funktioniert, wenn sich Ihre Daten nicht bereits in einer Tabelle befinden.
Es können auch Cursor verwendet werden, dies ist jedoch ineffizient.Im folgenden Stackoverflow-Beitrag wird die Verwendung von Cursorn erläutert:
INSERT und AKTUALISIEREN eines Datensatzes mithilfe von Cursorn in Oracle
Sie können mithilfe einer Schleife einfügen, wenn Sie einige Zufallswerte einfügen möchten.
BEGIN
FOR x IN 1 .. 1000 LOOP
INSERT INTO MULTI_INSERT_DEMO (ID, NAME)
SELECT x, 'anyName' FROM dual;
END LOOP;
END;