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

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

 2008-12-16 13:03:47 来源:WEB开发网   
核心提示: 复合触发器的一个真正有用的功能是,PL/SQL 代码中的状态对象(如变量、程序包等)在触发器被触发时进行实例化,Oracle数据库11g新特性:高效的PL/SQL编码(4),而在触发器触发结束后,状态将被清除干净,如下所示,(我已经将 dbms_output 语句放在代码中,在上面的示例中

复合触发器的一个真正有用的功能是,PL/SQL 代码中的状态对象(如变量、程序包等)在触发器被触发时进行实例化,而在触发器触发结束后,状态将被清除干净。在上面的示例中,您可以看到我既没有初始化集合,也没有删除集合中的内容。所有这些都是自动完成的,不需要我干预。

触发器中的按序执行

自 Oracle8 以来,您就能够在一个表上定义同一类型的多个触发器 — 例如,两个都是在同一个表的每行后执行插入操作的触发器。触发器的类型决定了执行顺序:before statement、before row、after statement 和 after row.但是,如果您有两个 after-row 触发器(T1 和 T2),应该先触发哪个呢?

同一类型的触发器的执行有些随机,或者至少不保证遵循某个模式。这会引发问题吗?我们来看一个名为 PAYMENTS 的表的示例,如下所示:

Name                   Null?Type
----------------------------------------- -------- ----------------------------
PAY_ID                       NUMBER(10)
CREDIT_CARD_NO                   VARCHAR2(16)
AMOUNT                       NUMBER(13,2)
PAY_MODE                      VARCHAR2(1)
RISK_RATING                    VARCHAR2(6)
FOLLOW_UP                     VARCHAR2(1)

需要根据支付类型和数量来计算风险率,并将其存储在 RISK_RATING 列中。下面这个简单的 before update 行触发器很好地完成了这个任务:

  create or replace trigger tr_pay_risk_rating
before update
on payments
for each row
begin
dbms_output.put_line ('This is tr_pay_risk_rating');
if (:new.amount) < 1000 then
:new.risk_rating := 'LOW';
elsif (:new.amount < 10000) then
if (:new.pay_mode ='K') then
:new.risk_rating := 'MEDIUM';
else
:new.risk_rating := 'HIGH';
end if;
else
:new.risk_rating := 'HIGH';
end if;
end;
/

现在,假设某人增加了另一个要求:应该标记某些基于 RISK_RATING、PAY_MODE 等列的项,以便在名为 FOLLOW_UP 的新列中跟踪。您可能已经修改了上述触发器,但保留现有代码不变并创建同一类型的新触发器(before update 行)始终是一个良好的策略,如下所示。(我已经将 dbms_output 语句放在代码中,以演示触发器的触发方式。)

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

Tags:Oracle 数据库 特性

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