Это обычно невозможно с SQL функциями . Даже с типом возврата polymorphi c фактический тип возврата должен быть определен во время вызова. Но все операторы в функции SQL планируются до ее выполнения. Таким образом, вы всегда получите сообщение об ошибке для одного из операторов SELECT
, возвращающего данные, которые не соответствуют типу возвращаемого значения.
То же самое можно сделать с динамическим c SQL в функции PL / pg SQL - с некоторыми хитростями:
CREATE OR REPLACE FUNCTION f_demo(_tabletype anyelement, _id int)
RETURNS SETOF anyelement LANGUAGE plpgsql AS
$func$
BEGIN
RETURN QUERY EXECUTE
format('SELECT * FROM %s WHERE id = $1', pg_typeof(_tabletype))
USING _id;
END
$func$;
Вызов (важно!):
SELECT * FROM f_demo(null::schemaZ.Table_1, 1);
«хитрость» заключается в приведении значения null
к нужному типу таблицы, тем самым определяя тип возврата и , выбирая из какой таблицы выбрать. Подробное объяснение:
Примите это как доказательство концепции. Как правило, существуют лучшие (более безопасные, менее запутанные, более производительные) решения ...
Связанные: