首页 > 解决方案 > 将游标记录提取到数组中引发错误

问题描述

当我执行下面的函数时,我收到了错误:

date/time field value out of range: "0"

你能帮我弄清楚这段代码有什么问题吗?

这是抛出FETCH c_dt_coursor INTO v_idetail;

create schema if not exists stbschema;

create type stbschema.itdtls as (
   ID NUMERIC,
   TD NUMERIC,
   SDT TIMESTAMP(0),
   RUP NUMERIC,
   EDT TIMESTAMP(0)
);

do $$
begin
CREATE DOMAIN stbschema.itdtls_v as stbschema.itdtls[];
EXCEPTION
    WHEN duplicate_object THEN null;
END $$;


CREATE OR REPLACE FUNCTION stbschema.f1(p_ant numeric, p_dt timestamp without time zone, p_id numeric, p_dtf timestamp without time zone, p_tf character varying, OUT p_amount numeric, OUT p_sts boolean)
 RETURNS record
 LANGUAGE plpgsql
AS $function$
DECLARE
v_sts            BOOLEAN := FALSE;
v_idetail stbschema.itdtls_v;

   c_dt_coursor cursor is 
   select array(select row(id,
          mny,
          sdt, 
          rat, 
          coalesce(edt, p_dt))
     from idtls  
    where id = p_id 
      and sdt <= p_dt 
      and coalesce(edt, p_dt) > p_dtf  
     order by sdt,mny);

  begin

    p_amount := 0;
    OPEN c_dt_coursor;
    FETCH c_dt_coursor INTO v_idetail;
    CLOSE c_dt_coursor;

    v_sts := TRUE;
    p_sts := v_sts;
    return;
  end $function$;

从游标返回的示例行是

{"(1,10,\"2001-01-01 00:00:00\",500,\"2009-01-01 12:00:00\")"}

标签: postgresqlplpgsqldatabase-cursor

解决方案


stbschema.itdtls有一个日期/时间类型的列,但是游标定义中的查询为不可能的值的某些字段返回 0。

一个例子是

2019-00-01

所以当 PostgreSQL 试图将数组强制转换为 的数组时stbschema.itdtls,它必须报错。

也许您可以CASE在查询中添加一个表达式,用有效值替换这些值。


推荐阅读