WEB开发网
开发学院数据库Oracle Oracle数据库11g新特性:高效的PL/SQL编码 阅读

Oracle数据库11g新特性:高效的PL/SQL编码

 2008-12-16 13:03:47 来源:WEB开发网   
核心提示: create or replace trigger tr_pay_follow_upbefore updateon paymentsfor each rowbegindbms_output.put_line ('This is tr_pay_follow_up');if (

  create or replace trigger tr_pay_follow_up
before update
on payments
for each row
begin
dbms_output.put_line ('This is tr_pay_follow_up');
if (
(:new.risk_rating = 'HIGH' and :new.pay_mode = 'C')
or (:new.risk_rating = 'MEDIUM' and :new.pay_mode = 'K')
or (substr(:new.credit_card_no,1,5) = '23456')
) then
:new.follow_up := 'Y';
else
:new.follow_up := 'N';
end if;
end;
  /

现在,如果您更新表:

  SQL> get upd_pay
1 update payments set
2   credit_card_no = '1234567890123456',
3   amount = 100000,
4*  pay_mode = 'K'
  SQL> @upd_pay
This is tr_pay_follow_up
  This is tr_pay_risk_rating
  1 row updated.
  SQL> select * from payments;
  PAY_ID CREDIT_CARD_NO    AMOUNT P RISK_R F
---------- ---------------- ---------- - ------ -
1 1234567890123456   100000 C HIGH  N

发生了什么事?risk_rating 列是 HIGH,pay_mode 列是“C”,这意味着,FOLLOW_UP 列应该是“Y”,但它却是“N”。为什么?要回答这个问题,请看一下触发器的触发顺序:tr_pay_follow_up 在 tr_pay_risk_rating 之前触发。后者将列值设为高风险。这样,当前者触发时,risk_rating 列值为空(或“N”),因此它认为条件满足。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:Oracle 数据库 特性

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接