Ако под „въз основа на известна таблица“ имате предвид „точно като известна таблица“, тогава да .
SQL е строго типизиран език и функциите трябва да се създават с добре дефиниран тип връщане. Можете да се върнете към анонимни записи както очевидно сте направили (с RETURNS SETOF record
), но тогава от вас се изисква да добавите списък с дефиниции на колони за всяко повикване, както ви казва съобщението за грешка. Нещо като:
SELECT *
FROM my_function('foo') AS foo (
colum_name1 integer -- name and data type for every column
, colum_name2 text
, colum_name3 real);
И това едва ли е динамично.
Вашият въпрос оставя място за тълкуване, но "въз основа на известна таблица" би означавало, че полиморфна функция може да свърши работа. Върнатият тип може да се основава на всеки регистриран динамичен тип ред и автоматично има по един за всяка таблица в системата. Пример за Barebone код:
CREATE OR REPLACE FUNCTION my_function(_rowtype anyelement)
RETURNS SETOF anyelement AS
$func$
BEGIN
RETURN QUERY EXECUTE format(
'SELECT * FROM %s LIMIT 10'
, pg_typeof(_rowtype) -- pg_typeof() returns regtype, quoted where necessary
);
END
$func$ LANGUAGE plpgsql;
Обаждане:
SELECT * FROM my_function(NULL::my_table);
Подробни инструкции в този свързан отговор (вижте последната глава „Различни пълни типове таблици“ ):