Weiter Zurück Inhalt

4. Serverseitige Funktionen

PostgreSQL bietet selbst eine Fülle von Funktionen, aber man kann diese auch selbst erweitern. Dazu stehen mehrere Programmiersprachen bereit, von C über SQL und PLPGSQL bis PERL, Java und Tcl.

Diese Funktion soll es für uns einfacher machen, anhand des Typs einer Buchung zu erkennen, ob es eine Zu- oder Abbuchung ist.

001 --
002 -- eine Hilsfunktion, wir werden sie noch brauchen
003 -- sie wird uns Schreibarbeit ersparen
004 --
005 create or replace function get_saldo (char(1), decimal(10,2)) returns decimal(10,2) as $$
006 DECLARE
007         typ alias for $1;
008         wert alias for $2;
009 BEGIN
010         if typ ~ 'Z' THEN
011                 return wert;
012         else
013                 return wert * -1;
014         END IF;
015 END; $$
016 language plpgsql;
017 
018 
019 --
020 -- folgende Funktion nutzt die Möglichkeit von PERL, persistente Variablen
021 -- handhaben zu können. Dies brauchen wir, um eine schöne Liste aller Kontobewegungen
022 -- inclusive des Zeitpunktes und des zu diesem Zeitpunkt gültigen Saldos erstellen
023 -- zu können.
024 --
025 create or replace function prev_saldo(numeric(10,2)) returns numeric(10,2) AS '
026         my $in_saldo = $_[0];
027         my $out_saldo = 0;
028         if ( defined $_SHARED{''saldo''} ) {
029                 $out_saldo = $_SHARED{''saldo''} + $in_saldo ;
030         } else {
031                 $out_saldo = $in_saldo;
032         }
033         $_SHARED{''saldo''} = $out_saldo;
034         return $out_saldo;
035 ' language 'plperl';
036 
037 
038 --
039 -- Nun haben wir zwar in PERL uns eine persistente Variable mit dem Saldo der letzten Buchung
040 -- geschaffen, nur wenn wir die Funktion erneut aufrufen wollen (für eine neue Liste),
041 -- müssen wir diese Variable zurücksetzen.
042 -- Die Funktion ist in PLPERL geschrieben
043 --
044 create or replace function reset_saldo() returns void AS '
045         $_SHARED{''saldo''} = undef;
046 ' language 'plperl';
047 
048 
049 
050 
051 --
052 -- der Einfachkeit halber fassen wir das mal zusammen
053 -- Unsere Funktion soll eine Liste von Werten zurückgeben, das ist eine
054 -- SRF-Funktion (Set Returning Function)
055 -- Für diese müssen wir uns erst einmal einen neuen Typ definieren
056 --
057 create type saldeninfo as (kontonr bigint, 
058 			   zeitpunkt timestamptz, 
059 			   zugang numeric(10,2), 
060 			   abgang numeric(10,2),
061 			   text varchar,
062 			   saldo numeric(10,2));
063 
064 
065 
066 --
067 -- Nun die Funktion, sie ist in der Sprache SQL definiert
068 --
069 create or replace function saldeninfo( int ) returns setof saldeninfo as $$
070 	select reset_saldo();
071 	select kontonr, ts, case when typ = 'Z' then wert when typ = 'A' then NULL END as zugang,
072 		case when typ = 'Z' then NULL when typ = 'A' then wert end as abgang,
073 		text,
074 		prev_saldo(get_saldo(typ, wert))::numeric(10,2) as saldo
075 		from (select kontonr, ts, typ, wert, text from buchungen where kontonr = $1 order by ts) as x;
076 $$
077 language sql;
078 
079 
Download function.sql


Weiter Zurück Inhalt