在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函数可获得完整的信息文本。)
在列表A中,我在OE模型中建立了一个SALES_QUOTA表格。列表B试图从ORDERS表格中的现有数据中装载表格,却没有SAVE EXCEPTIONS子句。由于计算值超出栏精度,一些行会失败。从运行的结果看,没有行,即使是包含正确数据的行,得到更新。
列表C中FORALL中增加了SAVE EXCEPTIONS子句,在块中增加了一个EXCEPTIONS节。对sql% BILK_EXCEPTIONS指针属性进行处理,以获得失败的迭代。每进行一次迭代,迭代所使用的sql错误信息与数据被返回。列表D显示了运行结果。
Bob Watkins(OCP, MCDBA, MCSE, MCT)是一个有着25年经验的计算机专业人士,曾做过技术培训师、顾问与数据库管理员。
责任编辑:张琎