首页 > 解决方案 > 在这种情况下有什么问题,因为从 postgres 函数返回自定义类型集

问题描述

我的表结构是

CREATE TABLE dev.clbk_logs
(
    id bigint NOT NULL,
    clbk_typ character varying(255) COLLATE pg_catalog."default",
    clbk_json json,
    cre_dte timestamp without time zone,
    ld_id bigint,
    ld_num character varying(255) COLLATE pg_catalog."default",
    mod_dte timestamp without time zone,
    CONSTRAINT clbk_logs_pkey PRIMARY KEY (id)
)
WITH (
    OIDS = FALSE
)

我的存储过程如下

CREATE OR REPLACE FUNCTION dev.get_ranged_loads(p_callback_types TEXT[],p_loads TEXT[], p_days_ago_1 INT, p_days_ago_2 INT) 
RETURNS table(
    clbk_json json,
    ld_id character varying,
    ld_num character varying,
    days_ago int)

AS $BODY$ 
BEGIN
    return query    
    
    SELECT a.clbk_json,a.ld_id,a.ld_num,(current_date - a.cre_dte::date) as _days_ago 
    FROM dev.clbk_logs a 
    WHERE exists (
    SELECT * from json_array_elements_text(a.clbk_json -> 'ReferenceNumbers') as x(item) 
    WHERE x.item = any(p_loads) 
    AND a.clbk_typ = any(p_callback_types)
    AND ((current_date - a.cre_dte::date)=p_days_ago_1 OR (current_date - a.cre_dte::date)<p_days_ago_2) 
) order by  a.cre_dte desc;
       
END;
$BODY$
LANGUAGE plpgsql VOLATILE;

目前这给了我一个错误

错误:无法更改现有函数的返回类型详细信息:OUT 参数定义的行类型不同。提示:首先使用 DROP FUNCTION dev.get_ranged_loads(text[],text[],integer,integer)。SQL 状态:42P13

上面的代码出了什么问题

我期待结果集为

|---------|---------|------------|----------------|----------------|----------------|----------------|------------|
| id      |clbk_typ |clbk_json   |cre_dte         |          ld_id |ld_num          |mod_dte         |days_ago    |
|---------|---------|------------|----------------|----------------|----------------|----------------|------------|
| 1172    |ADD      | {}         |  0             |  12            |                |                |           | 
| 1172    |UPDATE   | {}         |  40            |  45            |                |                |           | 

提前致谢

标签: postgresql

解决方案


错误信息非常清楚。您不能更改返回类型。跑:

DROP FUNCTION dev.get_ranged_loads(TEXT[],TEXT[],INT,INT);

然后你就可以CREATE OR REPLACE像往常一样运行了。


推荐阅读