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');
War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top