Puis-je passer un curseur explicite d'une fonction/procédure pour l'utilisation en boucle?
J'ai une procédure qui effectue des calculs sur tous les enregistrements renvoyés par un curseur. Il ressemble un peu à ceci:
PROCEDURE do_calc(id table.id_column%TYPE)
IS
CURSOR c IS
SELECT col1, col2, col3
FROM table
WHERE ...;
BEGIN
FOR r IN c LOOP
-- do some complicated calculations using r.col1, r.col2, r.col3 etc.
END LOOP;
END;
Maintenant j'ai le cas où j'ai besoin d'effectuer exactement le même calcul sur un ensemble de dossiers qui viennent d'une autre table. Cependant, elles ont la même "forme" comme ci-dessus dans l'exemple.
Est-il possible d'écrire une procédure qui ressemble à ceci:
PROCEDURE do_calc2(c some_cursor_type)
IS
BEGIN
FOR r IN c LOOP
-- do the calc, knowing we have r.col1, r.col2, r.col3, etc.
END LOOP;
END;
Je sais à propos de SYS_REFCURSOR
, mais je me demandais si il était possible d'utiliser le beaucoup plus pratique FOR ... LOOP
syntaxe et implicites de type d'enregistrement.
Non, vous ne pouvez pas passer un curseur statique en tant que paramètre. Les réponses ci-dessous vous suggérons déclaration de plusieurs curseurs statiques dans certains étendue partagée et de manière sélective les appeler à l'intérieur de procédures, probablement à l'aide de certains
if...then
logique que personne ne l'a spécifié, ou encore le passage d'un curseur ref. Vous pourriez peut-être convertir un ref cursor en statique à l'aide d'un pipeline de la table de fonction similaire à williamrobertson.net/documents/refcursor-to-csv.shtml, cependant, il peut être un peu de un projet, donc si vous êtes simplement à la recherche pour la commodité du curseur DE la boucle, alors vous êtes hors de la chance.OriginalL'auteur David Sykes | 2012-05-17
Vous devez vous connecter pour publier un commentaire.
Créer un package.
Déclarer votre curseur en tant que variable de package.
Utilisation
%rowtype
pour définir les paramètres de la fonction type.Vous êtes les bienvenus )
salut @VasilyKomarov.. si le curseur de la déclaration de paramètre que vous transmettez en tant qu'entrée à toutes les fonctions et procédures dans l'ensemble.. comme par exemple.. curseur c est 1 sélectionnez l'un, 2 que les deux de double où row = row_id ; où row_id est le paramètre
OriginalL'auteur Vasily Komarov
J'ai eu un problème similaire, où j'ai eu deux curseurs qui devaient être traitées de la même façon, donc, c'est comment j'ai pensé à elle.
Vous pouvez également utiliser cette option si vous souhaitez en vrac recueillir vos curseurs. Vous avez juste besoin de changer votre assistant de procédure
process_emp_cv
; le reste peut rester la même.En VRAC à l'aide de RECUEILLIR
OriginalL'auteur plasmaTonic
Essayer celui-ci, Usong curseur ref.
OriginalL'auteur Amalendu Kar
Oui, vous pouvez utiliser le Curseur explicitement dans la procédure et de la fonction,pour que le curseur besoin de le déclarer dans le package comme variable
OriginalL'auteur user2001117