Werte Prüfen und anderes Feld mit Resultat füllen

Hallo,

ich habe in einer Tabelle 2 wesentliche Felder. Artikel(char(12)) und Artik=
elart(char(1)).
Die Artikelart ist so definiert, dass:
wenn Artikellänge =3D 8 dann Artikelart=3D'm'
wenn Artikellänge =3D 12 dann Artikelart=3D'a'
es können über ein Check-Constraint nur Artikel mit 8 oder 12 Stellen e=
ingefügt werden. Nun habe ich aber das Problem, mit dem Prüfen für di=
e Artikelart.
Ich habe bisher sehr wenig Erfahrungen mit Funktionen und Triggern und mö=
chte mir dieses Wissen bis jetzt mal aufbauen. Brauche dazu aber noch ein w=
enig Hilfe.

Mein Trigger hat den Aufbau:
CREATE TRIGGER trg_set_artikelart
AFTER INSERT OR UPDATE
ON artikel
FOR EACH STATEMENT
EXECUTE PROCEDURE proc_artikelart();

CREATE FUNCTION proc_artikelart()
.......
if length(artikel.artikel) =3D 8 then artikel.artikelart =3D 'm'
if length(artikel.artikel) =3D 12 then artikel.artikelart =3D 'a'
.....

Die Frage ist nur:
Was muss ich der Funktion proc_artikelart() alles übergeben? Was fehlt no=
ch und vor allem, wie weiss ich, dass ich im aktuellen Datensatz bin? Ich h=
abe zwar einige Bücher, aber meistens wird das Thema Funktionen nur damit=
abgehandelt, dass 2 Werte zusammengezählt werden usw., aber nicht wirkli=
ch wieder zurück in die Datenbanktabelle geschrieben wird.

Vielen Dank im Voraus

Daniel Seichter


---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend
Daniel Seichter [ Di, 06 Dezember 2005 10:47 ] [ ID #1089881 ]

Re: We

am 06.12.2005, um 10:47:38 +0100 mailte Daniel Seichter folgendes:
> Hallo,
>
>
> Mein Trigger hat den Aufbau:
> CREATE TRIGGER trg_set_artikelart
> AFTER INSERT OR UPDATE
> ON artikel
> FOR EACH STATEMENT
> EXECUTE PROCEDURE proc_artikelart();
>
> CREATE FUNCTION proc_artikelart()
> ......
> if length(artikel.artikel) =3D 8 then artikel.artikelart =3D 'm'
> if length(artikel.artikel) =3D 12 then artikel.artikelart =3D 'a'
> ....
>
> Die Frage ist nur:
> Was muss ich der Funktion proc_artikelart() alles übergeben? Was fehl=
t
> noch und vor allem, wie weiss ich, dass ich im aktuellen Datensatz

http://www.postgresql.org/docs/8.1/interactive/plpgsql-trigg er.html

Du übergibst _NICHTS_, deklarierst aber die Funktion als 'RETURNS
trigger'. Innerhalb der Funktion hast Du mit NEW.<Spaltenname> Zugriff
auf die einzelnen Spalten.

Und ein INSERT or UPDATE - Trigger sollte BEFORE feuern. Der Rest siehe
Link, da ist auch ein Beispiel.


PS.: stell mal einen gescheiten Zeilenumbruch ein, trotz 21" passen
Deine Zeilen nicht auf den Monitor.


Andreas
--
Andreas Kretschmer (Kontakt: siehe Header)
Heynitz: 035242/47212, D1: 0160/7141639
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
=3D=3D=3D Schollglas Unternehmensgruppe =3D=3D=3D

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster
andreas.kretschmer [ Di, 06 Dezember 2005 11:02 ] [ ID #1089882 ]

Re: Werte Prüfenund anderes Feld mit Resultat

Daniel Seichter writes:

> ich habe in einer Tabelle 2 wesentliche Felder. Artikel(char(12))
> und Artikelart(char(1)).
> Die Artikelart ist so definiert, dass:
> wenn Artikellänge =3D 8 dann Artikelart=3D'm'
> wenn Artikellänge =3D 12 dann Artikelart=3D'a'
[...]
> es können über ein Check-Constraint nur Artikel mit 8 oder 12
> Stellen eingefügt werden. Nun habe ich aber das Problem, mit dem
> Prüfen für die Artikelart.

Wieso hältst du überhaupt "Artikelart" auf der Platte, wenn die Spalt=
e
redundant ist? Besseres Design wäre, sie aus der anderen in einer
Sicht zu erzeugen. Etwa so:

create view artikel_view as
select artikel,
case
when length(artikel) =3D 8 then 'm'
when length(artikel) =3D 16 then 'a'
else NULL
end as Artikelart
from artikel;

Dann müsstest du auch nicht per Trigger um die Anomalien
herumarbeiten.

Gruß
Andreas
--

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend
Andreas Seltenreich [ Di, 06 Dezember 2005 22:52 ] [ ID #1089889 ]
Datenbanken » gmane.comp.db.postgresql.german » Werte Prüfen und anderes Feld mit Resultat füllen

Vorheriges Thema: PL/pgSQL Zuweisungsoperator
Nächstes Thema: Import von 1,6Mio Datensätzen