2017-02-28 2 views
-1

Une procédure appelle une autre procédure et transmet une collection de nombres. Je veux traiter tous les enregistrements de la table, mais mettre une limite sur le nombre de lignes traitées dans la deuxième procédure en une seule fois.Comment limiter le nombre de lignes passées à une procédure appelée

Voici mon code.

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

Comment voulez-vous définir cette limite et sont-ils les seuls enregistrements que vous allez traiter ou voulez-vous boucler jusqu'à ce que vous ayez traité tous les enregistrements? – BriteSponge

+0

souhaitez boucler tous les enregistrements dans proc2 mais souhaitez limiter le nombre d'enregistrements en cours de traitement dans Proc2 en une seule fois. – PTK

+0

'créer ou remplacer la procédure proc1 est emp_id dbms_sql.number_table; curseur c_emp est sélectionné employee_id des employés; v_limi nombre: = 100; commencer ouvrir c_emp; boucle aller chercher c_emp bulk collect dans emp_id limite v_limit; PROC2 (EMP_ID); quitter lorsque emp_id.count

Répondre

0

Vous pouvez limiter les lignes sélectionnées dans 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

"veulent limiter le nombre de dossiers en cours de traitement dans PROC2 en une seule fois"

La façon de papillon des gaz les enregistrements traités en proc2 consistent à soumettre des lots. La syntaxe PL/SQL bulk collect prend en charge une clause LIMIT. Donc, pour passer des lots de 100 enregistrements à la fois que vous avez besoin de réécrire proc1 comme ceci:

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; 
/

Utilisez la syntaxe emp_id.count() pour vérifier si les dossiers se trouvent dans la dernière lecture, et la sortie si aucun ne. Ne pas tester pour cursor%NOTFOUND car cela sera vrai si le nombre d'enregistrements récupérés est inférieur au montant limite, mais nous souhaitons toujours appeler proc2 même si le dernier lot n'a qu'un seul enregistrement.