Oracle数据库11g新特性:高效的PL/SQL编码
2008-12-16 13:03:47 来源:WEB开发网自推出以来,PL/SQL 就一直是在 Oracle 数据库中编程的首选语言。经过一段时间的发展,我们看到,由于该语言可以实现越来越多需要较少编码的功能,它已经演变为一个综合的开发平台。Oracle 数据库 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 恢复误删除的表和误更新的表
- ››Oracle分页查询排序数据重复问题
- ››Oracle创建dblink报错:ORA-01017、ORA-02063解决
- ››Oracle 提高SQL执行效率的方法
- ››Oracle 动态查询,EXECUTE IMMEDIATE select into...
- ››Oracle 11g必须开启的服务及服务详细介绍
- ››oracle性能34条优化技巧
- ››oracle数据库生成随机数的函数
- ››Oracle 数据库表空间容量调整脚本
- ››oracle单库彻底删除干净的方法
- ››Oracle创建表空间、创建用户以及授权、查看权限
- ››oracle 中 UPDATE nowait 的使用方法
更多精彩
赞助商链接