Ich nehme an, Sie meinen einen Ref Cursor. Dies ist ein PL/SQL-Konstrukt, das als Zeiger auf eine Reihe von Datensätzen fungiert, die von einer Abfrage zurückgegeben werden. Dies bedeutet, dass es von dem Client interpretiert werden muss, der die Abfrage ausführt. Zum Beispiel können wir einen Ref-Cursor einem JDBC- oder ODBC-ResultSet zuordnen.
Es ist sicherlich nichts falsch mit Ihrer grundlegenden Aussage. Hier ist eine ähnliche Funktion wie Sie Ihre eigenen:
SQL> desc get_emps
FUNCTION get_emps RETURNS REF CURSOR
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
P_DNO NUMBER(2) IN
P_SORT_COL VARCHAR2 IN DEFAULT
P_ASC_DESC VARCHAR2 IN DEFAULT
SQL>
Ich kann dies leicht rufen Sie in einem breiteren PL/SQL-Block:
SQL> declare
2 rc sys_refcursor;
3 begin
4 rc := get_emps(50);
5 end;
6/
PL/SQL procedure successfully completed.
SQL>
jedoch SQL'Plus verarbeiten kann CURSOR konstruiert nativ:
SQL> select get_emps(50) from dual
2/
GET_EMPS(50)
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
8060 VERREYNNE PLUMBER 8061 08-APR-08 4000 50
8061 FEUERSTEIN PLUMBER 7839 27-FEB-10 4500 50
8085 TRICHLER PLUMBER 8061 08-APR-10 3500 50
8100 PODER PLUMBER 8061 3750 50
SQL>
Diese Anweisung wird auch in SQL Developer ausgeführt, obwohl die Ergebnismenge in einem hässlichen Mode ausgelegt ist.
Also, wenn Sie Probleme mit Ihrer Funktion haben, sind die Fragen:
- Welche Client-Umgebung verwenden Sie?
- In welcher genauen Art und Weise funktioniert es nicht? Bitte beschreiben Sie das beobachtete Verhalten einschließlich eventueller Fehlermeldungen. Ich dachte, das Problem sein könnte aufgrund der Verwendung eines
- Auch uns Umgebung Details geben, wie die Version der Datenbank, Betriebssystem usw.
zu diesem Thema Ihrer andere Frage gelesen hat Benutzerdefinierte Ref Cursor (anstatt der eingebauten). Das macht jedoch keinen Unterschied. Diese verpackte Funktion:
SQL> create or replace package emp_rc_utils as
2
3 type emp_rc is ref cursor return emp%rowtype;
4
5 function get_emps
6 (p_dno in emp.deptno%type
7 )
8 return emp_rc;
9 end;
10/
Package created.
SQL> create or replace package body emp_rc_utils as
2
3 function get_emps
4 (p_dno in emp.deptno%type
5 )
6 return emp_rc
7 is
8 return_value emp_rc_utils.emp_rc;
9 begin
10
11 open return_value for select * from emp where deptno = p_dno;
12
13 return return_value;
14 end get_emps;
15
16 end emp_rc_utils;
17/
Package body created.
SQL>
noch funktioniert ...
SQL> declare
2 rc sys_refcursor;
3 begin
4 rc := emp_rc_utils.get_emps(50);
5 end;
6/
PL/SQL procedure successfully completed.
SQL> select emp_rc_utils.get_emps(50) from dual
2/
EMP_RC_UTILS.GET_EMP
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
8085 TRICHLER PLUMBER 8061 08-APR-10 3500 50
8060 VERREYNNE PLUMBER 8061 08-APR-08 4000 50
8061 FEUERSTEIN PLUMBER 7839 27-FEB-10 4500 50
8100 PODER PLUMBER 8061 3750 50
SQL>
Was bedeutet ‚es funktioniert nicht‘ bedeuten - welche Fehler bekommen Sie? Und wie ist Ihr "Cursor" in der Paketspezifikation definiert?Die Auswahl aus dual sollte funktionieren, wenn es ein 'sys_refcursor' ist und die Funktion keine unangenehmen Nebenwirkungen hat ... –
Ich schätze, diese Frage hängt mit Ihrer früheren zusammen: http://stackoverflow.com/questions/4613973/ returned-ref-cursor-not-supported Stellen Sie keine Fragen zum selben Thema. Wenn Sie keine zufriedenstellende Antwort erhalten, bearbeiten Sie Ihre Frage sofort, um weitere Informationen zu erhalten. – APC