postgresql 将动态查询的结果转换为JSON

zzzyeukh  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(140)

我尝试将动态查询结果转换为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?

jtoj6r0c

jtoj6r0c1#

如果你返回SETOF,你需要使用RETURN QUERY EXECUTE结构,产生一个动态查询,返回你想要的。
未经考验,但在模糊的正确方向:

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;

字符串

wa7juj8i

wa7juj8i2#

什么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”)与无效的语法相结合。我建议使用EXECUTEUSING结构。请参阅:

  • 触发器函数中具有动态表名的查询

相关问题