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:
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:
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
Citation:
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.