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