извлечение записей курсора в ошибку выброса массива - PullRequest
0 голосов
/ 09 октября 2019

Когда я выполняю приведенную ниже функцию, я получаю сообщение об ошибке:

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\")"}

1 Ответ

0 голосов
/ 09 октября 2019

Таблица stbschema.itdtls имеет столбец типа даты / времени, но запрос в определении курсора возвращает 0 для некоторого поля значения, где это невозможно.

Примером может быть

2019-00-01

Поэтому, когда PostgreSQL пытается преобразовать массив в массив stbschema.itdtls, он должен сообщить об ошибке.

Возможно, вы можете добавить выражение CASE в запрос, который заменяеттакие значения с допустимым значением.

...