[英]Dynamic select function in postgres
我将如何编写和实现一个函数,该函数根据传递给函数的参数 + 其他变量动态地从多个表中进行选择。 选择的数据需要由函数返回。
到目前为止,我已经尝试过 PERFORM,它很难获得回报,还尝试过 EXECUTE,它似乎只返回 INTO 变量而不是集合。 https://www.postgresql.org/docs/9.1/plpgsql-declarations.html 。 我几乎可以肯定这不是设计问题,因为这可以在 TSQL spocs 中用几行代码完成。
接近的问题是找到一种方法来存储变量并在执行时返回该变量的结果。 这下面会打勾,参数的传递很容易进入。
CREATE OR REPLACE FUNCTION foo(
)
RETURNS TABLE (
key TEXT
, value GEOMETRY
)
LANGUAGE 'plpgsql'
SECURITY INVOKER
AS $$
DECLARE
err1 TEXT;
err2 TEXT;
err3 TEXT ;
dyn_sql TEXT ;
BEGIN
SELECT
concat(LEFT(concat( 'SELECT q.viewn, q.geom /* INTO constraint_output_temp */ FROM ( ' , string_agg(sql_parts, '') ), -11) , ') AS q' ) AS query
INTO
dyn_sql
FROM
(
SELECT
CASE
WHEN 1 = 1
THEN concat( 'SELECT ''', t.matviewname, ''' as viewn, ', t.matviewname, '.geom FROM ', t.schemaname, '.', t.matviewname, ' AS ', t.matviewname, ' INNER JOIN targets ON st_intersects(', t.matviewname, '.geom, targets.geom) UNION ALL ' )
ELSE NULL
END AS sql_parts
, concat(t.schemaname, '.', t.matviewname) AS obj
, t.matviewname AS viewn
FROM
pg_catalog.pg_matviews AS t
WHERE
schemaname = 'something'
) AS q
;
RETURN QUERY EXECUTE dyn_sql ;
EXCEPTION
WHEN OTHERS THEN GET STACKED DIAGNOSTICS
err1 = MESSAGE_TEXT
, err2 = PG_EXCEPTION_DETAIL
, err3 = PG_EXCEPTION_HINT ;
RETURN QUERY SELECT CONCAT( err1, err2, err3 )::TEXT ;
END $$ ;
SELECT * FROM foo( ) ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.