2009-03-07 5 views
1

Je veux simplement sélectionner des valeurs dans des variables à l'intérieur d'une procédure.Reasonable SELECT ... INTO Solution Oracle pour le cas de plusieurs lignes OU

SELECT blah1, blah2 EN var1_, var2_ DE ...

Parfois, une grande requête complexe aura aucune ligne parfois, il aura plus d'un - deux cas conduisent à des exceptions. J'aimerais remplacer le comportement d'exception avec un comportement implicite similaire à:

Aucune ligne ne = pas de changement de valeur, plusieurs lignes = utiliser la dernière

Je peux limiter le jeu de résultats assez facilement pour le cas « multiples lignes » mais "no rows" est beaucoup plus difficile pour les situations où vous ne pouvez pas utiliser une fonction d'agrégation dans le SELECT.

Existe-t-il des solutions de contournement ou des suggestions spéciales? Vous cherchez à éviter de réécrire de manière significative les requêtes ou à les exécuter deux fois pour obtenir un rowcount avant d'exécuter SELECT INTO.

Répondre

5

Quel est le problème avec l'utilisation d'un bloc d'exception?

create or replace 
procedure p(v_job VARCHAR2) IS 
v_ename VARCHAR2(255); 
begin 

select ename into v_ename 
from (
    select ename 
    from scott.emp 
    where job = v_job 
    order by v_ename desc) 
where rownum = 1; 

DBMS_OUTPUT.PUT_LINE('Found Rows Logic Here -> Found ' || v_ename); 
EXCEPTION WHEN NO_DATA_FOUND THEN 
    DBMS_OUTPUT.PUT_LINE('No Rows found logic here'); 

end; 


SQL> begin 
    p('FOO'); 
    p('CLERK'); 
    end; 2 3 4 
    5/
No Rows found logic here 
Found Rows Logic Here -> Found SMITH 


PL/SQL procedure successfully completed. 

SQL> 
+0

Vous pouvez également déclarer la requête en tant que curseur, l'ouvrir, l'extraire une fois et vérifier l'attribut% trouvé. – kurosch

1

Vous pouvez utiliser une boucle for. Une boucle for ne ferait rien pour aucune ligne retournée et serait appliquée à chaque ligne retournée s'il y avait des multiples. Vous pouvez ajuster votre sélection pour qu'elle ne renvoie que la dernière rangée.

begin 
    for ARow in (select * 
        from tableA ta 
        Where ta.value = ???) loop       
     -- do something to ARow 
    end loop; 
end; 
Questions connexes