PL/pgSQL值比较方法及维度表日期加载失败排查
问题分析与修复方案
你的存储过程没有加载记录,大概率是以下几个问题导致的:
表名不匹配
你的判断逻辑查询的是dimDate表,但插入操作却指向dimfechas表,这两个表如果不是同一对象(比如拼写错误、大小写差异),会直接导致判断逻辑完全失效。比如dimDate已有当日数据,但dimfechas是空的,条件会不满足,不会执行插入;反之dimDate为空时,也会因为后续的NULL比较问题无法插入。空表时的NULL比较陷阱
当目标表为空时,SELECT MAX(date)会返回NULL。在PL/pgSQL中,任何和NULL的比较结果都是NULL,而IF条件会把NULL视为false,所以不会触发插入操作。自定义日期函数的正确性
要确认get_fecha()、get_year()这些自定义函数确实返回正确的当日日期和对应年、月、日值。比如get_fecha()是否和CURRENT_DATE等价?如果函数返回的日期不符合预期,逻辑自然不会生效。
修正后的存储过程代码
CREATE OR REPLACE PROCEDURE load_dimDate() LANGUAGE plpgsql AS $$ DECLARE _date date := get_fecha(); _year int := get_year(); _month int := get_month(); _day int := get_day(); _max_date date; BEGIN -- 统一表名,根据实际情况调整为正确的表名 SELECT MAX(date) INTO _max_date FROM dimfechas; -- 处理空表或当日日期未存在的场景 IF _max_date IS NULL OR _date > _max_date THEN INSERT INTO dimfechas(date, year, month, day) VALUES(_date, _year, _month, _day); END IF; END $$;
修正说明
- 统一了判断和插入操作的表名(如果你的正确表名是
dimDate,请把两处dimfechas都改为dimDate) - 先将最大日期存入变量,通过
_max_date IS NULL处理空表首次插入的场景 - 用
_date > _max_date替代原有的<>,更贴合业务逻辑:只有当日日期比已存最大日期新时才插入,避免重复插入旧日期
内容的提问来源于stack exchange,提问作者Juan Almada
相关产品推荐
相关产品推荐

