Para decompor as linhas que você recebe da função, trate-a como qualquer outra tabela:
SELECT * FROM karta_pacjenta('foo45678901');
As funções que retornam um conjunto de linhas também são chamadas de "funções de tabela".
Além disso, o que você apresentou não funcionaria.
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;
-
Aspas simples para nomes de coluna são um erro de sintaxe. Teria que ser aspas duplas. É melhor você sempre usar nomes sem aspas, legais e em minúsculas.
-
Não cite o nome do idioma, é um identificador.
O resto é opcional, mas bom conselho.
-
Uma função SQL simples faz o trabalho aqui.
-
Use a sintaxe JOIN explícita. Mesmo resultado, mas muito mais fácil de manter.
-
Provavelmente é inútil usarvarchar(11)
em vez de apenasvarchar
outext
como tipo de parâmetro. (Exceções de caso de canto se aplicam.)
-
Use cotação de dólar - que é totalmente opcional aqui, mas geralmente um bom estilo para citar o corpo da função. Mais cedo ou mais tarde você vai querer incluir aspas simples no corpo.