如何限制传递给被调用过程的行数

时间:2017-02-28 11:55:29

标签: sql oracle collections plsql limit

一个过程是调用另一个过程并传递一组数字。我想处理表中的所有记录,但一次性限制第二个过程中处理的行数。

以下是我的代码。

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 ;

2 个答案:

答案 0 :(得分:1)

  

"想要一次性限制在proc2中处理的记录数"

限制proc2中处理的记录的方法是提交批次。 PL / SQL bulk collect语法支持LIMIT子句。因此,要一次传递100个记录的批次,您需要像这样重写proc1

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()语法检查是否在最近的提取中找到了任何记录,如果没有,则退出。不要对cursor%NOTFOUND进行测试,因为如果获取的记录数小于限制数量,则为真,但即使最后一批只有一条记录,我们仍然要调用proc2

答案 1 :(得分: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;
/