- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
9_11g新特性_PLSQL:高效编码
Oracle Database 11g:面向 DBA 与开发人员的重要新特性高效的 PL/SQL 编码可在发生不同触发事件时触发多次的触发器,可以强制同一类型的触发器按序执行,新的 CONTINUE 语句是令 PL/SQL 编程更加轻松的新法宝。自诞生之日起,PL/SQL 就一直是 Oracle 数据库编程的首选语言。经过一段时间的发展,我们看到,由于该语言可以实现越来越多需要较少编码的功能,它已经演变为一个综合的开发平台。Oracle Database 11g 使得 PL/SQL 编码对程序员更加高效。在本文中,您将通过一些示例简单了解这个新功能。复合触发器请考虑一个酒店数据库:酒店房间的预订记录在名为 BOOKINGS 的表中。您还希望将对该表的更改记录到一个跟踪表 — 有些类似于审计,但稍有不同:您希望该操作是事务性的。在这种情况下,触发器非常适用。您可以使用一个小型的 after-update 行触发器,将旧值与新值连同更改者一起记录到 BOOKINGS_HIST 表中。到目前为止,一切都没问题。但 这里有一个小问题。after-update 行触发器将针对每一行触发,但某些预订是批量更改的,在一个事务中更新几百行。单独的 after-update 行触发器针对这些行中的每一行触发,并且每个执行在 bookings_hist 表中插入一条记录,因此性能不是最佳的。更 好的方法是批处理这些插入,并将它们批量插入 bookings_hist 表。您可以使用一系列复杂的触发器来完成这个任务。方法是:在行触发器中,将要插入 bookings_hist 表的值放到一个集合中,然后在 after-update-statement 触发器(只触发一次)中,将集合中的数据加载到 bookings_hist 表中。由于实际插入只发生一次,因此该过程比在每一行上插入要快。但它们是不同代码段中的两个不同的触发器。将集合变量从一个触发器传递 到另一个触发器的唯一方式是,在程序包规范中创建一个带有集合变量(如 VARRAY 或 PL/SQL TABLE)的程序包,在 after-update 行触发器上填充该程序包,然后在 after-statement 触发器上读取它 — 这可不是一项简单的任务。相反,如果您将所有触发器都放到一段代码中,不是更简单吗?在 Oracle Database 11g 中,您可以这么做(使用复合触发器)。 复合触发器实际上是作为一个整体定义的四个不同的触发器。例如,UPDATE 复合触发器将 before statement、before row、after statement 与 after row 都合并到一个复合触发器中。这是一段代码,因此您可以像任何其他单一 PL/SQL 代码一样来传递变量。下面我们来考虑一个示例。添加了行编号,以帮助说明。 1 create or replace trigger tr_bookings_track 2 for update of booking_dt 3 on bookings 4 compound trigger 5 type ty_bookings_hist is table of bookings_hist%rowtype 6 index by pls_integer; 7 coll_bookings_hist ty_bookings_hist; 8 ctr pls_integer := 0; 9 before statement is 10 begin 11 dbms_output.put_line(In before statement); 12 end before statement; 13 before each row is 14 begin 15 dbms_output.put_line(In before each row); 16 end before each row; 17 after each row is 18 begin 19 ctr := ctr + 1; 20 dbms_output.put_line(In after each row. booking_id=||:new.booking_id); 21 coll_bookings_hist(ctr).booking_id := :new.booking_id;
文档评论(0)