2011-03-17 3 views
2

매핑 테이블에 레코드를 삽입하는 절차의 속도를 높여야합니다. 주 문서 테이블이고 t_mapping이며, t_docs을배열 매개 변수로 Oracle 테이블 조인

InsertDocsToFolder as 
procedure this(p_folderid in number, p_docs in out nocopy DocList) 

문서 목록이

type DocList is table of int index by integer; 
다음과 같이 절차의 핵심 레코드를 삽입

다음과 같이 정의된다

내가 사용하는 절차는 서명이 p_folderid를 p_docs에 매핑하는 테이블 :

forall i in 1..p_docs.count save exceptions 
    insert into t_mapping select p_folderid, p_docs(i) from t_docs D where D.docid = p_docs(i); 
commit; 

내가해야한다고 생각합니다. forall 루프를 단일 SQL 문으로 대체 할 수 있습니다. 누구든지 더 빠른 기술을 제안 할 수 있습니까? p_docs는 테이블 유형이므로 t_docs에 직접 참여할 수 있습니까?

답변

3

서버에서 작성된 콜렉션 유형 ("create type ...") 만 SQL에서 사용할 수 있습니다. 이 그랬다면 지금 : 다음

create type DocList is table of int; 

을이처럼에서 선택할 수 있습니다 : 문서 목록과 같은 테이블에서 (주조 (t_docs :

insert into t_mapping 
select p_folderid, column_value 
from table (cast (t_docs as DocList)); 
+1

마이너 업데이트가 ... 난 당신이 할 수있는 마지막 선을 필요로 생각)) – Craig

+0

고마워. 그것은 매력처럼 작동합니다. 위에서 작성한 내용을 감안할 때 '즉시 실행'문에 DocList를 포함시키는 방법을 알고 있습니까? t_docs가 잘못된 식별자입니다. – user481779

+0

@Craig, 수정 해 주셔서 감사합니다. –