PL SQL触发器不';行不通

PL SQL触发器不';行不通,sql,plsql,Sql,Plsql,我已经编写了一个触发器,它在插入或更新表bestellung时触发,我希望它在插入或更新表中的文件时更改某些内容。我想你可以从代码中看到我想要改变的东西 我现在正在与APEX合作,当我尝试插入订单时,他总是向我抛出错误,表正在更改,触发器可能看不到更改 create or replace trigger bestellschluss_iuar after insert or update on bestellung for each row DECLARE v_date2 DATE; v_ho

我已经编写了一个触发器,它在插入或更新表bestellung时触发,我希望它在插入或更新表中的文件时更改某些内容。我想你可以从代码中看到我想要改变的东西

我现在正在与APEX合作,当我尝试插入订单时,他总是向我抛出错误,表正在更改,触发器可能看不到更改

create or replace trigger bestellschluss_iuar
after insert or update on bestellung
for each row
DECLARE 
v_date2 DATE;
v_hour number;

BEGIN

select bestelldatum + 2 into v_date2 from bestellung where bestellid = :new.bestellid;
select EXTRACT(HOUR FROM TO_TIMESTAMP(SYSDATE))into v_hour FROM DUAL;       

IF :NEW.zieldatum IS NULL THEN
    IF v_hour > 17 THEN
        UPDATE bestellung
        SET zieldatum = bestelldatum + 3
        WHERE bestellid = :NEW.bestellid;
    ELSE
        UPDATE bestellung -- bestellung means order
        SET zieldatum = bestelldatum + 2 --and this means deliverydate = orderdate +2
        WHERE bestellid = :NEW.bestellid;
    END IF;
ELSIF v_date2 > :NEW.zieldatum THEN
        raise_application_error(-22501, 'Bestellungen für dieses Datum nicht möglich da zu Kurze Lieferzeit');
ELSIF (v_date2 = :NEW.zieldatum) AND v_hour > 18 THEN
        raise_application_error(-22502, 'Bestellungen um diese Uhrzeit für diesen Tag nicht mehr möglich');
END IF;
END;​
/

我会在插入或更新触发器之前使用
,而不是在触发器之后使用
。在
BEFORE
触发器中,您可以在插入或更新受影响行之前,通过指定给
:NEW.columnname
来访问和更改受影响行的值。这对您来说已经足够了,因为您只查询/更新触发的行中的数据

这也避免了“表XYZ正在变异”;触发器/函数可能看不到它的错误,因为在更新表的触发器期间,我们不再尝试查询或更新表

我尝试过将你的触发器改写为
之前的
触发器。请注意,除了创建一个合适的表并验证触发器是否编译之外,我还没有测试它是否有效:

create or replace trigger bestellschluss_iubr
  before insert or update on bestellung
  for each row
DECLARE 
  v_date2 DATE;
  v_hour number;

BEGIN
  v_date2 := :NEW.bestelldatum + 2;
  v_hour := EXTRACT(HOUR FROM SYSTIMESTAMP);

  IF :NEW.zieldatum IS NULL THEN
    IF v_hour > 17 THEN
      :NEW.zieldatum := :NEW.bestelldatum + 3;
    ELSE
      :NEW.zieldatum := :NEW.bestelldatum + 2;
    END IF;
  ELSIF v_date2 > :NEW.zieldatum THEN
    raise_application_error(-22501, 'Bestellungen für dieses Datum nicht möglich da zu Kurze Lieferzeit');
  ELSIF (v_date2 = :NEW.zieldatum) AND v_hour > 18 THEN
    raise_application_error(-22502, 'Bestellungen um diese Uhrzeit für diesen Tag nicht mehr möglich');
  END IF;
END;
/

我会在插入或更新触发器之前使用
,而不是在触发器之后使用
。在
BEFORE
触发器中,您可以在插入或更新受影响行之前,通过指定给
:NEW.columnname
来访问和更改受影响行的值。这对您来说已经足够了,因为您只查询/更新触发的行中的数据

这也避免了“表XYZ正在变异”;触发器/函数可能看不到它的错误,因为在更新表的触发器期间,我们不再尝试查询或更新表

我尝试过将你的触发器改写为
之前的
触发器。请注意,除了创建一个合适的表并验证触发器是否编译之外,我还没有测试它是否有效:

create or replace trigger bestellschluss_iubr
  before insert or update on bestellung
  for each row
DECLARE 
  v_date2 DATE;
  v_hour number;

