Ich habe eine Funktion namens GET_CLIENT_IN_SED (Rückgabe sys_refcursor), es gibt mir eine Liste von ID-Nummern (einzelne Spalte). Jetzt probiere ich in einer Prozedur jeden (einzeln) dieser Werte zu durchlaufen und benutze ihn zum Aufruf einer zweiten Prozedur (benötigt einen Client-ID-Parameter).Oracle PL/SQL Jedem Wert von einem Cursor (von Funktion) zu einem anderen Cursor einzeln zuweisen
Antwort
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;
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;
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
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
- 1. PLSQL Oracle Cursor in Prozedur
- 2. Oracle PLSQL Cursor verschachtelt Fall
- 3. Wie aus einem Cursor eine Auswahl zu machen, die aus einer plsql Funktion ORACLE liefert
- 4. plsql Cursor iterating Problem
- 5. Rückgabewert zum Cursor plsql
- 6. Orakel plsql Cursor Fehler
- 7. PLSQL einen Cursor dynamisch definieren
- 8. PL/SQL referenziert einen anderen Cursor in einem Cursor?
- 9. Verwenden Sie Oracle-Cursor in einem sys_refcursor
- 10. Konvertieren von Informix Cursor zu MSSQL Cursor
- 11. Oracle: SQL Dynamische Cursor-Anweisung
- 12. Alternativen zu SQL-Cursor
- 13. Dynamisch eine Variable einem Cursor zuweisen - SQL Server
- 14. Erstellen von Oracle Cursor mit Java-Programm
- 15. Oracle Analytics in Cursor
- 16. Oracle Open Cursor Ausführungszeit
- 17. Eine Alternative zu einem Cursor dafür?
- 18. Wie eine Funktion in einem Cursor nennen, die ein Teil eines anderen Verfahrens in Oracle ist
- 19. Wie erhalten Sie Informationen von Cursor Rückkehr in einem anderen SP in Oracle PL/SQL?
- 20. Call-Verfahren mit Ref Cursor in einem anderen Verfahren
- 21. Aufruf ref_cursor aus einer anderen PLSQL Funktion
- 22. Hinzufügen des Inhalts eines Cursors zu einem anderen Cursor
- 23. Angular2: Zuweisen einer von einem Dienst geladenen Variablen zu einem von einem anderen Dienst geladenen Wert
- 24. Oracle PLSQL Ausnahme Einfügen von Daten
- 25. Versucht, Werte in einem Feld mit einem Cursor zu ändern
- 26. wie Einfügen in geschachtelte Tabelle Sammlung mit Cursor plsql
- 27. Set Cursor Nach einem Element
- 28. Wie kann ich zurückkehren Cursor von Oracle-Benutzer definierten Funktionen
- 29. ORACLE SQL CURSOR/FÜR LOOP
- 30. Verwenden von Variablen in der Cursor-Deklarationsabfrage in Oracle
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
@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