2011-01-06 14 views
3

ich folgendes zu tun, aber es funktioniert nichtWie eine Funktion in einem Paket nennen

select package_name.function_name(param,param) from dual 

ich eine Funktion aufrufen, die ich ein Cursor zu erraten, so kehrt im, "from dual" das Problem

ist gibt es einen anderen Weg, es zu tun?

+1

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 ... –

+0

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

Antwort

2

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:

  1. Welche Client-Umgebung verwenden Sie?
  2. 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
  3. 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> 
+0

Danke für Ihre Beiträge APC, aber ich bin neu und ich verstehe nicht, was Sie vorschlagen, ich sollte tun – code511788465541441

+0

Meistens müssen Sie mehr Details geben, was Sie gerade tun und genau, wie es scheitert. APC hat gezeigt, dass es im Prinzip funktioniert, also müssen Sie uns genügend Informationen geben, damit Sie herausfinden können, wo es falsch läuft. –

+0

@ user521180 - Mein Punkt ist: Was Sie versuchen * zu tun * sollte * funktionieren. Wenn Sie also einen Fehler erhalten, muss dies * etwas Spezifisches für Ihre Implementierung * sein. Sie müssen zu Ihrem Code zurückkehren und es herausfinden. Oder posten Sie weitere Details hier, damit wir es für Sie erkennen können. – APC

0

haben Sie versucht:

myCursor := package_name.function_name(param,param); 

dies innerhalb eines Testblocks oder einer gespeicherten Prozedur sein müsste.

+0

Ich weiß nicht, was Sie meinen – code511788465541441

1

Sie können über ein refcursor Telefonieren diese oder eine benutzerdefinierte Tabelle füllen und senden Sie es wie folgt:

create or replace 
function getRef return sys_refcursor 
is 
l_ref sys_refcursor; 
begin 

    open l_ref for 
    select 1 a, 'a' c from dual 
    union all 
    select 2 a, 'b' c from dual 
    union all 
    select 3 a, 'c' c from dual 
    union all 
    select 4 a, 'd' c from dual; 

    return l_ref; 

end getRef; 
/

select getref() from dual; 

GETREF() 
-------- 
A      C 
---------------------- - 
1      a 
2      b 
3      c 
4      d 

--you'll notice this isn't the most user-friendly result set if you look at it in SQL Developer or whatno 
--drop function getRef; 

Sie können auch den ‚Tisch‘ verwenden, wenn Sie eine Tabelle Sammlung vorbei zurück als solche

create or replace type lookup_row as 
    object (a number, c varchar2(20)); 
/
create or replace type lookups_tab as 
    table of lookup_row; 
/

create or replace 
function getUserDefinedTableType return lookups_tab 
is 
lTestTypeTable lookups_tab; 
begin 

    SELECT lookup_row(a,c) 
       bulk collect INTO lTestTypeTable 
       from 
    (select 1 a, 'a' c from dual 
    union all 
    select 2 a, 'b' c from dual 
    union all 
    select 3 a, 'c' c from dual 
    union all 
    select 4 a, 'd' c from dual); 

    return lTestTypeTable; 

end getUserDefinedTableType; 
/


select * from table(getUserDefinedTableType()); 
--this returns it in a more user friendly manner 
--http://www.oreillynet.com/pub/a/network/2003/01/22/feuerstein.html?page=2 
--http://stackoverflow.com/questions/3150137/converting-oracle-query-into-user-defined-types-in-pl-sql/3152885#3152885 
A      C      
---------------------- -------------------- 
1      a      
2      b      
3      c      
4      d 
+0

Können Sie bitte ein bisschen mehr erklären, was diese beiden Lösungen sind und was sie tun. – code511788465541441

Verwandte Themen