Dynamische Abfrage

Hallo,

ich möchte in PostgreSQL eine Funktion schreiben die 2 Übergabeparameter besitzt. Der eine Parameter ist ein SQL Befehl und der andere ein CRC Hash. Die Funktion soll einen CRC Hash von dem Befehl (rein Text) erzeugen und mit dem angehängten Hash vergleichen. Bei Übereinstimmung soll der SQL Befehl ausgeführt werden.

Eine CRC Funktion ist vorhanden. Die untenstehende Abfrage soll nur die richtigen Werte ausgeben.

CREATE OR REPLACE FUNCTION read_data(befehl text)
RETURNS SETOF record AS
$BODY$
DECLARE
	r record;
BEGIN
	FOR r IN EXECUTE befehl
	LOOP
		RETURN NEXT r;
	END LOOP;
	RETURN;
END;
$BODY$
LANGUAGE 'plpgsql';

Und das ist die Fehlermeldung wenn ich

SELECT read_data('SELECT * FROM test WHERE id = 1')

ausführe:

ERROR: set-valued function called in context that cannot accept a set
KONTEXT: PL/pgSQL function “read_data” line 9 at RETURN NEXT

********** Fehler **********

ERROR: set-valued function called in context that cannot accept a set
SQL Status:0A000
Kontext:PL/pgSQL function “read_data” line 9 at RETURN NEXT

Vielen Dank im Voraus!

Das ist schon so fast okay, was fehlt ist:

  • select * from <deine_funktion>
  • eine Definition der Spalten, die geliefert werden

Original mit Deiner Funktion funktioniert dies mit meiner Tabelle t1:

test=*# select * from t1;
 id | name
----+------
  1 | abc
  2 | def
  3 | ghi
(3 rows)

test=*# select * from read_data('select * from t1') as (id int, name text);
 id | name
----+------
  1 | abc
  2 | def
  3 | ghi
(3 rows)

Danke für die schnelle Antwort!

select * from read_data('select * from test') as (id int, status int);

Wenn ich das ausführe kommt:

ERROR: wrong record type supplied in RETURN NEXT
KONTEXT: PL/pgSQL function “read_data” line 6 at RETURN NEXT

********** Fehler **********

ERROR: wrong record type supplied in RETURN NEXT
SQL Status:42804
Kontext:PL/pgSQL function “read_data” line 6 at RETURN NEXT

Ja, ich schrieb ja auch, für meine Tabelle t1, die ich ja auch zeigte. Ich kenne nicht die Spalten deiner Tabelle test.

Gibt’s noch eine Möglichkeit das Ganze abzukürzen? Also ohne dieses “AS (…)”?