Я учусь писать функции в Postgresql. Я определил функцию с именем _tmp_myfunction()
, которая принимает id
и возвращает таблицу (я также определяю тип объекта таблицы с именем _tmp_mytable
)
-- create object type to be returned
CREATE TYPE _tmp_mytable AS (
id integer,
cost double precision
);
-- create function which returns query
CREATE OR REPLACE FUNCTION _tmp_myfunction(
id integer
)
RETURNS SETOF _tmp_mytable AS $$
BEGIN
RETURN QUERY
SELECT
sales.gid,
cost
FROM
sales
WHERE
id = sales.gid;
END;
$$ LANGUAGE plpgsql;
Это отлично работает, когда я использую один id
и вызываю его, используя следующий подход:
SELECT * FROM _tmp_myfunction(402);
Что я хотел бы сделать, так это вызвать его, но использовать столбец значений вместо одного значения. Однако, если я использую следующий подход, я получаю все значения таблицы в одном столбце, разделенные запятыми:
-- call function using all values in a column
SELECT _tmp_myfunction(t.id)
FROM transactions as t;
Я понимаю, что могу получить тот же результат, если использую SELECT _tmp_myfunction(402);
вместо SELECT * FROM _tmp_myfunction(402);
, но я не знаю, как построить свою функцию таким образом, чтобы я не получал составные значения при передаче столбца значений.
(func_row).column
. ДобавьтеRAISE NOTICE
к функции, чтобы понять, что я имею в виду. ПоддержкаLATERAL
в версии 9.3 должна наконец исправить это. Есть статья depesz с подробностями и примерами, просто я не могу найти ее в данный момент. 11.12.2012