문제

저는 Oracle 9 데이터베이스에 다중 행 삽입을 수행하는 좋은 방법을 찾고 있습니다.다음은 MySQL에서 작동하지만 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');
도움이 되었습니까?

해결책

이는 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

여기서 기억해야 할 점은 from dual 성명.

(원천)

다른 팁

Oracle에서는 col1, col2 및 col3 열이 있는 테이블 t에 여러 행을 삽입하려면 다음 구문을 사용할 수 있습니다.

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;

SQL*Loader를 사용하십시오.약간의 설정이 필요하지만 이것이 일회성이 아니라면 그만한 가치가 있습니다.

테이블 생성

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

CSV 만들기

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

로더 제어 파일 생성

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% 

SQL*Loader 명령 실행

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

삽입 확인

SQL> select * from ldr_test;

        ID DESCRIPTION
---------- --------------------
         1 Apple
         2 Orange
         3 Pear

SQL>

SQL*Loader에는 많은 옵션이 있으며 거의 ​​모든 텍스트 파일을 입력으로 사용할 수 있습니다.원하는 경우 제어 파일에 데이터를 인라인할 수도 있습니다.

좀 더 자세한 내용이 담긴 페이지입니다 -> SQL*로더

이 작업을 수행해야 할 때마다 다음과 같은 로컬 프로시저를 사용하여 간단한 PL/SQL 블록을 만듭니다.

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;
/

이미 다른 테이블에 삽입하려는 값이 있는 경우 select 문에서 삽입할 수 있습니다.

INSERT INTO a_table (column_a, column_b) SELECT column_a, column_b FROM b_table;

그렇지 않으면 여러 개의 단일 행 삽입 문을 나열하고 여러 쿼리를 대량으로 제출하여 Oracle과 MySQL 모두에서 작동하는 작업에 대한 시간을 절약할 수 있습니다.

@에스포의 솔루션은 데이터가 아직 테이블에 없는 경우 Oracle과 MySQL 모두에서 작동하는 좋은 솔루션이기도 합니다.

비효율적이긴 하지만 커서를 사용할 수도 있습니다.다음 stackoverflow 게시물에서는 커서 사용법에 대해 설명합니다.

oracle에서 커서를 사용하여 레코드를 삽입하고 업데이트합니다.

임의의 값을 삽입하려면 루프를 사용하여 삽입할 수 있습니다.

BEGIN 
    FOR x IN 1 .. 1000 LOOP
         INSERT INTO MULTI_INSERT_DEMO (ID, NAME)
         SELECT x, 'anyName' FROM dual;
    END LOOP;
END;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top