Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle pl/sql语句触发器_Oracle_Plsql_Triggers - Fatal编程技术网

Oracle pl/sql语句触发器

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

假设我们有以下两个表:

OrderHeaderOrderID、Odate、CustID、总计

订单\项目订单ID、项目ID、数量、小计

编写一个语句级触发器,用 每当发生插入、更新或删除事件时,订单项目记录的总值
在订单项目表上发生。对于任何更新错误,引发异常

到目前为止,我写了以下内容:

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