Oracle에서 다중 행 삽입을 수행하는 가장 좋은 방법은 무엇입니까?
-
09-06-2019 - |
문제
저는 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 게시물에서는 커서 사용법에 대해 설명합니다.
임의의 값을 삽입하려면 루프를 사용하여 삽입할 수 있습니다.
BEGIN
FOR x IN 1 .. 1000 LOOP
INSERT INTO MULTI_INSERT_DEMO (ID, NAME)
SELECT x, 'anyName' FROM dual;
END LOOP;
END;