【问题标题】:pass a query to row_to_json function inside a store procedure in postgres在 postgres 的存储过程中将查询传递给 row_to_json 函数
【发布时间】:2017-04-22 19:45:48
【问题描述】:

我正在尝试编写一个存储过程,在其中将查询传递给一个存储过程,该存储过程将在内部调用 row_to_json 函数。我们有多个 DBMS(Oracle、SQL Server 和 postgres),并希望编写一个通用过程来充当 json 处理函数的包装器。

我在看这样的东西

CREATE OR REPLACE FUNCTION proj.sql_row_to_json(sql_t text)
 RETURNS json
 LANGUAGE sql
AS $function$
  with t as (select sql_t )
  select row_to_json(t) from t;
$function$

我会在我的应用程序中调用函数

select SQL_ROW_TO_JSON('<sql query>') -> 应该适用于不同的数据库

但是上面的过程给了我下面的结果,而不是实际的数据。

select SQL_ROW_TO_JSON('SELECT id,name FROM emp')

{"sql_t":"SELECT id,name FROM emp"}

【问题讨论】:

    标签: sql json postgresql


    【解决方案1】:

    你必须使用 plpgsql 和dynamic sql

    create or replace function sql_row_to_json(sql_t text)
    returns json language plpgsql as $function$
    declare rslt json;
    begin
        execute
            format($ex$
                select json_agg(row_to_json(t)) 
                from (%s) t
            $ex$, sql_t)
        into rslt;
        return rslt;
    end;
    $function$;
    
    select sql_row_to_json('select 1 as id, ''abcd'' as value');
    
         sql_row_to_json     
    -------------------------
     {"id":1,"value":"abcd"}
    (1 row) 
    

    注意该函数容易出现SQL-injection attacks

    【讨论】:

    • 查看编辑后的答案。添加json_agg() 后,该函数可以聚合多行结果。
    猜你喜欢
    • 2014-10-29
    • 2017-12-29
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2016-04-05
    相关资源
    最近更新 更多