関数から返される行を分解するには、他のテーブルと同じように扱います。
SELECT * FROM karta_pacjenta('foo45678901');
行のセットを返す関数は、「テーブル関数」とも呼ばれます。
それを除けば、あなたが提示したものは機能しません。
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;
-
列名の単一引用符は構文エラーです。二重引用符で囲む必要があります。ただし、引用符で囲まれていない、合法的な小文字の名前を常に使用することをお勧めします。
-
言語名は引用しないでください。識別子です。
残りはオプションですが、お勧めします。
-
単純なSQL関数がここで機能します。
-
明示的なJOIN構文を使用します。同じ結果ですが、保守がはるかに簡単です。
-
varchar(11)
を使用するのはおそらく無意味ですvarchar
だけでなく またはtext
パラメータタイプとして。 (コーナーケースの例外が適用されます。) -
ドル引用符を使用します。これはここでは完全にオプションですが、関数本体を引用するには一般的に適切なスタイルです。遅かれ早かれ、本文に一重引用符を含めることをお勧めします。