WÄHLEN Sie die Daten AUS CURSOR-PAKET, drucken Sie es
Will ich drucken Daten des Cursor_pkg.c1.row_emp
für ex:Cursor_pkg.c1.row_emp.last_name
wäre vorhanden in Cursor_pkg.row_emp
nach Cursor_pkg_func.Print_Cur
Prozedur funktionieren würde. Wie kann ich es tun?
- Ich erstelle PAKET mit den cursor-und rec
- Ich erstelle PAKET mit Verfahren, die fetch-cursor-Daten in rec
- Ich möchte die Ausgabe von abgerufenen Daten. Wie?
Gibt es zwei Fragen: ich möchte für die Ausgabe von Daten aus dem Paket emp_rec
(Zeile) und ich möchte die Ausgabe, die es direkt aus dem PAKET Cursor_pkg_func
Verfahren
P. S. Die Idee dabei ist, dass die Speicherung von Daten und Prozedur/Funktion zum abrufen und auswählen von Daten
CREATE OR REPLACE PACKAGE Cursor_pkg AUTHID DEFINER IS
CURSOR C1 IS
SELECT last_name, job_id FROM employees
WHERE job_id LIKE '%CLERK%' AND manager_id > 120
ORDER BY last_name;
row_emp C1%ROWTYPE;
END Cursor_pkg;
/
CREATE OR REPLACE PACKAGE Cursor_pkg_func IS
PROCEDURE Print_Cur;
END Cursor_pkg_func;
/
CREATE OR REPLACE PACKAGE BODY Cursor_pkg_func IS
PROCEDURE Print_Cur IS
BEGIN
OPEN Cursor_pkg.C1;
LOOP
FETCH Cursor_pkg.C1 INTO Cursor_pkg.row_emp;
EXIT when Cursor_pkg.C1%NOTFOUND;
DBMS_OUTPUT.put_line(Cursor_pkg.row_emp.last_name);
END LOOP;
CLOSE Cursor_pkg.C1;
END;
END;
/
BEGIN
Cursor_pkg_func.Print_Cur;
END;
Aber ich wollen, auswählen und drucken von Cursor_pkg.row_emp PAKET ohne Funktion erstellt.
Und, wie drucken, nicht nur Nachname, aber alle Zeile?
Fehler beginnen mit: Was stimmt nicht mit den letzten drei Anweisungen?
CREATE OR REPLACE PACKAGE Cursor_pkg_func IS
TYPE outrec_typ IS RECORD (
var_char2 VARCHAR2(30)
);
TYPE outrecset IS TABLE OF outrec_typ;
FUNCTION f_trans (p in number ) RETURN outrecset PIPELINED;
END Cursor_pkg_func;
/
CREATE OR REPLACE PACKAGE BODY Cursor_pkg_func IS
FUNCTION f_trans (p in number) RETURN outrecset PIPELINED IS
out_rec outrec_typ;
BEGIN
OPEN Cursor_pkg.C1;
LOOP
FETCH Cursor_pkg.C1 INTO Cursor_pkg.row_emp;
EXIT when Cursor_pkg.C1%NOTFOUND;
END LOOP;
LOOP
out_rec.var_char2 := Cursor_pkg.row_emp.last_name;
PIPE ROW(out_rec);
DBMS_OUTPUT.put_line(out_rec.var_char2);
END LOOP;
CLOSE Cursor_pkg.C1;
RETURN;
END f_trans;
END Cursor_pkg_func;
/
begin
Cursor_pkg_func.f_trans(5);
end;
/
- Sie bekommen eine Fehlermeldung? oder was ist das problem, das Sie konfrontiert sind?
- Sollten Sie untersuchen die DBMS_OUTPUT-und UTL_FILE-Pakete. Teilen und genießen.
- Ausgang wohin? Sie haben
dbms_output
schon, so tun Sie gerade brauchen, umset serveroutput on
wenn der client unterstützt? Oder wollen Sie einen ref-cursor zurückgeben, dass Ihre Kunden behandeln können (einschließlich Druck in SQL*Plus)? - SET SERVEROUTPUT ON immer auf 🙂
- Ich nie verwenden, UTL_FILE, weil ich nicht wusste
- Ich kann die Nutzung BEGINNEN Cursor_pkg_func.Print_Cur; END; laufen Verfahren, aber ich will drucken, die Datensätze aus row_emp von Cursor_pkg PAKET
- Ich habe keine Fehler
- Und, wie drucken, nicht nur Nachname, aber alle Zeile?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Sie definiert haben, eine Pipeline-Funktion, und dies ist nicht der Weg, es zu nennen:
Müssen Sie eine TABELLE () - Funktion. Obwohl dann entdecken Sie die Fehler in Ihrem code:
Hinweis: ich hatte zu töten, die in der Sitzung von der anderen Sitzung, sonst würde es immer noch laufen. Also wir vereinfachen die Funktion und loswerden, dass sinnlos zweiten Schleife ....
.... dann lo!
Erstellung einer Pipeline-Funktion. Warum hast du das getan? Der Grund, warum Sie es hätte tun sollen, war, weil Sie wollte, einen PL/SQL-Funktion, die verwendet werden könnten, die in der FROM-Klausel einer SELECT-Anweisung. Das ist der Anwendungsfall für die weitergeleitete-Funktionen. So setzen Sie den Anruf in einem anonymen PL/SQL block wirklich keinen Sinn.
Aber trotzdem.
Bitte Lesen Sie die Dokumentation. Es ist sehr umfangreich, es ist online und kostenlos. Den entsprechenden Abschnitt in der PL/SQL-Referenz im Kapitel über Statische SQL. Es macht klar, dass die SELECT-Anweisungen in PL/SQL muss immer fetch Datensätze in eine variable von einigen Beschreibung. Anonyme PL/SQL-Blöcke sind genau das gleiche wie gespeicherte Prozeduren in dieser Hinsicht. Erfahren Sie mehr.