BEGIN
  v_date2 := :NEW.bestelldatum + 2;
  v_hour := EXTRACT(HOUR FROM SYSTIMESTAMP);

  IF :NEW.zieldatum IS NULL THEN
    IF v_hour > 17 THEN
      :NEW.zieldatum := :NEW.bestelldatum + 3;
    ELSE
      :NEW.zieldatum := :NEW.bestelldatum + 2;
    END IF;
  ELSIF v_date2 > :NEW.zieldatum THEN
    raise_application_error(-22501, 'Bestellungen für dieses Datum nicht möglich da zu Kurze Lieferzeit');
  ELSIF (v_date2 = :NEW.zieldatum) AND v_hour > 18 THEN
    raise_application_error(-22502, 'Bestellungen um diese Uhrzeit für diesen Tag nicht mehr möglich');
  END IF;
END;
/

我会在插入或更新触发器之前使用
,而不是在触发器之后使用
。在
BEFORE
触发器中,您可以在插入或更新受影响行之前,通过指定给
:NEW.columnname
来访问和更改受影响行的值。这对您来说已经足够了,因为您只查询/更新触发的行中的数据

这也避免了“表XYZ正在变异”;触发器/函数可能看不到它的错误,因为在更新表的触发器期间,我们不再尝试查询或更新表

我尝试过将你的触发器改写为
之前的
触发器。请注意,除了创建一个合适的表并验证触发器是否编译之外,我还没有测试它是否有效:

create or replace trigger bestellschluss_iubr
  before insert or update on bestellung
  for each row
DECLARE 
  v_date2 DATE;
  v_hour number;

BEGIN
  v_date2 := :NEW.bestelldatum + 2;
  v_hour := EXTRACT(HOUR FROM SYSTIMESTAMP);

  IF :NEW.zieldatum IS NULL THEN
    IF v_hour > 17 THEN
      :NEW.zieldatum := :NEW.bestelldatum + 3;
    ELSE
      :NEW.zieldatum := :NEW.bestelldatum + 2;
    END IF;
  ELSIF v_date2 > :NEW.zieldatum THEN
    raise_application_error(-22501, 'Bestellungen für dieses Datum nicht möglich da zu Kurze Lieferzeit');
  ELSIF (v_date2 = :NEW.zieldatum) AND v_hour > 18 THEN
    raise_application_error(-22502, 'Bestellungen um diese Uhrzeit für diesen Tag nicht mehr möglich');
  END IF;
END;
/

我会在插入或更新触发器之前使用
,而不是在触发器之后使用
。在
BEFORE
触发器中,您可以在插入或更新受影响行之前,通过指定给
:NEW.columnname
来访问和更改受影响行的值。这对您来说已经足够了,因为您只查询/更新触发的行中的数据

这也避免了“表XYZ正在变异”;触发器/函数可能看不到它的错误,因为在更新表的触发器期间,我们不再尝试查询或更新表

我尝试过将你的触发器改写为
之前的
触发器。请注意,除了创建一个合适的表并验证触发器是否编译之外,我还没有测试它是否有效:

create or replace trigger bestellschluss_iubr
  before insert or update on bestellung
  for each row
DECLARE 
  v_date2 DATE;
  v_hour number;

BEGIN
  v_date2 := :NEW.bestelldatum + 2;
  v_hour := EXTRACT(HOUR FROM SYSTIMESTAMP);

  IF :NEW.zieldatum IS NULL THEN
    IF v_hour > 17 THEN
      :NEW.zieldatum := :NEW.bestelldatum + 3;
    ELSE
      :NEW.zieldatum := :NEW.bestelldatum + 2;
    END IF;
  ELSIF v_date2 > :NEW.zieldatum THEN
    raise_application_error(-22501, 'Bestellungen für dieses Datum nicht möglich da zu Kurze Lieferzeit');
  ELSIF (v_date2 = :NEW.zieldatum) AND v_hour > 18 THEN
    raise_application_error(-22502, 'Bestellungen um diese Uhrzeit für diesen Tag nicht mehr möglich');
  END IF;
END;
/

我认为应该在第二行插入之前,而不是插入之后。嗯,现在他总是告诉我,他在运行触发器时没有发现任何数据和错误。我认为应该在第二行插入之前,而不是插入之后。嗯,现在他总是告诉我,他在运行触发器时没有发现任何数据和错误。我认为应该现在他总是告诉我,他在运行触发器时没有发现任何数据和错误。我认为应该在第二行插入之前而不是插入之后。嗯,现在他总是告诉我,他在运行触发器时没有发现任何数据和错误