【问题标题】:PL/SQL ORA-01400: cannot insert NULL into when using CASEPL/SQL ORA-01400: 使用 CASE 时无法插入 NULL
【发布时间】: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 表中将其设置为仅来自 saleDateSELECT DISTINCT 值。我假设它仍在尝试从CASE 语句中插入dayType,即使由于DISTINCT 语句而没有插入saleDay,因此将NULL 插入saleDay 列并导致错误。

有什么提示/技巧可以从这个问题中恢复,以便它可以正常运行吗?

【问题讨论】:

  • 我看不出任何DISTINCT 指令如何导致在任何地方强制使用NULL。您确定表salessaledate 列中没有NULL
  • 天啊天啊,我觉得自己像个白痴!完全忘记了我的SALES 表有尚未售出的车辆的 NULL 日期......添加了一个WHERE 子句,它的工作就像一个冠军。出于某种原因,我没有考虑未列为SOLD 的车辆。现在一切都好,谢谢!

标签: oracle loops plsql case distinct


【解决方案1】:

添加了WHERE SALES.vehicleStatus = 'sold' 子句,因为NULL 值被插入到列为pendingavailable 并且还没有saleDate 的车辆......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-08
    • 2011-08-23
    • 2017-09-01
    • 2013-02-21
    • 2016-08-21
    • 2016-06-21
    • 2015-06-04
    • 2021-12-03
    相关资源
    最近更新 更多