IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

REF CURSOR en package et block anonyme


Sujet :

SQL Oracle

  1. #1
    Membre éclairé Avatar de Jean_Benoit
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 499
    Par défaut REF CURSOR en package et block anonyme
    Bonjour,
    Je n'arrive pas à appeler un procédure dans un package en lui passant un REF CURSOR en paramètre.
    Voici le package (exemples adaptés du manuel PLSQL pages 6-20 et +):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    create or replace package REFCURSPARAM IS
     
    TYPE emprecord is RECORD (
    empnumber	emp.empno%type,
    last_name	emp.ename%TYPE, 
    emptel		emp.TELNO%type,      
    empsex		emp.SEX%type,        
    comment		emp.EMPCOMMENT%type, 
    empage		emp.AGE%type,        
    empjob		emp.JOB%type,        
    empmgr		emp.MGR%type,        
    emphiredate	emp.HIREDATE%type,   
    empsal		emp.sal%type,
    empcomm		emp.COMM%type,       
    empdeptno	emp.deptno%type);
     
    TYPE EmpCurTyp IS REF CURSOR RETURN emprecord;
     
    PROCEDURE process_emp_cv (emp_cv IN EmpCurTyp);
     
    END REFCURSPARAM;
    /
     
    SHOW ERRORS
     
    create or replace package body REFCURSPARAM IS
     
    PROCEDURE process_emp_cv (emp_cv IN EmpCurTyp) IS
       person emp%ROWTYPE;
    BEGIN
       dbms_output.put_line('-----');
       dbms_output.put_line('Here are the names from the result set:');
       LOOP
          FETCH emp_cv INTO person;
          EXIT WHEN emp_cv%NOTFOUND;
          dbms_output.put_line('Name = ' || person.ename ||
                               ' ' || person.job);
       END LOOP;
    END process_emp_cv;
     
    END REFCURSPARAM;
    /
     
    show errors
     
    /*
    Appel: 
    peupler le refcursor
    REFCURSPARAM.PROCESS_EMP_CV( unrefcursor)
    --> resultat: affiche ename et job
     
    */
    Voici ensuite le block anonyme (la même procédure est commented out)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    200708311947
     
    -- Manuel PLSQL Page 6-21
     
    -- Passing Cursor Variables As Parameters
     
    -- You can declare cursor variables as the formal parameters of functions and procedures.
    -- The following example defines a REF CURSOR type, then declares a cursor variable of
    -- that type as a formal parameter:
     
    DECLARE
       TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE;
       empct EmpCurTyp;
       -- Once we have a result set, we can process all the rows
       -- inside a single procedure rather than calling a procedure
       -- for each row.
     
    --    PROCEDURE process_emp_cv (emp_cv IN EmpCurTyp) IS
    --       person emp%ROWTYPE;
    --    BEGIN
    --       dbms_output.put_line('-----');
    --       dbms_output.put_line('Here are the names from the result set:');
    --       LOOP
    --          FETCH emp_cv INTO person;
    --          EXIT WHEN emp_cv%NOTFOUND;
    --          dbms_output.put_line('Name = ' || person.ename ||
    --                               ' ' || person.job);
    --       END LOOP;
    --    END;
     
    BEGIN
       -- First find 10 arbitrary employees.
       OPEN empct FOR SELECT * FROM emp WHERE ROWNUM < 11;
       refcursparam.process_emp_cv(empct);
       CLOSE empct;
       -- Then find employees matching a condition.
       OPEN empct FOR SELECT * FROM emp WHERE ename LIKE '%R%';
       refcursparam.process_emp_cv(empct);
       CLOSE empct;
    END;
    /
    * le block anonyme tourne avec la procédure inline.
    * si j'appelle la procédure en package, j'ai l'erreur
    SQL> @ref_cursor_parameter
    empct EmpCurTyp;
    *
    ERREUR à la ligne 3 :
    ORA-06550: Ligne 3, colonne 10 :
    PLS-00201: l'identificateur 'EMPCURTYP' doit être déclaré
    ORA-06550: Ligne 3, colonne 10 :
    PL/SQL: Item ignored
    J'ai l'impression qu'il n'aime pas que le REF CURSOR soit basé sur 2 déclas différentes, mais si je change ça ne compile plus.

    Merci pour vos idées.

  2. #2
    Membre éclairé Avatar de Jean_Benoit
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 499
    Par défaut
    Il faut référencer le REF CURSOR par le nom de son package.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    declare
    emp_data emp_pkg.emp_cursor; <-- magic trick
    person emp%rowtype;
    begin
    dbms_output.put_line( 'Hello World!!' );
    OPEN emp_data FOR SELECT 
    empno, 
    ename,
    telno,
    sex,
    empcomment,
    age,
    job,
    mgr,
    hiredate,
    sal,
    comm,
    deptno
    FROM emp;
    LOOP
    FETCH emp_data INTO person;
    EXIT WHEN emp_data%NOTFOUND;
    dbms_output.put_line('Name = ' || person.empno ||
    ' ' || person.ename);
    END LOOP;
    end;
    /
    Reste à voir ce qui se passe quand le buffer PL en SGA est renouvelé.

Discussions similaires

  1. REF CURSOR et requête dynamique
    Par muchmorehuman dans le forum SQL
    Réponses: 5
    Dernier message: 08/02/2008, 14h27
  2. [PL/SQL] Ref Cursor
    Par duboisfa dans le forum Oracle
    Réponses: 1
    Dernier message: 24/02/2006, 16h15
  3. [817] procédure avec REF CURSOR en paramètre
    Par Bourbigot dans le forum Oracle
    Réponses: 8
    Dernier message: 19/01/2006, 10h42
  4. [forms] ref cursor associé à un bloc de données
    Par plaineR dans le forum Forms
    Réponses: 9
    Dernier message: 27/08/2004, 18h26
  5. REF CURSOR... Comment ça marche ?
    Par Patkaza dans le forum SQL
    Réponses: 6
    Dernier message: 28/04/2004, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo