récupérer à partir d'une fonction retournant un ref cursor pour enregistrer
J'ai une fonction dans un package qui retourne un CURSEUR de référence à un ENREGISTREMENT. Je suis en train d'appeler cette fonction à partir d'un bloc de code. Le code d'appel qui ressemble à ceci:
declare
a_record package_name.record_name;
cursor c_symbols is select package_name.function_name('argument') from dual;
begin
open c_symbols;
loop
fetch c_symbols into a_record;
exit when c_symbols%notfound;
end loop;
close c_symbols;
end;
La déclaration de la fonction dans le cadre de package_name ressemble à quelque chose comme ceci:
TYPE record_name IS RECORD(
field_a varchar2(20);
);
TYPE record_cursor IS REF CURSOR RETURN record_name;
FUNCTION getsymbols(argument IN varchar2) return record_cursor;
Lorsque j'essaie d'exécuter l'appel de bloc de code, j'obtiens l'exception: PLS-00386: incompatibilité de type trouvé à 'EXAMPLE_SYMBOLS" entre FETCH curseur et DANS des variables.
Quel doit être le type de a_record être et comment puis-je accéder aux éléments individuels de l'enregistrement, je suis aller chercher(de type record_name)?
OriginalL'auteur neesh | 2009-07-09
Vous devez vous connecter pour publier un commentaire.
Je soupçonne que vous pensez que votre curseur doit être de récupérer des lignes de la REFCURSOR. Il n'est pas. Le REFCURSOR est lui-même un curseur, vous n'utilisez pas un autre curseur pour sélectionner à partir.
Ce que votre actuelle du curseur est en train de faire est de récupérer un enregistrement unique, avec une seule colonne, contenant le résultat de l'appel de la fonction. Qui est un
record_cursor
pas unrecord_name
, de sorte que vous obtenez une incompatibilité de type.Je soupçonne ce que vous voulez vraiment, c'est quelque chose comme ceci:
C'est exactement ce que le code ci-dessus va faire -- traiter toutes les lignes qui peuvent être récupérées à partir de l'retourné curseur.
OriginalL'auteur Dave Costa
La fonction renvoie un
record_cursor
, donc je m'attendsa_record
devrait également être unrecord_cursor
. Cependant, il n'est pas clair pourquoi vous retournez un ref cursor quand même - pourquoi pas le retour de la fonction d'unrecord_name
type à la place?OriginalL'auteur Jeffrey Kemp
Le pl/sql bloc de lire le curseur ref semble un peu étrange pour moi. Oracle pourrait ne pas être en mesure de faire correspondre le type de votre curseur
c_symbols
avec le typepackage_name.record_cursor
.Suggestion:
c_symbols
"c_symbols package_name.record_cursor
"open c_symbols
" avec "c_symbols := package_name.function_name('argument')
"Aussi longtemps que la fonction appelée n'a vraiment de retour d'un curseur, cela devrait fonctionner.
Bien, vous pourriez voulez afficher code source.
OriginalL'auteur Juergen Hartelt