将动态查询结果转换为json

问题描述 投票:0回答:2

我正在尝试将动态查询结果转换为

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?

postgresql plpgsql dynamic-sql
2个回答
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;

3
投票

什么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
。参见:

© www.soinside.com 2019 - 2024. All rights reserved.