Функция, возвращающая одну строку из таблицы - PullRequest
0 голосов
/ 08 января 2019

Не могу на всю жизнь заставить эту функцию правильно вернуть строку (она будет возвращать только одну, когда я запрашиваю первичный ключ). Похоже на это.

CREATE OR REPLACE FUNCTION sch.getrow(
    IN gy integer,
    IN gw integer,
    IN pi uuid)
RETURNS SETOF record AS $$

BEGIN

EXECUTE 'SELECT * FROM sch.foo WHERE gy = $1 AND gw = $2 AND idpi = $3' INTO record USING gy, gw, pi;

END

$$
LANGUAGE plpgsql IMMUTABLE;

Попытка различных RETURN EXECUTE и RETURN QUERY и т. Д., Но нада: строка SQL будет динамически определенной строкой, поскольку имя таблицы будет изменяться в зависимости от входных переменных.

1 Ответ

0 голосов
/ 08 января 2019

Если функция возвращает SETOF, вы можете использовать RETURN QUERY независимо от того, сколько строк (одна или несколько) функция может вернуть.

CREATE OR REPLACE FUNCTION sch.getrow(
    IN gy integer,
    IN gw integer,
    IN pi uuid)
RETURNS SETOF record AS $$
BEGIN
    RETURN QUERY
    EXECUTE 'SELECT * FROM sch.foo WHERE gy = $1 AND gw = $2 AND idpi = $3' USING gy, gw, pi;

END

$$
LANGUAGE plpgsql;

Не связано, но важно. Функция не должна быть определена как IMMUTABLE, поскольку ее результаты зависят от данных, хранящихся в таблице. По документации:

IMMUTABLE указывает, что функция не может изменить базу данных и всегда возвращает один и тот же результат, если даны одинаковые значения аргумента; то есть он не выполняет поиск в базе данных или иным образом не использует информацию, прямо не представленную в списке аргументов.

...