服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 数据库技术 > Oracle技术 > DBA > 查看文档

oracle 10g中用firall处理非连续数组

    在pl/sql循环中执行数据操作语言(dml)是一件费时的工作,因为每次循环都要由pl/sql引擎转向sql引擎。应用forall是一个更好的方法,它一次性向sql语句提交一组临时值。

  在pl/sql循环中执行数据操作语言(dml)是一件费时的工作,因为每次循环都要由pl/sql引擎转向sql引擎。应用forall是一个更好的方法,它一次性向sql语句提交一组临时值。

  在oracle 10g前,forall语句的语法只能处理连续性的数组元素:

forall index_name in lower_bound ..upper_bound sql_statement;

  这意味着:在以前,使用forall的嵌套表不能删除待处理数组中间的元素,而且数组项必须进行连续处理。oracle 10g解决了这两方面的问题,并增加了indices of和values of子句。

  indices of子句替代lower_bound ..upper_bound,说明所有要处理的有效索引值,即使这些值之间存在间隔。就像是这样:

forall index_name in indices of collection_name
between lower_bound and upper_bound
sql_statement;

  您仍然可以应用between语法限制要处理的范围,这是一个可选的内容。

  values of子句帮助您以不同顺序处理主要的集合。您再建立另一个集合,其中只包含您要处理的索引号码,这些号码以您希望处理的顺序排列。然后该语句变为:

forall index_name in values of index_collection
sql_statement;

  列表a中是一个应用hr样本模式的例子。我将部门名称加载到内存中的一个嵌套表内,然后在里面搜索与it有关的部门。每搜索到一个,我保存它的表输入项索引。values of子句结合这组索引对表中的每个部门进行insert语句处理。(这只是一个示例;用一个单独的sql语句也可以进行同样的处理。)列表b中是输出结果。


  

扫描关注微信公众号