PL SQL触发器不';行不通
我已经编写了一个触发器,它在插入或更新表bestellung时触发,我希望它在插入或更新表中的文件时更改某些内容。我想你可以从代码中看到我想要改变的东西 我现在正在与APEX合作,当我尝试插入订单时,他总是向我抛出错误,表正在更改,触发器可能看不到更改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
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;
/
我认为应该在第二行插入之前,而不是插入之后。嗯,现在他总是告诉我,他在运行触发器时没有发现任何数据和错误。我认为应该在第二行插入之前,而不是插入之后。嗯,现在他总是告诉我,他在运行触发器时没有发现任何数据和错误。我认为应该现在他总是告诉我,他在运行触发器时没有发现任何数据和错误。我认为应该在第二行插入之前而不是插入之后。嗯,现在他总是告诉我,他在运行触发器时没有发现任何数据和错误