尝试创建一个触发器,当另一个表中的值发生更改时更新表(oracle apex)

时间:2014-08-08 19:29:38

标签: oracle plsql triggers oracle-apex

所以我有两个表,一个叫做“设备”,另一个叫“devicerequest”

“设备”表包含id(主键),名称,数量等列,基本上有“(1,iPhone,3),(2,iPad,1)等数据,即:id = 1 name = iPhone数量= 3。

“devicerequest”表具有包括requestid(主键),deviceid,devicequantity的列,并且具有类似于(22,1,2)的数据,这意味着它正在请求2个iPhone。

所以基本上我正在尝试在管理员确认请求时创建一个触发器(它们是“devicerequest”中的批准列(在进行项目请求时为NULL)并将其设置为“Y”,这意味着是请求,它应该通过减去请求的数量来更改设备中的数量列(它们是一个约束,以确保您不要求设备数量>数量)。

所以我尝试了很多不同的变种,但仍然会出现错误,这就是我现在所拥有的:

create or replace trigger "DEVICEREQUEST_T1"
before update on "DEVICEREQUEST"
for each row  

begin

if(:NEW.approval = 'Y')
then 
update device set device.quantity = device.quantity - devicerequest.devicequantity
where device.id = devicerequest.deviceid;

end if;
end;

我为此得到了这些错误:

6 23 PL / SQL:ORA-00904:“DEVICEREQUEST”。“DEVICEID”:标识符无效

5 5 PL / SQL:忽略SQL语句

我也试过这个:

create or replace trigger "DEVICEREQUEST_QUANTITY"
BEFORE
update of "APPROVAL" on "DEVICEREQUEST"
for each row
when (NEW.approval = 'Y')
begin
update device set quantity = quantity - devicequantity where id = deviceid;
end;​

我为此得到了这些错误:

2 67 PL / SQL:ORA-00904:“DEVICEID”:标识符无效

2 1 PL / SQL:忽略SQL语句

我正在使用Oracle Application Express 4.2.5,感谢我一直在努力解决这个问题并且无法弄清楚出了什么问题。

2 个答案:

答案 0 :(得分:0)

您的UPDATE声明就像是

update device 
   set device.quantity = device.quantity - :new.devicequantity
 where device.id = :new.deviceid;

当然,在实际系统中,如果管理员可以并行批准请求,您可以轻松地提出导致quantity降至0以下的情况。

你说你有一个约束阻止devicequantity超过quantity,但你不能有一个比较表间数据的约束。您可以使用触发器执行该验证。如果是这样,很可能您的触发器在多用户环境中不足以强制执行您希望它强制执行的约束。

答案 1 :(得分:0)

您可以发出更新,在请求时删除请求的金额,而不是批准。如果更新会导致数量降到零以下,则会出现错误,否则您将保留"保留"这个号码待售,你不必担心之后非常接近的请求。当请求获得批准后,您锁定了该金额,如果被拒登,请将数量更新为"返回"预留金额。

您可能希望根据请求和批准之间的时间长度和/或是否有某种方法来确定批准/拒绝的可能性来调整流程。例如,您可以预留50%的请求金额,而不是全部金额用于降低概率请求。