我正在尝试将动态查询结果转换为json
,然后返回json
作为此函数的结果(这是一个简化版本,我的WHERE
子句实际代码要长得多。)
CREATE OR REPLACE FUNCTION get_data_as_json(tbl regclass, p_version_id integer)
RETURNS json AS $$
BEGIN
RETURN to_json( EXECUTE 'SELECT * FROM '|| tbl
|| ' WHERE version_id = p_budget_version_id' );
END;
$$ LANGUAGE plpgsql;
但是,此代码会导致type "execute" does not exist
错误
如何运行动态查询,然后将结果转换为JSON?
答案 0 :(得分:3)
如果您要返回SETOF
,则需要使用RETURN QUERY EXECUTE
构造,生成一个返回所需内容的动态查询。既然不是,请使用常规的EXECUTE ... INTO
变量然后返回。
未经测试,但模糊地说是正确的方向:
CREATE OR REPLACE FUNCTION get_data_as_json(tbl regclass, p_version_id integer) RETURNS json AS $$
DECLARE
my_result json;
BEGIN
EXECUTE format('SELECT to_json(*) FROM %I WHERE version_id = p_budget_version_id',tbl) INTO my_result;
RETURN my_result;
END;
$$ LANGUAGE plpgsql;
答案 1 :(得分:3)
@Craig wrote。但是有一些不同的解决方案还有其他修复方法:
CREATE OR REPLACE FUNCTION get_data_as_json(tbl regclass
, p_version_id integer
, OUT my_result json) AS
$func$
BEGIN
EXECUTE format('SELECT to_json(*) FROM %s
WHERE version_id = $1'
,tbl)
INTO my_result
USING p_version_id;
END
$func$ LANGUAGE plpgsql;
最简单的OUT
parameter。您可以直接SELECT INTO
完成它。
使用object identifier type regclass
(这是完美的情况)时,标识符在输出为text
时自动引用(如果需要)(自动)。因此,use %s
with format()
, not %I
。
我认为到目前为止,参数p_version_id
一直被忽视。我怀疑原始代码(“p_budget_version_id”)中的拼写错误与无效语法相结合。我建议使用USING
EXECUTE
构造。这个相关问题的细节:
INSERT with dynamic table name in trigger function