2011-01-12 9 views
1

Ich versuche, eine Oracle gespeicherte Proc mit SQL Developer aufrufen. Der Prozess gibt Ergebnisse mit einem sys_refcursor aus. Ich klicke mit der rechten Maustaste in das Proc-Fenster, das das Run PL/SQL-Fenster öffnet. Wenn ich den proc wähle, den ich will, erzeugt er alle Eingabeparameter usw. für mich. Unten ist der Code, den ich benutze, um den sys_refcursor zu durchlaufen und die Ergebnisse auszugeben, aber ich erhalte einen Fehler bei 'v_rec v_Return% rowtype;' Zeile:Ausgabeergebnisse von Oracle gespeichert Proc von SQL Developer

ORA-06550: Zeile 6 Spalte 9: PLS-00320: Die Deklaration des Typs dieses Ausdrucks ist unvollständig oder fehlerhaft. ORA-06550: Zeile 6 Spalte 9: PL/SQL: Item ignoriert

Lieferantencode 6550

ich den Looping-Code auf ein paar anderen Websites gefunden und es scheint, die Art und Weise, es zu tun, aber es funktioniert nicht für mich, egal was ich versuche. Eine weitere Frage - auf der DBMS_OUTPUT.PUT_LINE ('Name =' || v_rec.ADM) Ich verweise die v_rec korrekt, d. H. Ist v_rec. "Column_name" die richtige Weise ??

Ich bin nicht so an Oracle gewöhnt und habe noch nie SQL plus verwendet. Irgendwelche Vorschläge geschätzt.

DECLARE 
    P_CAE_SEC_ID_N NUMBER; 
    P_PAGE_INDEX NUMBER; 
    P_PAGE_SIZE NUMBER; 
    v_Return sys_refcursor; 
    v_rec v_Return%rowtype; 
BEGIN 
    P_CAE_SEC_ID_N := NULL; 
    P_PAGE_INDEX := 0; 
    P_PAGE_SIZE := 25; 

    CAE_FOF_SECURITY_PKG.GET_LIST_FOF_SECURITY(
    P_CAE_SEC_ID_N => P_CAE_SEC_ID_N, 
    P_PAGE_INDEX => P_PAGE_INDEX, 
    P_PAGE_SIZE => P_PAGE_SIZE, 
    P_FOF_SEC_REFCUR => v_Return 
); 
    -- Modify the code to output the variable 
    -- DBMS_OUTPUT.PUT_LINE('P_FOF_SEC_REFCUR = '); 
    loop 
    fetch v_Return into v_rec; 
    exit when v_Return%notfound; 
    DBMS_OUTPUT.PUT_LINE('name = ' || v_rec.ADM); 
    end loop; 

END; 

Antwort

4

Ihr Problem ist hier:

v_Return sys_refcursor; 
v_rec v_Return%rowtype; 

v_Return ist ein Cursor-Variable und hat keine bestimmte Struktur (Liste der Spalten), so v_Return% rowtype keine gültige Datensatzstruktur v_rec zu erklären ist. Es ist sogar möglich, dass verschiedene Aufrufe der Prozedur Cursor mit unterschiedlichen Strukturen zurückgeben.

Sie wissen, was Sie erwarten, die Struktur des zurückgegebenen Cursors zu sein (aber Oracle nicht), so dass Sie die entsprechende Datensatzstruktur explizit definieren müssen, z.

type t_row is record (empno number, ename varchar2(30)); 
v_rec t_row; 
3

Sie benötigen einen stark typisierten Ref-Cursor, um ihn als% ROWTYPE definieren zu können.

Beispiel here

0

@Tony Andrews Dank dafür es mir eine bessere Vorstellung gab, wo ich falsch ging. Immer noch Probleme - hier ist eine verkürzte Version meiner Proc. Es ist ein wenig komplex, dass sie alle Felder aus einer Unterabfrage und 2 andere Werte sind die Auswahl:

open p_fof_sec_refcur for  

SELECT * 
FROM( 
    SELECT securities.*, rownum rnum, v_total_count 
    FROM 
     (
     SELECT 
      CFS.CAE_SEC_ID, 
      CFS.FM_SEC_CODE, 
      ... 
     FROM 
     CAEDBO.CAE_FOF_SECURITY CFS 
     INNER JOIN caedbo.CAE_DATA_SET_ELEMENT CDSE_STAT 
      ON (CDSE_STAT.DATA_SET_ELEMENT_ID = CFS.APPR_STATUS) 
     ... 
     WHERE APPR_STATUS = NVL(p_appr_status, APPR_STATUS) 
     ... 
     )securities 
    ) 

    WHERE rnum between v_pgStart and v_pgEnd; 

ich explizit die Ausgabestruktur, wie unten definiert, um die Rückkehr Felder aus der proc passen, aber ich bin immer noch einen Fehler bekommen:

v_Return sys_refcursor; 
type t_row is record (CAE_SEC_ID NUMBER,FM_SEC_CODE VARCHAR2(7),...rnum number, v_total_count number); 
v_rec t_row; 

der Fehler, den ich bekommen ist

ORA-06504: PL/SQL: Return types of Result Set variables or query do not match 
ORA-06512: at line 45 

ich frage mich nur ist die "rownum rnum, v_total_count" -Teil mich stolpern. Ich bin mir ziemlich sicher, dass ich alle anderen Felder in der Ausgabestruktur korrekt habe, da ich sie direkt von der Prozedur kopiert habe.

Verwandte Themen