2017-02-28 3 views
-1

프로 시저 중 하나는 다른 프로 시저를 호출하고 숫자 컬렉션을 전달하는 것입니다. 테이블의 모든 레코드를 처리하지만 한 번에 두 번째 프로 시저에서 처리되는 행 수에 제한을 두려고합니다.호출 된 프로 시저에 전달 된 행 수를 제한하는 방법

아래 코드는 제 코드입니다.

create or replace procedure proc1 
is 
    emp_id dbms_sql.number_table; 
begin 
    select employee_id bulk collect into emp_id from employees; 
    PROC2(EMP_ID); 
end; 
/
create or replace 
procedure proc2(vin_emp_id dbms_sql.number_table) 
is 
begin 
null; 
END ; 
+0

어떻게 제한을 정의하고 처리 할 유일한 레코드입니까, 아니면 모든 레코드를 처리 할 때까지 반복 할 것입니까? – BriteSponge

+0

proc2의 모든 레코드를 반복하고 싶지만 한 번에 proc2에서 처리중인 레코드 수를 제한하고 싶습니다. – PTK

+0

'프로 시저 proc1을 만들거나 대체하십시오 는 입니다 emp_id dbms_sql.number_table; 커서 c_emp는 employees에서 employee_id를 선택합니다. v_limi 번호 : = 100; 시작 열기 c_emp; 루프 c_emp 대량 수집을 emp_id 제한으로 가져옵니다. v_limit; PROC2 (EMP_ID); emp_id.count가

답변

0

당신은 emp_id에 선택한 행을 제한 할 수 있습니다

create or replace procedure proc1 
is 
    emp_id dbms_sql.number_table; 
begin 
    select employee_id 
    bulk collect into emp_id from employees where rownum <= 101; 

    PROC2(EMP_ID); 
end; 
/
1

스로틀하는 방법 "레코드 수는 한 번에 PROC2에서 처리되는 제한하려면" proc2에서 처리 된 레코드는 일괄 처리를 제출하는 것입니다. PL/SQL bulk collect 구문은 LIMIT 절을 지원합니다. 그렇지 않은 경우에

create or replace procedure proc1 
is 
    emp_id dbms_sql.number_table; 
    cursor emp_recs is 
     select employee_id from employees 
begin 
    open emp_recs; 
    loop 
     fetch emp_recs bulk collect into emp_id limit 100; 
     exit when emp_id.count() = 0; 
     PROC2(EMP_ID); 
    end loop; 
    close emp_recs; 
end; 
/

어떤 기록을 가져 오는 가장 최근에 발견 여부를 확인하기 위해 emp_id.count() 구문을 사용, 종료 : 그래서,이 같은 proc1를 다시 작성해야 한 번에 100 개 개의 레코드의 배치를 전달합니다. cursor%NOTFOUND에 대해 테스트하지 마십시오. 가져온 레코드 수가 제한 금액보다 작 으면 true이고, 마지막 배치에 레코드가 하나만 있어도 proc2을 계속 호출하기 원하기 때문입니다.