Hallo Frank!
Ich will dir ja nicht auf den Schlips treten aber: Deine Lösung tut zwar etwas, das man eventuell als Lösung des Problems für einen speziellen Fall durchgehen lassen kann, aber ohne weitere Angaben des Fragestellers kommen wir mA hier nicht zum Schluss.
Selbst wenn deine angebotene Lösung genau der Intention entsprechen würde, bleibt immer noch das Problem, dass das Ergebnis des Funktionsaufrufs nicht zwangsläufig das von dir angegebene ist: Da der Cursor keine „order by“-Klausel enthält ist auch die Reihenfolge beim Einlesen der Sätze nicht definiert. Die von Dir angegebene Funktion liefert also mit gleicher Wahrscheinlichkeit:
ID TEXT
---------------------------------------------------
1 Frank Hallo // remark2 remark
3 ist der hier Text // remark4 remark3 remark5
oder (wobei sich hier die Vertauschung der IDs ja wenigstens noch leicht lösen ließe) (Anmerkung: der GROUP BY im select macht zumindest auf Oracle einen impliziten ORDER BY, das ist allerdings meines Wissens nicht im ANSI Standard enthalten und kann sich daher jederzeit ändern):
ID TEXT
---------------------------------------------------
3 ist der Text hier // remark4 remark5 remark3
1 Frank Hallo // remark2 remark
Man müsste also noch nach dem Kommentar sortieren, das wird allerdings alles andere als trivial, wenn die Ausgangstabelle so aussieht:
ID TEXT
--- ------------------------------
1 Hallo // remark
1 Frank // Anmerkung 2
3 hier // Kommentar10
3 ist der // Kommentar011
3 Text // remark: gehört gleich nach "Kommentar 011"!
Ich bleibe also bei meiner Meinung (siehe http://www.wer-weiss-was.de/cgi-bin/forum/showarchiv…), dass das Problem mit den angegebenen Voraussetzungen nicht oder nur ungenügend lösbar ist.
Gruß,
Martin
Hallo Denis,
ich habe das so gelöst:
TABLLE:
ID TEXT
1 Hallo // remark
1 Frank // remark2
3 hier // remark3
3 ist der // remark4
3 Text // remark5
create or replace function get_text(v_id number)
return varchar2 is
v_text varchar2(256);
v_return varchar2(256);
v_remark varchar2(256);
cursor c1 is select * from text_id
where id = v_id;
begin
v_text := ‚‘;
v_return := ‚‘;
v_remark := ‚‘;
for curs in c1 loop
v_text := substr(curs.text,1,instr(curs.text,’//’)-1);
v_return := v_return ||’ ‚||v_text;
v_remark := v_remark ||
substr(curs.text,instr(curs.text,‘//’)+2, length(curs.text));
end loop;
v_return := v_return || ‚//‘ || v_remark;
return v_return;
end;
/
select id, get_text(id) text from text_id
group by id, get_text(id);
Ausgabe:
ID TEXT
1 Hallo Frank // remark remark2
3 hier ist der Text // remark3 remark4 remark5