oracle; plsql; select in variable speichern

binfgi

Mitglied
Hallo,
ich habe folgendes Problem:

Für z.B das plsql-statement:
Code:
DECLARE
outputtext varchar2(500):=NULL;
BEGIN
select a into outputtext from tabelleA
END;

Das Problem dabei ist, das 'outputtext' ein varchar ist, das Ergebnis des select ist aber eine Spalte mit mehreren Zeilen.
Nun zu meiner Frage. Ist es möglich die Ergebniszeilen sozusagen aneinander zu hängen, damit ich das ganze in einen varchar speichern kann?

Oder kann ich das select in ein Array speichern und die einzelnen Einträge des Arrays dann konkatenieren?

Dankeschön!
 
Zuletzt bearbeitet:
Hi,

Eine genaue Lösung für dein Problem hab ich nicht.
Aber ich hätte eine Workaround für dich, falls du zu keiner richtigen Lösung kommst:
Du könntest eine Cursor schreiben, der über deine Datensätze läuft und dies dann aneinander hängen.
Ist zwar nicht die elganteste Variante aber wie gesagt wäre ein Workaround.
 
Also erstmal geht Dein Beispiel so nicht, aber es ist ja vermutlich nicht der richtige Code. SELECT INTO geht nur mit Anfragen, die genau eine Zeile zurück liefern, sonst bekommst Du einen ORA-Fehler. Die Lösung des Problems ist, wie schon beschrieben, einen Cursor zu bauen und das Ergebnis "händisch" zusammenzufügen.
 
Code:
DECLARE
 cursor get is
  select a from TabelleA;
 
 outputtext varchar2(500):=NULL;
BEGIN
open get;
loop
   fetch get into outputtext;
   exit when get%NOTFOUND;
  --hier wird dann der wert von spalte a zeileweise verarbeitet
end loop;
close get;
END;

ich würde zusätzlich am ende eine exception einbauen.
 
Die Lösung ist im Prinzip richtig, ab Oracle 10g würde ich es aber anders lösen. Ein BULK Collect ist wesentlich schneller und effizienter als ein LOOP über ein Cursor. Das Problem beim obigen LOOP sind die Wechsel zwischen der PL/SQL Engine und der SQL Engine in Oracle. Das kostet Zeit. Ein BULK Collect kostet zwar etwas mehr Speicher, ist dafür aber um einiges schneller.

Hier ein Beispiel:
Meine Tabelle:
Code:
SQL> select * from test;

TEXT
--------------------------------------------------
Text1
Text2
Mein script test.sql
Code:
set serveroutput on
declare

	TYPE myROW IS TABLE OF test%ROWTYPE;
	myROWArray myROW;

begin

	SELECT	*
	BULK COLLECT INTO myROWArray
	FROM   test;

	DBMS_OUTPUT.put_line( 'RowCount: ' || myROWArray.COUNT );

	FOR i IN myROWArray.FIRST .. myROWArray.LAST LOOP

		DBMS_OUTPUT.put_line( i || ': ' || myROWArray( i ).text );

	END LOOP;

end;
/
Und das Ergebnis:
Code:
SQL> @test
RowCount: 2
1: Text1
2: Text2

PL/SQL-Prozedur erfolgreich abgeschlossen.
 
Zurück