Oracle pl/sql语句触发器
假设我们有以下两个表: OrderHeaderOrderID、Odate、CustID、总计 订单\项目订单ID、项目ID、数量、小计 编写一个语句级触发器,用 每当发生插入、更新或删除事件时,订单项目记录的总值Oracle pl/sql语句触发器,oracle,plsql,triggers,Oracle,Plsql,Triggers,假设我们有以下两个表: OrderHeaderOrderID、Odate、CustID、总计 订单\项目订单ID、项目ID、数量、小计 编写一个语句级触发器,用 每当发生插入、更新或删除事件时,订单项目记录的总值 在订单项目表上发生。对于任何更新错误,引发异常 到目前为止,我写了以下内容: create or replace TRIGGER SECURE_ORDER AFTER INSERT OR DELETE OR UPDATE ON Order_Item declare sum1 Numb
在订单项目表上发生。对于任何更新错误,引发异常 到目前为止,我写了以下内容:
create or replace TRIGGER SECURE_ORDER
AFTER INSERT OR DELETE OR UPDATE ON Order_Item
declare
sum1 Number;
BEGIN
SELECT SUM(Qty*Price) Into sum1 FROM Order_Item Inner join Item Using(ItemID) WHERE OrderID=:OLD.OrderID;
UPDATE OrderHeader set Total=sum1 where OrderID=:OLD.OrderID;
EXCEPTION
WHEN too_many_rows then
dbms_output.put_line('Too many rows');
WHEN no_data_found then
dbms_output.put_line('No Data Found');
WHEN others then
dbms_output.put_line('other error');
END;
然而,这是不正确的,因为问题语句说我必须编写一个语句级触发器,它不给我访问新旧关键字的权限。我不知道如何在语句级触发器中执行此操作。任何帮助都将不胜感激。您只需使用一条合并语句:
创建触发器安全命令
插入、删除或更新订单项目后
开始
合并到OrderHeader dst中
使用
选择COALESCE oh.OrderID,o.OrderID作为OrderID,
合并o.Qty*i.Price之和,0为总计
来自订单头哦
完全外部连接订单\项目o
关于oh.OrderID=o.OrderID
左外连接项i
关于o.ItemID=i.ItemID
按合并oh.OrderID、o.OrderID分组
src
在src.OrderID=dst.OrderID上
当匹配时
更新集总计=src.total
当不匹配时
插入OrderID,总值src.OrderID,src.Total;
终止
/
然后,如果您有表格:
创建表项
ItemID编号10,0
始终作为身份生成
约束项\项ID \主键,
名称VARCHAR220
不为空,
价格编号12,2
非空
约束项价格0检查价格>=0
;
创建表格订单项目
OrderID INT
-约束订单\项目\订单ID \ FK引用订单订单ID
不为空,
数量整数
非空
约束订单\u项目\u数量\u GT\u 0\u检查数量>0,
ItemID INT
非空
约束顺序\u Item\u ItemID\u FK引用Item ItemID,
约束顺序\u项目\uuuu OID\uuuuu IID\uuuuuu PK主键OrderID,ItemID
;
创建表OrderHeader
OrderID INT
不为空,
总数14,2
非空
;
如果你:
在项目名称中插入价格值“项目001”,1.00;
在项目名称中插入价格值“项目002”,2.00;
在项目名称中插入价格值“项目003”,2.50;
在订单中插入项目OrderID、ItemID、数量值1、1、3;
在订单中插入项目OrderID、ItemID、数量值1、2、1;
在订单中插入项目OrderID、ItemID、数量值1、3、2;
OrderHeader表包含:
从OrderHeader中选择*;
OrderHeader表包含:
从OrderHeader中选择*;
OrderHeader表包含:
从OrderHeader中选择*;
OrderHeader表包含:
从OrderHeader中选择*;
dbfiddle对于任何更新错误,请引发异常。请回答您的问题,以提供例外情况的全部细节? ORDERID | TOTAL ------: | ----: 1 | 10 ORDERID | TOTAL ------: | ----: 1 | 15 ORDERID | TOTAL ------: | ----: 1 | 8 ORDERID | TOTAL ------: | ----: 1 | 0