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 +):
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
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 */
* le block anonyme tourne avec la procédure inline.
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; /
* si j'appelle la procédure en package, j'ai l'erreur
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.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
Merci pour vos idées.
Partager