Aby rozłożyć wiersze otrzymane z funkcji, traktuj je jak każdą inną tabelę:
SELECT * FROM karta_pacjenta('foo45678901');
Funkcje zwracające zestaw wierszy są również nazywane "funkcjami tabelowymi".
Poza tym to, co przedstawiłeś, nie działałoby.
CREATE FUNCTION karta_pacjenta(_pe varchar)
RETURNS TABLE(data DATE, imie TEXT, nazwisko TEXT
, diagnoza TEXT,przepisany lek TEXT) AS
$func$
SELECT w.dzien, p.imie, p.nazwisko, ch.nazwa, l.nazwa
FROM pacjenci p
JOIN diagnozy d USING (pesel) -- shorthand if columns are unambiguous
JOIN wizyty w USING (pesel)
JOIN choroby ch ON ch.kod_choroby = d.kod_choroby
JOIN recepty r ON r.nr_wizyty = w.nr_wizyty
JOIN leki l ON l.kod_leku = r.kod_leku
WHERE p.pesel = _pe
$func$ LANGUAGE sql;
-
Pojedyncze cudzysłowy dla nazw kolumn są błędem składni. Musiałyby być podwójne cudzysłowy. Lepiej jednak zawsze używać niecytowanych, legalnych nazw małych liter.
-
Nie cytuj nazwy języka, to identyfikator.
Reszta jest opcjonalna, ale dobra rada.
-
Tutaj wystarczy prosta funkcja SQL.
-
Użyj jawnej składni JOIN. Ten sam wynik, ale znacznie łatwiejszy w utrzymaniu.
-
Prawdopodobnie nie ma sensu używać
varchar(11)
zamiast po prostuvarchar
lubtext
jako typ parametru. (Obowiązują wyjątki dla narożnych przypadków). -
Używaj cudzysłowów w dolarach — co jest tutaj całkowicie opcjonalne, ale ogólnie dobrym stylem do cytowania treści funkcji. Wcześniej czy później będziesz chciał umieścić w treści pojedyncze cudzysłowy.