PL/SQL 批量SQL

批量SQL包括:

FORALL语句

BULK COLLECT子句

FORALL语句

FORALL具有如下结构:

FORALL loop_counter IN bounds_clause [SAVE ECEPTIONS]

SQL_STATEMENT;

其中, bounds_clause是下面形式之一:

lower_limit .. upper_limit

INDICES OF collection_name [BETWEEN lower_limit .. upper_limit]

VALUES OF collection_name

第一种与for循环一样。

第二种用于稀疏数组,比如一个嵌套表,删除了其中某几项,遍历时会自动跳过执行语句。

第三种同样用于数组,但不是稀疏的,因此当VALUES OF 子句所引用的集合是空的,FORALL语句会导致异常。

另外,如果VALUES OF使用的是联合数组(即类似于Hashtable),必须是使用PLS_INTEGER或BINARY_INTEGER进行索引。VALUES OF的集合元素必须是PLS_INTEGER或BINARY_INTEGER。

SAVE EXCEPTIONS

如果在当前对应的SQL语句执行出现异常的情况下仍希望继续执行,那么需要添加SAVE EXCEPTIONS关键字。这些异常被存储在名为SQL%BULK_EXCEPTIONS的游标属性中。SQL%BULK_EXCEPTIONS是个记录集合,其中每个记录都有两个字段,ERROR_INDEX和ERROR_CODE。ERROR_INDEX表示出错的语句在FORALL中的迭代编号,ERROR_CODE会存储对应于所抛出的异常的ORACLE错误代码。为了获取异常信息,可用SQLERRM函数,传入ERROR_CODE即可。注意传入时,会添加一个负号作为前缀。

BULK COLLECT子句

BULK COLLECT 类似于游标循环,用上BULK COLLECT可用于批量SELECT INTO 和 FETCH INTO(SELECT * BULK COLLECT INTO 或 SELECT * BULK COLLECT INTO)。同时,当不返回任何数据时,不会抛出NO_DATA_FOUND的异常,因此,有必要判断返回的集合是否包含数据(COUNT是否为0)。

由于 BULK_COLLECT子句不会限制集合的尺寸,并能自动扩展。因此当SELECT语句返回大量数据时,最好限制结果集的大小。通过LIMIT选项可以实现这个目标。

posted @ 2013-08-31 16:49  kingsleylam  阅读(435)  评论(0编辑  收藏  举报