将动态查询的结果转换为json

时间:2014-02-06 01:14:59

标签: postgresql plpgsql dynamic-sql

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

2 个答案:

答案 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;