2017-02-28 11 views
-1

プロシージャは、別のプロシージャを呼び出して数値のコレクションを渡すことです。私はテーブル内のすべてのレコードを処理したいが、第2のプロシージャで処理された行の数を一度に制限する。呼び出されたプロシージャに渡される行数を制限する方法

以下は私のコードです。

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で処理されるレコードの数を1回に制限したい。 – PTK

+0

'プロシージャproc1を作成または置換する は です。emp_id dbms_sql.number_table; カーソルc_empはemployeesからemployee_idを選択します。 v_limi番号:= 100; begin open 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になりますが、最後のバッチにレコードが1つしかない場合でもproc2を呼び出します。

関連する問題