所以我有两个表,一个叫“ device”,另一个叫“ devicerequest”
“设备”表具有包括id(主键),名称,数量的列,并且基本上具有“(1,iPhone,3),(2,iPad,1)之类的数据,它表示:id = 1 name = iPhone数量= 3。
“ devicerequest”表具有包括requestid(主键),deviceid,devicequantity的列,并具有类似(22、1、2)的数据,这意味着它正在请求2部iPhone。
因此,基本上,我试图在管理员确认请求时创建触发器(它们在“ devicerequest”中为批准列(当进行projectrequest时为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,感谢我一段时间以来一直在提供的各种帮助,但无法弄清楚出了什么问题。
您的UPDATE
声明将类似于
update device
set device.quantity = device.quantity - :new.devicequantity
where device.id = :new.deviceid;
当然,在实际系统中,如果管理员可以并行批准请求,则可以很容易地想到会导致quantity
降至0以下的情况。
您说您有一个约束来防止devicequantity
超过,quantity
但是您不能有一个约束来比较表之间的数据。您可以有一个执行该验证的触发器。如果是这样,您的触发器很可能在多用户环境中不足以强制执行您期望其执行的约束。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句