Hallo zusammen,
ich habe ein kleines Syntaxproblem, bei dem ich Euch um euren Rat fragen wollte:
Ein generischer Trigger soll bei mir dafür sorgen, dass ein Wert berechnet wird. Vereinfacht dargestellt, hab ich mir das so gedacht:
Nun möchte ich gerne diesem Trigger beim Aufruf einen (später dann mehrere) Parameter übergeben...Code:CREATE OR REPLACE FUNCTION bla.tsv_trigger() RETURNS trigger AS $BODY$ BEGIN new.tsv := setweight(to_tsvector('pg_catalog.english', new.title)); return new; END $BODY$;
und auf diese im Trigger über z.B. TG_ARGV[0] zugreifen und die Zuweisung beeinflussen.Code:CREATE TRIGGER tsv_update BEFORE INSERT OR UPDATE ON bla.test FOR EACH ROW EXECUTE PROCEDURE bla.tsv_trigger('title');
Also ungefähr so:
new.tsv := setweight(to_tsvector('pg_catalog.english', new.TG_ARGV[0]));
Das ist natürlich syntaktisch nicht korrekt. Könnt ihr mir sagen, wie ich auf ein Feld zugreifen kann, dessen Namen ich in einer Variable halte?
Ich möchte gerne über den mit übergebenen Namen das entsprechende Feld in die Gewichtung einrechnen.
Vielen Danke für Eure Hilfe,
az_hf0
Wie wäre es nur mit TG_ARGV[0]? Zumindest ist die Dokumentation zu diesem Thema vorhanden, einfach mal dort hineinschauen.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Vielleicht habe ich das etwas mißverständlich ausgedrückt:
Ich möchte den Trigger auf der Tabelle
TABLE bla.test
title: text
tsv: tsvector
aufrufen:
CREATE TRIGGER tsv_update
BEFORE INSERT OR UPDATE
ON bla.test
FOR EACH ROW
EXECUTE PROCEDURE bla.tsv_trigger('title');
In der Triggerfunktion möchte ich dann dynamisch über TG_ARGV[0] den *Namen der Tabellenspalte* ermitteln, aus der ich lesen möchte. In diesem Fall also möchte ich aus der Spalte/Attribut 'title' lesen, also auf new.title zugreifen. Ich möchte nicht den Wert 'title' erhalten, sondern über eine Indirektion sozusagen dereferenzieren.
Dazu kann ich in der Dokumentation nichts finden. Vielleicht hast du einen Tipp, wo ich etwas über diese Dereferenzierung nachlesen kann?
Grüße
az_hf0
Dann hast Du somit ein dynamisches SQL, welches Du ausführen willst -> guggst Du EXECUTE 'your query'.
PostgreSQL: Documentation: Manuals: PostgreSQL 8.4: Basic Statements
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Hallo Andreas,
ich hatte mir bereits überlegt, EXECUTE... zu verwenden. Das trifft es jedoch nicht ganz, da ich einen BEFORE INSERT OR UPDATE Trigger verwende. Der Wert, an den ich rankommen möchte verbirgt sich hinter
new.{Wert in TG_ARGV[0]}
Wenn also in TG_ARGV[0] der String 'title' steckt, möchte ich gerne auf new.title zugreifen. Das klappt mit EXECUTE doch so nicht, oder?
Grüße
az_hf0
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Hallo,
wir haben im Büro etwas gekränkelt und da hat es etwas gedauert, bis wir uns wieder voll und ganz unserem Problem widmen konnten.
Vielen Dank nochmal für eure Tips. Ihr lagt (wie immer) goldrichtig.
Ich habe das ganze jetzt mit meinem Kollegen so gelöst:
EXECUTE 'SELECT $1.' || column_name INTO column_value USING new;
Grüße
az_hf0
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen