2017-07-11 1 views
0

J'ai écrit une fonction qui est utilisée pour renvoyer le BALANCE en fonction du type de produit. J'en ai plusieurs pour chaque type de produit et j'ai utilisé la rangée de tuyaux comme suit.Retour de pipelines Oracle ORA-06548: plus de lignes nécessaires, ORA-01427: sous-requête à une ligne renvoie plus de

create or replace function GETACC_BAL(pi_CUS_MDB_IID in number, 
                pi_EN_TYPE in varchar2, 
                pi_ADC_IID  in number, 
                pi_CUS_MDB_IID in number, 
                pi_expiryDate  in Date) 
return ACC_CUS_BAL_ARR pipelined as 


begin 
     for i in (select * 
        from CUST_BAL 
        where CUS_MDB_IID = pi_CUS_MDB_IID 
        and EN_TYPE = pi_EN_TYPE 
        and ADC_IID = pi_ADC_IID 
        and BALANCE <> 0) loop 

         pipe row(AC_CUS_BAL(I.EXPDATE, 
               I.ADC_IID, 
               I.EN_TYPE, 
               I.BALANCE, 
               'A' 
               )); 
     end loop; 

     return; 
end GETACC_BAL; 

/

lorsque i exécuter la fonction ci-dessus où la boucle de produire une rangée fonctionne, mais dans le cas de rangées de multiples alors i ORA-06548; ORA-01427. J'ai essayé d'utiliser l'exception when_no_data_needed, mais pas de chance.

Quelqu'un peut-il aider à ce sujet, est-ce possible?

Merci

+0

S'il vous plaît ajouter procédure 'AC_CUS_BAL' aussi dans votre question. –

Répondre

0

Ajoutez une gestion des exceptions pour ORA-06548. Bien que vous obtenez une erreur, il est simplement conçu comme un avertissement: la fonction pipeline produirait plus de lignes que vous rapportez de, comme dans

select * from my_pipelined_function where rownum = 1; 

La fonction est pas à travers, mais vous vous arrêtez à la première ligne cet exemple et en conséquence obtenir l'exception "avertissement".

Ajouter la ligne suivante à la capture exception de votre fonction à avaler cette exception:

... 
    return; 
EXCEPTION WHEN NO_DATA_NEEDED THEN NULL; 
end GETACC_BAL;