Hi,
Ich versuche einen Zufälligen Datensatz zu lesen. Die Funktion wird mit eine Suchbegriff aufgerufen. Ein DS der zum Suchbegriff passt soll gelesen werden. Existieren mehrere DS, so soll per Zufall ein DS ausgewählt werden.
Existiert zum Suchbegriff kein DS, so soll einfach ein bel. DS zurückgeliefert werden.
So habe ich es probiert:
CREATE OR REPLACE FUNCTION tfeld (such varchar, stufe int)
returns table (id int, erg int) AS $$
DECLARE
c_heute varchar;
erg int;
sqlex varchar;
stufeflag int;
pos int;
BEGIN
c_heute= to_char(now(), 'YYYYmmdd');
stufeflag=POWER(2,(stufe));
sqlex='SELECT ID FROM tabelle WHERE s LIKE ''%'||such||'%'' AND ((stufe & '||stufeflag||')<>0) AND '||c_heute||' BETWEEN von AND bis';
EXECUTE sqlex;
GET DIAGNOSTICS erg = ROW_COUNT;
--wenn nichts gefunden, dann einfach alle DS holen
IF erg=0 then
sqlex='SELECT ID FROM tabelle WHERE ((stufe & '||stufeflag||')<>0) AND '||c_heute||' BETWEEN von AND bis';
EXECUTE sqlex;
GET DIAGNOSTICS erg = ROW_COUNT;
end if;
--wenn mehr als ein DS gefunden wurde, dann muß ein DS ausgewählt werden!
if erg>1 then
pos= 1+((random()*erg-1+1))::integer;
else
pos=1;
end if;
-- hier müsste ich jetzt die ID des pos-ten Datensatzes auslesen
return query select pos, erg;
END;
$$ LANGUAGE plpgsql;
Wie kann ich jetzt die ID zum posten Datensatz auslesen? Ich vermute mal das geht so nicht.
Ich habe es dann per Cursor versucht:
OPEN crsr FOR SELECT ID FROM tabelle
MOVE FORWARD 2 IN crsr;
FETCH crsr INTO xid;
close crsr;
Das klappt nur teilweise. Ich muss dem OPEN-Befehl ja eigentlich noch angeben wonach selektiert werden soll. Sobalt ich aber den Selectstring zusammensetze, bekomme ich Fehlermeldungen (z. B.
FEHLER: ungültige Eingabesyntax für ganze Zahl: »||c_heute||«; Error while executing the query)
Wie kann ich den SELECT-String für OPEN zusammensetzen und wie kann ich rausfinden, wieviele Zeilen der Cursor enthält? Mit ROW_COUNT bekomme ich immer nur 1 zurück.