Brukerdefinerte funksjoner

SQL-funksjoner

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)

PL/pgSQL-funksjoner

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)