使用 Postgres 11 时,UPDATE 中不允许设置返回函数

Posted

技术标签:

【中文标题】使用 Postgres 11 时,UPDATE 中不允许设置返回函数【英文标题】:Set-returning functions are not allowed in UPDATE when using Postgres 11 【发布时间】:2020-02-16 12:53:37 【问题描述】:

我有一个 Postgresql 9.6(和 postgis 2.5)函数,它根据记录的几何形状计算带有参数的 json。 我创建了一个json字段并在那里写了json计算输出,一切都很好。

UPDATE public.recordtable
SET polygoncalc = public.fn_calculate_polygon(5)
WHERE id = 5; 

当我尝试在 Postgres 11.2 上运行它时,它返回一个错误:

SQL Error [0A000]:ERROR: set-returning functions are not allowed in UPDATE

基于这个link我知道postgresql发生了变化,但老实说,

如何将 json 写入 Postgres 11.2 中的字段而不出现错误?

提前谢谢你。

编辑:我将输出字段更改为 json 类型并添加了函数文本

the function:

CREATE OR REPLACE FUNCTION public.fn_create_jsn_point(pid double precision)
 RETURNS TABLE(jsn json)
 LANGUAGE plpgsql
AS $function$
DECLARE
    p_id double precision = pid;
    myjson json = null ;

    begin
       return QUERY 
       select row_to_json(finaljson)
            from(
            select
                 ST_x(a.wgs_84_dump_point) as X,
                 ST_y(a.wgs_84_dump_point) as Y
                        (
                             select (st_transform(st_centroid(t.geom),4326))  wgs_84_dump_point
                                 from baserecords t where base_id = p_id                         
                        ) a ) finaljson;
    END;
$function$
;

【问题讨论】:

不返回一组多边形,而是一个多边形.. @JGH 我在原始函数中返回一个多边形... 能发一下功能代码吗? @JGH,这里我加了功能码 【参考方案1】:

函数正在返回一个表。不管返回多少行,都是返回一个表,即一个集合。

由于您知道将返回单个值,因此您可以更改函数以对其进行限制:

CREATE OR REPLACE FUNCTION public.fn_create_jsn_point(pid double precision)
 RETURNS json -- <---------------------------- Return a single value
 LANGUAGE plpgsql
AS $function$
DECLARE
    p_id double precision = pid;
    myjson json = null ;

    begin
       return ( -- <---------------------------------- return a single value
         select row_to_json(finaljson)
            from(
            select
                 ST_x(a.wgs_84_dump_point) as X,
                 ST_y(a.wgs_84_dump_point) as Y
                        (
                             select (st_transform(st_centroid(t.geom),4326))  wgs_84_dump_point
                                 from baserecords t where base_id = p_id                         
                        ) a ) finaljson
       );
    END;
$function$
;

【讨论】:

好的,成功了。谢谢。所以错误只是因为我返回一个默认为“多重答案”的表??? 是的,单行保存表格无效

以上是关于使用 Postgres 11 时,UPDATE 中不允许设置返回函数的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 写/读锁

Postgres SELECT ... FOR UPDATE 函数

使用 node-postgres 在 postgres 中存储文件

UPDATE 查询中的 FROM 后的 Postgres 语法错误

Postgres UPDATE 使用排名窗口函数

在 postgres 中查询表的授权