En SQL-funksjon inneholder kun sql-kode
Lag en SQL-funksjon som skriver ut navnet til en pasient med en angitt pasient_id create function finnPasientNavn(int) returns text as ' select m.navn from menneske m, pasient p where m.personnr = p.personnr and p.pasient_id = $1; ' language sql; select finnPasientNavn(5); finnpasientnavn ----------------- Anne Andersen (1 row)
Lag en SQL-funksjon som skriver ut all informasjon om en lege med en angitt lege_id create function finnLegeInfo(int) returns lege as ' select * from lege where lege_id = $1; ' language sql; select * from finnLegeInfo(2); lege_id | personnr | tlf_intern | legekontor ---------+--------------+------------+------------ 2 | 150854 10745 | 3215 | 1 (1 row)
Lag en SQL-funksjon som skriver ut navnet på alle leger på et angitt legekontor create function finnLegersNavn(int) returns setof text as ' select m.navn from lege l, legekontor lk, menneske m where lk.legekontor_id = l.legekontor and l.personnr = m.personnr and legekontor_id = $1; ' language sql; select finnLegersNavn(1) AS navn; navn --------------------- Einor Ilderhaug Petter Johnshaltatt Elling Pedersen Anne Andersen (4 rows)
En PL/pgSQL-funksjon inneholder sql-kode, men har i tillegg mer avansert funksjonalitet som for eksempel løkker, if-tester og deklarering av variable
Lag en PL/pgSQL-funksjon som skriver ut navnet på den pasienten som har flest legebesøk (du trenger ikke bry deg om at flere pasienter kan ha like mange legebesøk) drop function finnPasMaxLegebesok(); create function finnPasMaxLegebesok() returns text as ' declare max_besok integer := 0; max_pasid integer; navn_pas text; resultat_sok record; begin for resultat_sok in select pasient_id, count(journal_id) as antall from besoksjournal group by pasient_id order by pasient_id loop if resultat_sok.antall > max_besok then max_besok := resultat_sok.antall; max_pasid := resultat_sok.pasient_id; end if; end loop; select into navn_pas navn from menneske m, pasient p where m.personnr = p.personnr and p.pasient_id = max_pasid; return navn_pas; end; ' language plpgsql; select finnPasMaxLegebesok() AS "Pasient med flest legebesøk"; Pasient med flest legebesøk ----------------------------- Arne B. Olsen (1 row)
Lag en PL/pgSQL-funksjon som skriver ut informasjon om den pasienten som har flest legebesøk (nå skal du bry deg om at flere pasienter kan ha like mange legebesøk) drop function finnPasMaxLegebesok2(); delete from besoksJournal; insert into besoksJournal values(1, 1, 1, '2000-09-10 08:45:00', 'Senebetennelse i ankel og håndledd', 100); insert into besoksJournal values(2, 1, 1, '2001-12-10 10:15:00', 'Pas. hyppig vannlating, gluc-uri: pos. Sukkerbel. test fastende om 2 dager.', 115); insert into besoksJournal values(3, 6, 2, '2001-14-10 08:15:00', 'Sukkerbel. test gjennomført. Ingenting unormalt. Puls: 71. BT: 125/81', 125); insert into besoksJournal values(4, 3, 2, '2001-23-04 10:45:00', 'Kraftig influensa, dårlig allmenntilstand, middels dehydrert', 110); insert into besoksJournal values(5, 2, 3, '2001-22-05 07:45:00', 'Mistanke om dobbelsidig lungebetennelse. Sendt til Fylkessykehuset for innleggelse', 110); insert into besoksJournal values(6, 3, 3, '2002-02-06 14:30:00', 'Pas. er slapp og trett, noe blek. Tatt blodprøver mhp vitamin- og mineralmangel, blodprosent og allergi. Blodtrykk 130/80, puls 68', 125); insert into besoksJournal values(7, 5, 4, '2003-12-10 08:45:00', 'Hundebitt, fått stivkrampesprøyte og 5 string', 145); insert into besoksJournal values(8, 3, 3, '2004-02-21 10:00:00', 'Skulder ut av ledd', 145); insert into besoksJournal values(9, 3, 2, '2004-02-21 09:00:00', 'Hofte ut av ledd', 145); create function finnPasMaxLegebesok2() returns setof text as ' declare max_besok integer := 0; max_pasid integer; navn_pas record; resultat_sok record; begin for resultat_sok in select pasient_id, count(journal_id) as antall from besoksjournal group by pasient_id order by pasient_id loop if resultat_sok.antall >= max_besok then max_besok := resultat_sok.antall; max_pasid := resultat_sok.pasient_id; end if; end loop; for navn_pas in select menneske.* from menneske, pasient where menneske.personnr = pasient.personnr and pasient_id in (select pasient_id from besoksJournal group by pasient_id having count(journal_id) = max_pasid) loop return next navn_pas.navn; end loop; return null; end; ' language plpgsql; select * from finnPasMaxLegebesok2(); finnpasmaxlegebesok2 ---------------------- Ilma S. Arnesen Eivind Moen (2 rows)