【发布时间】:2018-02-23 22:47:54
【问题描述】:
我有以下 PL/SQL 块:
declare
vDayType varchar2(10);
TYPE Holidays is table of varchar2(5);
hd Holidays := Holidays('01.01','15.01','19.01','28.05','04.07','08.10','11.11','22.11','25.12');
begin
for s in (select distinct saleDate from Sales) loop
vDayType := case when TO_CHAR(s.saleDate, 'dd.mm') member of hd then
'Holiday'
when to_char(s.saleDate, 'd') IN (1,7) then
'Weekend'
else
'Weekday'
end;
insert into times (saleDay, dayType) values (s.saleDate, vDayType);
end loop;
end;
/
这会从名为 SALES 的 OLTP 表中提取数据,并将其插入名为 TIMES 的维度表中。它包含CASE 语句来“计算”假期、工作日或周末的日子。不幸的是,当我运行此代码时,出现以下错误:
ERROR at line 1:
ORA-01400: cannot insert NULL into ("CM420A01"."TIMES"."SALEDAY")
ORA-06512: at line 14
我相信它正在插入 NULL,因为我在 SALES OLTP 表中将其设置为仅来自 saleDate 的 SELECT DISTINCT 值。我假设它仍在尝试从CASE 语句中插入dayType,即使由于DISTINCT 语句而没有插入saleDay,因此将NULL 插入saleDay 列并导致错误。
有什么提示/技巧可以从这个问题中恢复,以便它可以正常运行吗?
【问题讨论】:
-
我看不出任何
DISTINCT指令如何导致在任何地方强制使用NULL。您确定表sales的saledate列中没有NULL? -
天啊天啊,我觉得自己像个白痴!完全忘记了我的
SALES表有尚未售出的车辆的 NULL 日期......添加了一个WHERE子句,它的工作就像一个冠军。出于某种原因,我没有考虑未列为SOLD的车辆。现在一切都好,谢谢!
标签: oracle loops plsql case distinct