Einen schönen guten Morgen,
Hintergrund:
In einer Triggerfunktion für onAfterDelete will ich bestimmte Aktionen für Spaltenwerte des gelöschten Eintrags (der mir ja in der Variablen OLD noch zur Verfügung steht) ausführen. Den Spaltennamen kenne ich erst zur Laufzeit.
Frage:
Wie kann ich auf den Wert eines record an einer in einer Variablen gespeicherten Stelle zugreifen (in etwa value := record.)? Oder gibt es irgendeinen würg-around?
Vielen Dank für eure Hilfe bei der Entfernung des Brettes vor dem Kopf
Gerd
Umgebung: PostgreSQL 8.1.3, Suse Linux 9.2
Komplettes Demo-Beispiel:
– Testtabelle
CREATE TABLE test
(
id int4 PRIMARY KEY,
name text
description text
);
– Funktion
CREATE FUNCTION get_column_value(id int4, colname text)
RETURNS text AS
$BODY$
DECLARE
thevalue text;
arecord record;
_sql text;
BEGIN
– record holen (ist klar)
SELECT * INTO arecord FROM test WHERE id=$1;
– (V1) thevalue := arecord.colname;
– runtime error: record “arecord” has no field “colname”
– (V2.1) _sql := ‘SELECT ’ || therecord || ‘.’ || colname || ’ AS value;’;
– runtime error: column “therecord” does not exist
_sql := ‘SELECT therecord .’ || colname || ’ AS value;’;
– runtime error: missing FROM-clause entry for table “therecord”
FOR arecord IN EXECUTE _sql
LOOP
thevalue := arecord.value;
END LOOP;
RETURN thevalue;
END;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE;
– AUFRUF
INSERT INTO test (id, name, description)
VALUES (1, ‘paul mueller’, ‘der mueller, paul’);
SELECT * FROM get_column_value(1, ‘name’);[/list]