如何在更新/插入之前创建一个异常,我必须将一个表的属性值与另一个表的属性值进行比较?

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.

好吧,我只是用这个提交了我的作业,没有考虑引发真正的异常(由于时间的限制),但我猜就是这样。

【讨论】:

以上是关于如何在更新/插入之前创建一个异常,我必须将一个表的属性值与另一个表的属性值进行比较?的主要内容,如果未能解决你的问题,请参考以下文章

在 Redshift 中更新整个表的正确方法,删除表 + 创建表与截断 + 插入表

Redshift - 将文本列插入数据库表的问题

如何实现插入数据时自动更新另外一个表的内容

如何将值插入单链表

插入更新另一个表后创建触发器

如何在mysql 5中记录特定表的插入/更新查询