2010-07-01 6 views
1

J'ai un exemple de requête comme ci-dessous dans ma procédure:comment utiliser vrac Prélever au lieu d'une boucle dans Oracle

result_rec    mypkg.mytype; 

OPEN CUR1 FOR 
    select col1, col2, col3 from table1 where something = 'a'; --rows will always be 50 

     LOOP 
     FETCH CUR1 
      INTO myrectype; 
     EXIT WHEN CUR1%NOTFOUND; 
     result_rec.col1 := myrectype.col1; 
     result_rec.col2 := myrectype.col2; 
     result_rec.col3 := myrectype.col3; 
     PIPE ROW (result_rec); 
     END LOOP; 

Comme vous pouvez le voir, chaque fois que je suis mise en boucle 50 fois. Y a-t-il une meilleure manière de faire cela? quelque chose comme BULK COLLECT INTO? comment pourrais-je l'implémenter?

Répondre

6

Dans Oracle 10g (peut-être 9i), Oracle VRAC automatiquement recueillir les curseurs implicites. Alors code comme:

DECLARE 
    result_rec    mypkg.mytype; 
BEGIN 
    for i in (select col1, co2, col3 from table1 where something = 'a') 
    loop 
    result_rec.col1 := i.col1; 
    result_rec.col2 := i.col2; 
    result_rec.col3 := i.col3; 
    pipe_row (result_rec); 
    end loop; 
END; 

ne fera que rendre le changement de contexte du moteur PL/SQL au moteur SQL pour récupérer des dossiers une fois tous les 100 lignes. Exécutez-le sous une trace SQL (dbms_monitor.session_trace_enable()) et voir!

+1

Ce comportement a été introduit en 10g. –

3

Vous pouvez essayer ce qui suit.

DECLARE 
    type tab_result_rec IS TABLE OF mypkg.mytype INDEX BY PLS_INTEGER; 
    t_result_rec tab_result_rec; 
BEGIN 
    select col1, col2, col3 bulk collect into t_result_rec 
    from table1 where something = 'a'; --rows will always be 50 
    -- 
    for i in 1..t_result_rec.count LOOP 
    PIPE ROW (t_result_rec(i)); 
    end loop; 
END; 
Questions connexes