Hallo,
ich suche eine Funktion oder einen Operator, die/der mir verrät, ob in einem Record ein bestimmtes Feld vorhanden ist.
Also etwa ein
...
IF is_defined('NEW.nachname') THEN
...;
END IF;
...
mfg Volker
PS: Alternativ/Zusätzlich würde mir vermutlich eine echte Referenz zu PL/pgSQL helfen, die besser (vollständiger) ist, als das Kapitel 39 des PostgreSQL-Manuals.
Du könntest versuchen, darauf zuzugreifen und einen Fehler abfangen.
test=# \d parts
Table "public.parts"
Column | Type | Modifiers
----------+---------+-----------
part | text |
sub_part | text |
quantity | integer |
Triggers:
trg_insert BEFORE INSERT ON parts FOR EACH ROW EXECUTE PROCEDURE trg_parts()
test=# create or replace function trg_parts() returns trigger as $$begin raise notice 'NEW.my_field : %', NEW.my_field; exception when undefined_column then raise notice 'undefined column'; return NEW; end; $$ language plpgsql;
CREATE FUNCTION
test=*# insert into parts values ('x','y',1);
NOTICE: undefined column
INSERT 0 1
Er will dann aber sicherlich als zweites auch auf den Wert zugreifen - und das funktioniert in pl/pgSQL nicht.
Ich wollte nämlich meine alte in Python geschrieben Funktion, um in beliebigen Tabellen ein CHANGED-Datum zu aktualisieren auf PL/pgSQL umschreiben, nachdem ich nun meinte, diese Sprache auch langsam begriffen zu haben
CREATE OR REPLACE FUNCTION changed()
RETURNS trigger AS
$BODY$
if not 'datetime' in dir():
import datetime
if not 'changed' in TD['new']:
return None
if TD['event'] == 'UPDATE':
upd = False
for k in TD['new'].keys():
if not TD['new'][k] == TD['old'][k]:
upd = True
break
if not upd:
return None
TD['new']['changed'] = datetime.datetime.now()
return 'MODIFY'
$BODY$
LANGUAGE 'plpythonu' VOLATILE
COST 100;
und da fällt dann wohl auch die Umsetzung der Konstruktion
for k in TD['new'].keys() ...
mangels gib-mal-die-Felder-eines-Satzes() auf die Nase.
Ansonsten lassen sich ja die meisten meiner bisher mangels PL/pgSQL-Kentnissen in PL/Python geschriebenen Funktionen in PL/pgSQL (deutlich) kürzer schreiben.