li
  当前位置:主页 > 性能优化 > 文章内容
li
FORALL语句的小问题
来源: http://yangtingkun.itpub.net/  作者: yangtingkun    时间:2008-01-26   阅读:5  

Oracle提供的批量操作功能FORALL语句,可以批量的执行动态SQL语句,从而有效的提高执行的效率。

在编写存储过程的时候,碰到一个和FORALL有关的bug,在这里记录一下。


编写的存储过程大致如下:

SQL> CREATE OR REPLACE PROCEDURE P_TEST AS
2 TYPE T_TABLE IS TABLE OF VARCHAR2(30000);
3 V_GRANTS T_TABLE;
4 BEGIN
5 SELECT 'GRANT SELECT ON ' || TABLE_NAME || ' TO SCOTT'
6 BULK COLLECT INTO V_GRANTS
7 FROM USER_TABLES;
8
9 FORALL I IN 1..V_GRANTS.COUNT
10 EXECUTE IMMEDIATE V_GRANTS(I);
11 END;
12 /

警告: 创建的过程带有编译错误。

SQL> SHOW ERR
PROCEDURE P_TEST 出现错误:

LINE/COL ERROR
-------- ----------------------------------------------------------
0/0 PLS-00801: 内部错误 [74301]

而这里如果不使用FORALL语句的话,则不会报错。

SQL> CREATE OR REPLACE PROCEDURE P_TEST AS
2 TYPE T_TABLE IS TABLE OF VARCHAR2(30000);
3 V_GRANTS T_TABLE;
4 BEGIN
5 SELECT 'GRANT SELECT ON ' || TABLE_NAME || ' TO SCOTT'
6 BULK COLLECT INTO V_GRANTS
7 FROM USER_TABLES;
8
9 FOR I IN 1..V_GRANTS.COUNT LOOP
10 EXECUTE IMMEDIATE V_GRANTS(I);
11 END LOOP;
12 END;
13 /

过程已创建。

使用PLS-00801、74301和FORALL在METALINK上进行查询,结果发现果然是Oracle的bug。Oracle不支持在FORALL语句中对多个不同的表同时进行操作。仔细想想也确实有道理。看bug的状态,似乎Oracle并没有打算解决这个bug。那么只能是编程的时候多注意一点了。

这个测试是在9204上进行的。不过这个问题应该是覆盖817以上的所有版本。

METALINK详细描述地址:https://metalink.oracle.com/metalink/plsql/ml2_documents.showFrameDocument?p_database_id=BUG&p_id=3038800




  上一篇: 日期转换函数的格式参数大小写规...   下一篇: 判断是否数字类型
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·日期转换函数的格式参数大小写规...
·BULK COLLECT的小毛病
·通过触发器复制包含LONG类型的表
·计算月还款的小过程(三)
·计算月还款的小过程(二)
·计算月还款的小过程(一)
·Deterministic函数(二)
·Deterministic函数
·给用户授予权限时应该尽量避免AN...
·自定义分析函数
·判断是否数字类型
·FOR ALL语法浅析
·判断是否数字类型(二)
·编码规范的重要性——一次PLSQL程...
·10g的MAX、MIN的bug
·过程执行报错ORA-4068
·RETURNING语句几个小问题
·自定义聚集函数访问远端对象(一...
·自定义聚集函数访问远端对象(二...
·自定义聚集函数访问远端对象(三...
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接