postgresql - 将游标记录提取到数组中引发错误
问题描述
当我执行下面的函数时,我收到了错误:
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\")"}
解决方案
表stbschema.itdtls
有一个日期/时间类型的列,但是游标定义中的查询为不可能的值的某些字段返回 0。
一个例子是
2019-00-01
所以当 PostgreSQL 试图将数组强制转换为 的数组时stbschema.itdtls
,它必须报错。
也许您可以CASE
在查询中添加一个表达式,用有效值替换这些值。
推荐阅读
- html - 如何使图像跨越多个列,同时让文本环绕它?
- angular - 具有 ChangeDetectionStrategy.OnPush 的组件的 runOutsideAngular 问题
- sockets - Log4j 的 SocketAppenders 可以支持多对一(或 3 对 2)管道吗?
- spring-cloud-stream - Spring Cloud Stream Kinesis 消费者组和检查点配置
- android - 如何减少视频缩略图的时间
- c# - 网页抓取时如何修复奇怪的符号
- node.js - JWT 存储在哪里
- ansible - 具有非标准端口的 Ansible known_hosts 模块
- python - 删除每行的前 29 个字符不打印正确的结果
- file-upload - 使用 PowerShell 5 Invoke-WebRequest 上传文件时出现内存泄漏