错误:-->PLS-00382:表达式的类型错误



触发器上的失败是什么????我正在尝试创建一个触发器,该触发器在找到日期时间时激活 在时间间隔上。

CREATE TABLE R
(
OID_R     NUMBER NOT NULL,
Price     INTEGER NOT NULL,
f         DATE    NOT NULL,
HourStart DATE    NOT NULL,
HuorFin   DATE    NOT NULL,
OID_E     NUMBER          ,
OID_S     NUMBER          ,
OID_P     NUMBER NOT NULL
);
CREATE OR REPLACE TRIGGER TR_D
BEFORE INSERT OR UPDATE OF OID_R ON R
FOR EACH ROW
DECLARE
IntervalR DATE;
HourStart DATE;
HourFin   DATE;
BEGIN
IntervalR := :new.HourFin - :new.HourStart;
IF IntervalR BETWEEN :old.HourStart AND :old.HourFin THEN
raise_application_error(-20000, 'Is not avaible');
END IF;
END;

您的描述显示"当在时间间隔内找到日期时间时",然后测试新值之间的差异是否落在旧值之间。这永远不会奏效,但似乎您尝试解决的实际问题是"确定新时间是否与旧时间重叠,或者是否可以重置时间"。
您的触发器除了误解从一个日期减去另一个日期的结果之外,还有一些基本缺陷。 触发器在插入时触发,但随后使用旧行中的列,但在插入时没有旧行,因此所有操作都会导致 NULL。因此,您的 IF 语句永远不会为真。因此,无需在插入时开火。触发器也会在更新时触发,但不会在任何更新时触发。仅当更新列OID_R时,如果OID_R不是集合列表中的列,则触发器不会在更新时触发。看起来OID_R是(或至少应该是(在正常操作期间永远不应该更新的主键。所以永远不应该在更新时触发。您定义了三个变量,一个不正确,另外两个未使用,因此不需要这些变量。我们留下了最初的问题,新时代是否与旧时代重叠
让我们将有效重置定义为:

  1. 结束大于新开始
  2. 当前时间小于"新开始">
  3. 当前时间小于旧开始

有了这个,我们得到(注意可能还有其他条件(

create or replace trigger tr_d
before  update on r
for each row
begin
if not (    new.endhour > :new.starthour  
and sysdate     < :new.starthour
and sysdate     < :old.starthour
)
then 
raise_application_error(-20000, 'is not avaible');
end if;
end tr_d;

悬而未决的问题是"时间是代表每天重复的值(即仅时间(还是表示特定日期的时间?如果每天重复,则需要从值和系统日期中删除日,月,年。

最新更新