2010-10-28 16 views
2

Je voudrais savoir comment vérifier si un curseur ref renvoie des données.comment vérifier si un curseur ref renvoie des données d'une procédure pl/sql

Disons que j'ai le code suivant dans un package PL/SQL:

type refcursor is ref cursor; 

procedure Foo(cursorresult out refcursor) is 
begin 
    open cursorresult for 
    select * 
     from table t 
     inner join t2 on t.id = t2.id 
    where t.column1 is null; 
end; 

procedure DoSomeghingIfFooHasResults is 
    curFoo refcursor; 
    begin 
    Foo(curSansOwner); 
    if curFoo%found then 
     -- Do something 
    end if; 
end function; 

Ce code est utilisé dans un processus plus complexe et la requête en Foo utilise plusieurs tables.

J'ai besoin des données retournées par Foo dans une application asp.net, mais j'ai aussi besoin de faire quelque chose quand Foo trouve des données.

Je souhaite réutiliser la requête à quelques endroits, mais je ne pense pas que ce soit un bon candidat pour une vue.

Quel serait le meilleur moyen de savoir si Foo trouve quelque chose?

Merci.

Répondre

5

La seule façon de savoir si elle a trouvé quelque chose est à rapportez de ce:

procedure DoSomeghingIfFooHasResults is 
    curFoo refcursor; 
    recFoo mytable%ROWTYPE; 
    begin 
    Foo(curFoo); 
    fetch curFoo into recFoo; 
    if curFoo%found then 
     -- Do something 
    end if; 
end function; 
+0

Le problème est que je ne peux pas utiliser% ROWTYPE parce que mes données proviennent de nombreuses tables dans mon vrai proc. Échantillon de code édité pour refléter cela – Martin

+0

Vous ne pouvez pas le faire génériquement Je suis d'accord - en fait, vous ne pouvez probablement pas faire ce que vous voulez. Le code "faire quelque chose" doit connaître la structure des données qu'il va utiliser, et il devra donc prendre soin de la situation où le curseur ne retourne aucune ligne. –

+1

Vous pouvez déclarer un type d'enregistrement, correspondant aux types de champ de sortie attendus de la requête sous-jacente. (Nous espérons que vous avez simplifié, mais l'utilisation de '*' n'est pas idéale, entre autres choses, vous avez deux colonnes appelées 'ID'). –