我正在尝试将动态查询结果转换为
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
错误。如果您要返回
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;
什么Craig写的。但有一个稍微不同的解决方案,带有额外的修复:
CREATE OR REPLACE FUNCTION get_data_as_json(tbl regclass
, p_version_id integer
, OUT my_result json)
LANGUAGE plpgsql AS
$func$
BEGIN
EXECUTE format(
'SELECT to_json(*) FROM %s
WHERE version_id = $1', tbl)
INTO my_result
USING p_version_id;
END
$func$;
OUT
参数。您可以直接SELECT INTO
然后完成。
当输出为 regclass
(自动)时,对象标识符类型
text
会被自动引用(如果需要)。为此,使用 %s
和 format()
,而不是 %I
。
我认为参数
p_version_id
到目前为止一直被忽视。我怀疑原始代码(“p_budget_version_id”)中存在拼写错误以及无效语法。我建议使用 USING
构造 EXECUTE
。参见: