Mehrere Zeilen zurückgeben von Verfahren , select-Anweisung in PL/SQL
Dies ist die Verfahren Abschnitt von einen anonymen block, aus dem es nimmt die parameter pID, parcel_id. Mein problem ist das select-Anweisung gemeint ist, zu finden und anzuzeigen alle Pakete, berühren Sie das query-Paket und es funktioniert hervorragend in einer normalen SQL-Abfrage, wenn ich in,
select target.district_id, target.parcel_id ,query.parcel_id, sdo_geom.relate(target.geom, 'determine', query.geom, 0.05)Relationship
from Parking target, Parking query
where query.parcel_id = 68
and target.district_id = 1
and sdo_relate(target.geom, query.geom, 'mask=TOUCH') = 'TRUE';
Dass Beispiel gibt fünf Reihen mit 5 verschiedenen Paketen, berühren Sie das Paket 68. Allerdings, wenn ich es in die Prozedur, die ich entweder bekommen die "ZU Viele Zeilen, Fehler" oder, wenn ich versuche, um 'Und Rownum <2' es funktioniert okay, aber nicht alle zeigen die Beziehungen, d.h. es läuft durch und zeigt nur eine Beziehung für jedes Paket. Gibt es irgendetwas, was ich tun könnte um dies zu verbessern? Ich habe Lesen der anderen Beiträge auf der Website und es gibt Hinweise auf Referenz-Cursor, aber ich weiß nicht, wie diese anzuwenden sind. Vielen Dank.
procedure Payx (pID number )is
varDistrict Parking.District_id%type;
vID Parking.parcel_id%type;
vQED Parking.parcel_id%type;
varRel varchar2(20);
begin
select target.district_id, target.parcel_id,query.parcel_id, sdo_geom.relate(target.geom, 'determine', query.geom, 0.05)Relationship
into varDistrict
vID,
vQED,
varRel
from Parking target, Parking query
where query.parcel_id = pID
and sdo_relate(target.geom, query.geom, 'mask=TOUCH') = 'TRUE'
and rownum <2;
--- dbms_output.put_line('')
end Payx;
- Sie müssen, verwenden Sie einen cursor.
- Mögliche Duplikate von Erstellen einer Oracle-Funktion, die eine Tabelle zurückgibt
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie erwähnt von @Muhammad Muazzam, da die Abfrage zurück
multiple rows
benötigen Sie entweder einecollection
zu halten, die Datensätze auf eine einzelne zu gehen, oder Sie könnenloop
durch die wählen und halten Sie die Datensätze in der Variablen, die Sie deklariert. Ich zeige Ihnen, wie Sie es tun können mit einerRECORD
.Da versuchen mehrere Werte, müssen Sie die Verwendung von äther Cursor oder mit der hlp von Sammlungen. Hoffe, das hilft.
TOO Many Rows Error
Fehler kommt, wenn Sie versuchen, mehrere Zeilen in eine einzige dimension, deklariert die variable eines Datentyps. Es doesnot kommen, wenn Sie versuchen, um returnOUT
es über eine Prozedur / Funktion. Auch OP-Absicht, nicht zurückzukehren, resultset alsOUT
parameter.Die Frage ist wirklich: was willst du tun mit den Ergebnissen ?.
So ziemlich alle typischen SELECT-Anweisungen in Anwendungen eingesetzt, die mehrere Ergebnisse zurückgeben - vielleicht eine Menge von Ihnen. Anwendungen müssen dann bereit sein, zu behandeln die Ergebnisse eins nach dem anderen. Die Art und Weise dies geschieht, hängt von der Sprache Ihrer Anwendung geschrieben ist. Für Java zum Beispiel gibt die Abfrage eine
ResultSet
Objekt, über die Sie iterieren mit seinernext()
Methode. Python verwendet ähnliche Techniken.In PL/SQL, nur eine for-Schleife verwenden. Keine Notwendigkeit zu verwenden die explizite Cursor:
Innerhalb der Schleife beziehen sich auf die Spalten zurückgegeben, in der jedes Ergebnis, indem Sie mit der loop-variable (hier
t
). Zum Beispiel:Natürlich kann ich mir vorstellen, dass der Zweck Ihrer Anwendung ist nicht zum drucken der Ergebnisse in sqlplus. Sie können die Berechnung auf das Ergebnis haben, schreiben Sie Sie aus einer anderen Tabelle ...
Nun, wenn Ihr Zweck ist, zu speichern Sie das Ergebnis in einer Tabelle für die spätere Verarbeitung, dann nur dieser:
oder
Was also der Sprache der Anwendung, die Sie benutzen ? Und was tun Sie mit den Ergebnissen Ihrer Abfrage ?
EDIT:
Können Sie vereinfachen Ihre syntax ein wenig, indem Sie schreiben:
Und die Rückkehr
sdo_geom.relate(target.geom, 'determine', query.geom, 0.05)
ist sinnlos, da Sie überprüfen Sie die TOUCH-Beziehung: das Ergebnis wird immer TOUCH. Es fügt nur auf die CPU-Kosten für das ausführen der Abfrage.