2016-06-13 4 views
0

를 삽입 할 값의 배열을 가진 하나 개의 쿼리에서 대량 삽입 값에 :오라클 - 나는이 테이블이 어떻게

A { 
id, 
name 
} 

B { 
id, 
name, 
aId 
} 

aId 그래서 나는 목록을 표 A

에 외래 키 테이블 B에 삽입해야하는 문자열.

List: names['name1', 'name2'] 

또한 A. A.id의 목록을 가져 오는 select 문이 있습니다.

List: id's[1, 2] 

문제는 표 B가 조회되고 동시에 문자열 목록이 고려되어야 모든 A.id 위해 삽입 행을 가질 필요가 있다는 것입니다.

최종 결과는 내가 얻을 것 아이디의 (1, 2) 예를 들어, 그래서 4 행 (각 ID에 대한이 모든 ID가 목록에있는 모든 문자열을 삽입해야하기 때문에) 생성됩니다

insert into b (id, name, aId) values (b_id_seq.nextval, name1, 1) 
insert into b (id, name, aId) values (b_id_seq.nextval, name2, 1) 

insert into b (id, name, aId) values (b_id_seq.nextval, name1, 2) 
insert into b (id, name, aId) values (b_id_seq.nextval, name2, 2) 

내가 작업하게 된 것은 ID의 배열을 반환하는 select 문을 작성하는 것입니다. 나는 또한이 두리스트를 가지고 선택을 구현하려했지만 행운이 없었다.

첫 번째 시도는 특정 열 값 부분 안에 IN 절을 사용하고 두 번째 시도는 INSERT ALL을 사용하는 것이 었습니다. 마지막 사례에서 동적으로 insert 문을 생성하는 방법을 이해하지 못했습니다.

이런 종류의 INSERT 문을 어떻게 해결할 수 있습니까?

답변

1

일부 PL/SQL을 사용하는 것이 좋습니다. 이걸로 동적 쿼리를 할 수는 있지만 ... 진실은 당신이 아마 할 필요가 없다고 말했고, 커서 사용법으로는 벗어날 수 있습니다.

create proc myproc(inListName in customType) 
as 

--this cursor would get you your list of IDs... 
cursor1 is 
    select id from table; 

c1row cursor1%rowtype; 

begin 

    --this cursor opens and is effectively your "outer loop" 
    open cursor1; 
    LOOP 
    -- Retreive one row. 
    FETCH cursor1 INTO c1row; 
    EXIT WHEN cursor1%NOTFOUND; 
     --not exact syntax here.. but you get the idea... 
     FOR name IN inListNames 
     LOOP 
     insert into b (id, name, aId) values (b_id_seq.nextval, name, c1row.id); 
     END LOOP;   

    END LOOP; 
    close cursor1; 
end 
/

참고 :이 안된 그냥 내 머리 위로 떨어져입니다 ...하지만이 라인을 따라 뭔가 작동합니다. 많은 데이터로이 작업을 수행하는 경우 대신 대량 삽입 (Google Oracle 대량 삽입 ...)을 사용하는 것이 좋을 것입니다. 대신 실적이 현명하므로 더 잘 작동합니다.

참고 2 : 사용자 이름 목록이 포함될 매개 변수에 사용자 지정 데이터 형식을 사용하여 매개 변수를 전달합니다. 여기에 사용자 정의 유형을 설정하는 방법을 보여주는 링크가 있습니다. 그런 당신을 위해 죽일 이상-너무 많이 나 당신이 설계를 통해-을 느낀다 경우
Passing an array of data as an input parameter to an Oracle procedure

또는, 어쩌면 당신은 어떻게 든 당신 이름의 그 목록을 얻을 것 쿼리를 실행할 수 있습니까? 이 경우 두 번째 커서를 만들어 그 이름 목록을 가져 와서 반복 할 수 있습니다.