分类: Oracle
2008-04-03 23:10:40
在PL/SQL中,批量绑定是高效处理动态DML的一种重要手段。它不用在程序内循环,每次迭代提交一个UPDATE语句;你可以使用FORALL语句提交一个含有绑定变量的单独UPDATE语句。集合,如嵌套表格或VARRAY,用来将多个数据值赋予给绑定变量。
产生的结果是在单程访问SQL Server引擎过程中执行的一组迭代,而不是SQL与PL/SQL之间的交替。这减少了两个引擎间上下文切换的额外负担。缺点是:如果任何数据值产生了无效的更新(UPDATE),整组迭代都将被退回。
要避免这一问题,可以允许完成一些UPDATE迭代,但返回失败的迭代列表。Oracle 9i引入了完成这一操作的两个语法元素:FORALL的SAVE EXCEPTIONS子句,以及名为SQL% BILK_EXCEPTIONS的指针属性。
SQL% BILK_EXCEPTIONS是一个复杂的数据类型(记录),它有两个域:ERROR_INDEX是产生错误的迭代,ERROR_CODE是描述错误的Oracle错误信息号码。(应用SQLERRM函数可获得完整的信息文本。)
在中,我在OE模型中建立了一个SALES_QUOTA表格。试图从ORDERS表格中的现有数据中装载表格,却没有SAVE EXCEPTIONS子句。由于计算值超出栏精度,一些行会失败。从运行的结果看,没有行,即使是包含正确数据的行,得到更新。
中FORALL中增加了SAVE EXCEPTIONS子句,在块中增加了一个EXCEPTIONS节。对SQL% BILK_EXCEPTIONS指针属性进行处理,以获得失败的迭代。每进行一次迭代,迭代所使用的SQL错误信息与数据被返回。显示了运行结果。