如何在更新/插入之前创建一个异常,我必须将一个表的属性值与另一个表的属性值进行比较?
Posted
技术标签:
【中文标题】如何在更新/插入之前创建一个异常,我必须将一个表的属性值与另一个表的属性值进行比较?【英文标题】:How do I create an exception on before update/insert where I have to compare value of attribute of one table to the value of the attribute of another? 【发布时间】:2018-02-22 14:57:06 【问题描述】:架构是
CUSTOMER(Cus_code, Cus_fname, Cus_lname, Cus_balance)
INVOICE(Inv_no, Cus_code, Inv_date, Inv_amount)
LINE(Inv_no, Line_no, P_code, Line_units, Line_price)
PRODUCT(P_code, P_desc, P_qoh, P_min, P_price, V_code)
VENDOR(V_code, V_name, V_Contact)
create or replace trigger inexcb
before update
of invoice.Inv_amount,customer.cus_balance
on invoice,customer
for each row
when (invoice.Inv_amount>customer.cus_balance)
where invoice.cus_balance=customer.cus_balance
declare
excep1 exception;
begin
raise excep1;
dbms_output.put_line='Invoice amount becoming more than Customer balance is
not allowed.';
end;
【问题讨论】:
这甚至不会编译。 dbms_output.put_line 是一个过程调用,即 肯定'发票金额不能超过客户余额。' 对于自定义错误,请使用raise_application_error(-20000,'Invoice amount .. blah blah blah');
现在关于您的“触发代码”......这个触发器应该在哪个表上?
【参考方案1】:
SQL> create or replace function inv_detail(inv_num char)
2 return number is
3 cus_bal number(6,2);
4 begin
5 select c.cus_balance into cus_bal from customer c
6 where c.cus_code=inv_num;
7 return cus_bal;
8 end;
9 /
Function created.
SQL> create or replace trigger thr_exce
2 before insert on invoice
3 for each row
4 begin
5 if :new.Inv_amount>inv_detail(:new.cus_code) then
6 raise_application_error(-20200,'Invoice amount cannot be greater than customer balance');
7 end if;
8 end;
9 /
Trigger created.
好吧,我只是用这个提交了我的作业,没有考虑引发真正的异常(由于时间的限制),但我猜就是这样。
【讨论】:
以上是关于如何在更新/插入之前创建一个异常,我必须将一个表的属性值与另一个表的属性值进行比较?的主要内容,如果未能解决你的问题,请参考以下文章