我正在尝试创建一个带有返回表的函数。
CREATE FUNCTION karta_pacjenta(pe VARCHAR(11))
RETURNS TABLE('data' DATE,'imie' TEXT, 'nazwisko' TEXT, 'diagnoza' TEXT,'przepisany lek' TEXT) AS'
BEGIN
RETURN QUERY SELECT w.dzien AS dzien,p.imie, p.nazwisko, ch.nazwa, l.nazwa
FROM pacjenci p, diagnozy d, choroby ch, wizyty w, leki l, recepty r
WHERE p.pesel=d.pesel AND d.kod_choroby=ch.kod_choroby AND p.pesel=pe AND w.pesel=pe AND l.kod_leku=r.kod_leku AND r.nr_wizyty=w.nr_wizyty;
END;
' LANGUAGE 'plpgsql';
它工作得很好,但我还需要一件事。作为这个函数的结果,我得到了函数名称,然后是几条记录。
但是,我想在记录上有列名。知道怎么做吗?
要分解您从函数返回的行,请像对待任何其他表一样对待它:
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
作为参数类型可能毫无意义。(极端情况例外。使用美元报价 - 这在这里是完全可选的,但通常引用函数体的风格很好。迟早你会希望在正文中包含单引号。