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