Existenz von Feldern prüfen

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

Andreas

Er will dann aber sicherlich als zweites auch auf den Wert zugreifen - und das funktioniert in pl/pgSQL nicht.

Da wirst du auf eine andere Programmiersprache ausweichen müssen.

Oach, sei nicht so pingelig :wink:

Andreas

Ich denke halt voraus :wink:

Hallo,
das ist ja schade:

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 :slight_smile:

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.

mfg Volker

ja, genau der Punkt geht in pl/pgSQL leider nicht. Da ärgere ich mich auch schon seit Jahren.