Postgresql 如何基于传递给SQL函数的ID返回不同的表数据
基于此,我想知道是否可以基于传递给函数的ID返回不同的表数据。 类似于(伪代码):Postgresql 如何基于传递给SQL函数的ID返回不同的表数据,postgresql,plpgsql,database-schema,dynamic-sql,sql-function,Postgresql,Plpgsql,Database Schema,Dynamic Sql,Sql Function,基于此,我想知道是否可以基于传递给函数的ID返回不同的表数据。 类似于(伪代码): Table_1和Table_2不共享相同的列,这会使上述返回子句无效。这在SQL函数中通常是不可能的。即使使用多态返回类型,实际返回类型也必须在调用时确定。但是SQL函数中的所有语句都是在函数执行之前规划的。因此,对于返回不符合返回类型的数据的SELECT语句之一,您总是会收到一条错误消息 PL/pgSQL函数中的动态SQL也可以实现同样的——但需要一些技巧: CREATE OR REPLACE FUNCTION
Table_1
和Table_2
不共享相同的列,这会使上述返回
子句无效。这在SQL函数中通常是不可能的。即使使用多态返回类型,实际返回类型也必须在调用时确定。但是SQL函数中的所有语句都是在函数执行之前规划的。因此,对于返回不符合返回类型的数据的SELECT
语句之一,您总是会收到一条错误消息
PL/pgSQL函数中的动态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$;
打电话(重要!):
“技巧”是将null
值强制转换为所需的表类型,从而定义返回类型并从中选择要选择的表详细说明:
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);