Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Gibt Datenzeilen aus einem pl/sql-Block zurück

Ein anonymer Block kann nichts zurückgeben. Sie können einer Bind-Variablen innerhalb des Blocks Werte zuweisen, einschließlich eines Sammlungstyps oder eines Ref-Cursors. Aber die Sammlung müsste außerhalb des Blocks definiert und deklariert werden. Das heißt, es müsste ein Typ sein, den Sie in einfachem SQL verwenden können, nicht etwas, das in PL/SQL definiert ist. Im Moment verwenden Sie einen PL/SQL-Typ, der innerhalb des Blocks definiert ist, und eine Variable, die ebenfalls innerhalb des Blocks deklariert ist - sie liegt also außerhalb des Gültigkeitsbereichs des Clients und wäre auch außerhalb davon kein gültiger Typ . (Es muss auch nicht initialisiert werden, aber das ist ein kleines Problem).

Abhängig davon, wie es tatsächlich verwendet wird, besteht eine Option darin, einen Ref-Cursor zu verwenden, und Sie können dies über SQL*Plus oder SQL Developer mit der variable deklarieren und anzeigen und print Befehle. Zum Beispiel:

variable rc sys_refcursor

begin
  open :rc for ( select ... /* your cursor statement */ );
end;
/

print rc

Sie können etwas Ähnliches von einer Clientanwendung aus tun, z. Haben Sie eine Funktion, die einen Ref-Cursor oder eine Prozedur mit einem Out-Parameter zurückgibt, der ein Ref-Cursor ist, und binden Sie diesen von der Anwendung. Iterieren Sie dann als Ergebnismenge über den Ref-Cursor. Die Details hängen jedoch von der Sprache ab, die Ihre Anwendung verwendet.

Eine weitere Option ist eine Pipeline-Funktion, die einen Tabellentyp zurückgibt – wiederum definiert auf SQL-Ebene (mit create type). ) nicht in PL/SQL - was weniger Ressourcen verbrauchen könnte als eine Sammlung, die auf einmal zurückgegeben wird.

Aber ich muss fragen, warum Sie das tun. Sie sagten, "das Graben nach späteren Stapeln dauert erheblich länger", was so klingt, als würden Sie in Ihrer Abfrage einen Paging-Mechanismus verwenden, eine Zeilennummer generieren und dann einen Bereich von 100 darin auswählen. Wenn Ihr Client/Ihre Anwendung alle Zeilen abrufen möchte, wäre es einfacher, eine einzelne Abfrage auszuführen, aber Fetch die Ergebnismenge in Stapeln.

Ohne Angaben zur Anwendung ist dies leider nur Spekulation...