【问题标题】:Expected NUMBER got DATE预计 NUMBER 获得 DATE
【发布时间】:2015-07-30 06:36:02
【问题描述】:

我收到一个对我来说毫无意义的 SQL 错误。我使用以下命令创建了一个名为 SUBORDER 的表:

CREATE TABLE SUBORDER (
  OrderNo int, 
  SuborderNo int, 
  ReqShipDate date, 
  ActualShipDate date, 
  BranchName varchar(50), 
  primary key (OrderNo, SuborderNo), 
  foreign key (OrderNo) references ORDERS(OrderNo) on delete set null, 
  foreign key (BranchName) references BRANCH(BranchName) on delete set null
);

如您所见,ReqShipDate 和 ActualShipDate 被声明为日期。但是当我运行这段代码时:

create or replace trigger shipment_late
before update
    on SUBORDER
for each row
declare
    reqdate DATE;
    actualdate DATE;

begin
select s.ReqShipDate, s.ActualShipDate into reqdate, actualdate 
    from SUBORDER s 
    where ( s.OrderNo = :new.OrderNo ) and ( s.SuborderNo = :new.SuborderNo );

if reqdate > actualdate then
    insert into LATE_SHIPMENT 
        select * from SUBORDER s 
        where ( s.OrderNo = :new.OrderNo ) and ( s.SuborderNo = :new.SuborderNo );
end if;

end;

SQL 控制台告诉我:

错误(12,11):PL/SQL:ORA-00932:不一致的数据类型:预期 NUMBER 得到 DATE

为什么需要一个数字?

【问题讨论】:

  • 你能把DESC LATE_SHIPMENT的结果贴出来吗?
  • 如果insert 中没有明确的列列表,任何事情都可能发生。
  • 如果你解决了这个错误(大概是通过为insertselect 做一个明确的列列表),你会遇到一个变异表错误。 suborder 上的行级触发器通常无法查询 suborder。你的第一个select 似乎毫无意义,大概你只想要:new.ReqShipDate:new.ActualShipDate 所以你不需要查询表。您随后的insert 应该是insert values,其中列出了要在values 子句中插入的各种:new.columnName 属性(除了为insert 指定列列表)

标签: sql oracle plsql


【解决方案1】:

看来你只是想要

create or replace trigger shipment_late
before update
    on SUBORDER
for each row
begin
  if :new.ReqShipDate > :new.ActualShipDate
  then
    insert into LATE_SHIPMENT( <<list of columns>> )
      values( :new.OrderNo, :new.SuborderNo, ... ); 
  end if;
end;

需要注意的几件事

  • 如果您正在执行insert 语句,明确列出列总是一个好主意。否则,您将依赖一个隐式顺序,这对于阅读您的代码的人来说并不明显,并且会产生相当多的错误可能性。至少列出列,记录您将哪些值放在哪里。在此示例中,late_shipment 表似乎不太可能在 suborder 中以完全相同的顺序定义完全相同的列集。
  • 一般来说,表上的行级触发器(本例中为SubOrder)无法查询该表。这样做通常会引发变异表异常。然而,这里似乎没有必要。您只需要引用:new 伪记录的各种属性即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    相关资源
    最近更新 更多