RECORD: wert an unbestimmter Stelle

Hallo gerd,

meine vorherige Antwort ist falsch. Du greift in Deinem Demo auf eine Tabelle zu. “therecord” ist nirgends vom Type RECORD definiert. Man muss also als erstes die Zeile selektieren.


In der Triggerfunktion würde das dann z.B. so aussehen:

EXECUTE 
' 
'thevalue:=OLD.' || colname; 
'

mfg

fristo

Danke, war offensichtlich ein Druckfehler. Sollte heißen:

DECLARE
  thevalue text]
Das lässt sich aber schon nicht übersetzten, Fehlermeldung des Compilers:
ERROR:  syntax error at or near "$1" bei Zeichen 15
ANFRAGE:  SELECT  '
  ' $1 := $2 .' || colname || '
KONTEXT:  SQL statement in PL/PgSQL function "get_column_value" near line 12

Nach Ersetzen der Zuweisung durch[code]  -- Zuweisung thevalue := arecod.<colname> über Execute
  _sql := 'thevalue:=arecord.' || colname || ';';
  EXECUTE _sql;

ist der Compilerfehler weg.
Dafür gibt es zur Laufzeit (angestoßen select get_column_value(1, ‘name’); ) weiterhin den bekannten Fehler:
ERROR: syntax error at or near “thevalue” bei Zeichen 1
ANFRAGE: thevalue:=arecord.name;

Gerd

Auch eine Zuweisung der Form value:=rowtypeval. bekomme ich nicht gelöst (mit DECLARE value text; rowtypeval tabellenname%ROWTYPE; der Inhalt einer text-Vaiablen mit dem Namen einer Spalte in tabellenname).
Es liegt also nicht direkt am RECORD-type.

Mittlerweile bin ich auf zwei mögliche work-arouds gekommen:

(1) Der Inhalt einer Variablen vom ROWTYPE sieht als Text so aus:
‘(,,…,)’, die einzelnen Zellinhalte stehen also kommagetrennt hintereinander. Unter Verwendung von pg_attributes ist es mit Zeichenkettenoperationen möglich, auf den gewünschten Inhalt zuzugreifen.
Nachteil: Bei möglicher Änderung der internen Darstellung eines ROWTYPE in späteren PG-Versionen funktioniert nix mehr.

(2) Für jede Tabelle tabellenname wird eine Funktion
“tabellenname_get_column_value(arow tabellenname%ROWTYPE, colname text) retunrs text”
bereitgestellt, die nichts weiter macht als
CASE
WHEN colname=‘colname1’ THEN RETURN arow.colname1
WHEN colname=‘colname2’ THEN RETURN arox.colname2
/* … */
ELSE RAISE EXCEPTION ‘Unknown colname’; RETURN ‘’;
END;
Diese Funktion wird dann anstelle der direkten Zuweisung aufgerufen.
Nachteil: Für jede Tabelle muss diese Funktion existieren. Der Rückgabetyp muss TEXT sein, um die Werte aller möglichen Variablentypen ausgeben zu können.

Welche Variante erscheint euch als die bessere? Sind - neben der von ads gezeigten C-Alternative - noch weitere work-arounds möglich?

Beste Grüße

Gerd

Hallo gerd,

ich habe die Ursache für das Problem gefunden. In der Doku steht geschrieben


EXECUTE befehl;

Beachten Sie insbesondere, dass in der Befehlszeichenkette keine > PL/pgSQL-Variablen > ersetzt werden. > Die Werte von Variablen müssen beim Aufbauen der Befehlszeichenkette eingefügt werden.

Es geht also definitiv so nicht mit PL/pgSQL (wegen der eingesetzen Variablen).



mfg

fristo

Danke, jetzt haben wir’s also rot auf weiß.

Gerd