2017-09-05 6 views

Antwort

1

Was könnte ich verstehen Sie etwas tun müssen, wie:

Funktion:

Diese Funktion nimmt die Eingabe als Zahl und gibt einen Refcursor zurück. Ähnlich wie Ihre Anforderung.

CREATE OR REPLACE FUNCTION get_num_sysrefcur (num IN NUMBER) 
    RETURN SYS_REFCURSOR 
AS 
    my_cursor SYS_REFCURSOR; 
BEGIN 
    -- 
    OPEN my_cursor FOR 
     WITH ntable 
      AS (SELECT 1 ID, 111 AGT, 'ABC' DESCRIP FROM DUAL 
       UNION ALL 
       SELECT 2 ID, 222 AGT, 'ABC' DESCRIP FROM DUAL 
       UNION ALL 
       SELECT 1 ID, 333 AGT, 'ABC' DESCRIP FROM DUAL) 

     SELECT AGT FROM ntable WHERE ID = num; 


    RETURN my_cursor; 
END; 
/

-Block (In Ihrem Fall Procedure) - Diese anonyme Block wird eine Schleife durch die Datensätze zurück, aus dem sys_refcursor. Ähnlich wie Sie möchten, benötigen Sie die zweite Prozedur, um den Wert von sys_refcursor zu verwenden und ihn zu loopen (Sie können eine Prozedur anstelle dieses anonymen Blocks erstellen).

DECLARE 
    a NUMBER := 1; 

    TYPE ta IS TABLE OF NUMBER 
     INDEX BY PLS_INTEGER; 
    b ta; 
    x SYS_REFCURSOR; 
BEGIN 
    x := get_num_sysrefcur (a); 

    fetch x bulk collect into b; 

    for i in 1..b.count 
    loop 
    -- Displaying the result of the ref_cursor. 
    DBMS_OUTPUT.put_line (b(i)); 
    end loop; 
END; 
+0

Bulk collect ist ein anderer gültiger Ansatz, den ich gerne verwende (ich finde es viel einfacher, mit einer Sammlung zu arbeiten als mit einem Cursor!). Obwohl es besser ist, nicht verwendet zu werden, wenn die Datenmenge sehr groß ist, weil sie in einer Variablen statt in einem Iterator gespeichert wird. – Dessma

+0

@Dessma Sie können auch mit Bulk Collect iterieren. Sie haben eine Limit-Klausel, um die Datenauswahl auf 1 zu beschränken, und Sie können über alle Datensätze iterieren – XING

1

Die Schleife durch einen Ref-Cursor ist nicht wie ein Loop durch ein Array oder eine Tabelle, was erklärt, warum Ihre FOR ... LOOP nicht funktioniert.

Kurz gesagt, der ref_cursor ist statt einer Sammlung eher ein "Zeiger" oder ein "Iterator" über eine Sammlung. In dieser anderen Frage finden Sie ein ziemlich klares Beispiel für die Iteration durch einen ref_cursor mit FETCH.

How to use record to loop a ref cursor?

Ein Beispiel mit Ihren Daten würde wie folgt aussehen:

PROCEDURE GET_ORDINARY_CLIENT_BY_SED(sed_in  IN VARCHAR2, 
            client_sed OUT SYS_REFCURSOR) IS 
    ordinary_clients SYS_REFCURSOR; 
    clt    NUMBER; -- assuming your cursor contains strictly numbers 
BEGIN 
    ordinary_clients := GET_CLIENT_IN_SED(sed_in); 
    LOOP 
     FETCH ordinary_clients 
     INTO clt; 
     EXIT WHEN ordinary_clients%NOTFOUND; 
     dbms_output.put_line(clt); 
     -- do some other things here with your number 
    END LOOP; 
END; 
+0

Ich bin nicht aus einer Tabelle versuchen zu laden, ich versuche, aus einer sys_refcursor Rückkehrfunktion zu laden, weil ich in einer Tabelle gespeichert keine Werte habe, nur Anweisungen, wie die Werte zu erhalten. So kann ich table_name nicht verwenden% ROWTYPE – miMescua

+0

Entschuldigung ich nahm an, dass Ihr 'gewöhnlicher_client' Cursor einen" komplizierten "Typ wie eine Tabellenreihe enthielt. Wenn Ihr Refcursor nur einfache Daten wie Zahlen enthält, können Sie ihn in eine einfache Variable des entsprechenden Typs ablegen und mit derselben Logik verwenden. Ich werde meine Antwort mit zusätzlichen Informationen bearbeiten. – Dessma

Verwandte Themen