Ich versuche eine Funktion in PL/PgSQL zu schreiben, die mit einer Tabelle arbeiten muss, die sie als Parameter empfängt.EXECUTE ... USING-Anweisung in PL/pgSQL funktioniert nicht mit Datensatztyp?
Ich benutze EXECUTE..INTO..USING Anweisungen innerhalb der Funktionsdefinition, um dynamische Abfragen zu erstellen (es ist die einzige Weise, die ich weiß, dies zu tun), aber ... Ich habe ein Problem mit RECORD Datentypen.
Betrachten wir das folgende (extrem vereinfachte) Beispiel.
-- A table with some values.
DROP TABLE IF EXISTS table1;
CREATE TABLE table1 (
code INT,
descr TEXT
);
INSERT INTO table1 VALUES ('1','a');
INSERT INTO table1 VALUES ('2','b');
-- The function code.
DROP FUNCTION IF EXISTS foo (TEXT);
CREATE FUNCTION foo (tbl_name TEXT) RETURNS VOID AS $$
DECLARE
r RECORD;
d TEXT;
BEGIN
FOR r IN
EXECUTE 'SELECT * FROM ' || tbl_name
LOOP
--SELECT r.descr INTO d; --IT WORK
EXECUTE 'SELECT ($1)' || '.descr' INTO d USING r; --IT DOES NOT WORK
RAISE NOTICE '%', d;
END LOOP;
END;
$$ LANGUAGE plpgsql STRICT;
-- Call foo function on table1
SELECT foo('table1');
Es Ausgang der folgende Fehler:
ERROR: could not identify column "descr" in record data type
obwohl die Syntax habe ich mir gültig zu sein scheint. Ich kann die statische Auswahl (im Beispiel kommentiert) nicht verwenden, da ich die Spaltennamen dynamisch beziehen möchte.
Also ... jemand weiß, was ist falsch mit dem obigen Code?
Ihr Code funktioniert nicht. – Hobbes
Ok Entschuldigung, offensichtlich funktioniert Ihr Code, indem Sie "xx" durch "table1" ersetzen. Aber so kann ich den Tabellennamen nicht dynamisch spezifizieren. Die richtige Antwort lautet also: "EXECUTE 'SELECT $ 1 :: text :: table1.descr' INTO d VERWENDUNG von r;". DANKE VIELMALS! – Hobbes