Best way to do multi-row insert in Oracle?

前端 未结 9 1390
悲&欢浪女
悲&欢浪女 2020-11-22 02:52

I\'m looking for a good way to perform multi-row inserts into an Oracle 9 database. The following works in MySQL but doesn\'t seem to be supported in Oracle.



        
相关标签:
9条回答
  • 2020-11-22 03:22

    In my case, I was able to use a simple insert statement to bulk insert many rows into TABLE_A using just one column from TABLE_B and getting the other data elsewhere (sequence and a hardcoded value) :

    INSERT INTO table_a (
        id,
        column_a,
        column_b
    )
        SELECT
            table_a_seq.NEXTVAL,
            b.name,
            123
        FROM
            table_b b;
    

    Result:

    ID: NAME: CODE:
    1, JOHN, 123
    2, SAM, 123
    3, JESS, 123
    

    etc

    0 讨论(0)
  • 2020-11-22 03:25

    Use SQL*Loader. It takes a little setting up, but if this isn't a one off, its worth it.

    Create Table

    SQL> create table ldr_test (id number(10) primary key, description varchar2(20));
    Table created.
    SQL>
    

    Create CSV

    oracle-2% cat ldr_test.csv
    1,Apple
    2,Orange
    3,Pear
    oracle-2% 
    

    Create Loader Control File

    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% 
    

    Run SQL*Loader command

    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
    

    Confirm insert

    SQL> select * from ldr_test;
    
            ID DESCRIPTION
    ---------- --------------------
             1 Apple
             2 Orange
             3 Pear
    
    SQL>
    

    SQL*Loader has alot of options, and can take pretty much any text file as its input. You can even inline the data in your control file if you want.

    Here is a page with some more details -> SQL*Loader

    0 讨论(0)
  • 2020-11-22 03:27

    Whenever I need to do this I build a simple PL/SQL block with a local procedure like this:

    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;
    /
    
    0 讨论(0)
  • 2020-11-22 03:35

    In Oracle, to insert multiple rows into table t with columns col1, col2 and col3 you can use the following syntax:

    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;
    
    0 讨论(0)
  • 2020-11-22 03:39

    Cursors may also be used, although it is inefficient. The following stackoverflow post discusses the usage of cursors :

    INSERT and UPDATE a record using cursors in oracle

    0 讨论(0)
  • 2020-11-22 03:39

    Here is a very useful step by step guideline for insert multi rows in Oracle:

    https://livesql.oracle.com/apex/livesql/file/content_BM1LJQ87M5CNIOKPOWPV6ZGR3.html

    The last step:

    INSERT ALL
    /* Everyone is a person, so insert all rows into people */
    WHEN 1=1 THEN
    INTO people (person_id, given_name, family_name, title)
    VALUES (id, given_name, family_name, title)
    /* Only people with an admission date are patients */
    WHEN admission_date IS NOT NULL THEN
    INTO patients (patient_id, last_admission_date)
    VALUES (id, admission_date)
    /* Only people with a hired date are staff */
    WHEN hired_date IS NOT NULL THEN
    INTO staff (staff_id, hired_date)
    VALUES (id, hired_date)
      WITH names AS (
        SELECT 4 id, 'Ruth' given_name, 'Fox' family_name, 'Mrs' title,
               NULL hired_date, DATE'2009-12-31' admission_date
        FROM   dual UNION ALL
        SELECT 5 id, 'Isabelle' given_name, 'Squirrel' family_name, 'Miss' title ,
               NULL hired_date, DATE'2014-01-01' admission_date
        FROM   dual UNION ALL
        SELECT 6 id, 'Justin' given_name, 'Frog' family_name, 'Master' title,
               NULL hired_date, DATE'2015-04-22' admission_date
        FROM   dual UNION ALL
        SELECT 7 id, 'Lisa' given_name, 'Owl' family_name, 'Dr' title,
               DATE'2015-01-01' hired_date, NULL admission_date
        FROM   dual
      )
      SELECT * FROM names
    
    0 讨论(0)
提交回复
热议问题