解决Diana Nodes限制一例(续)

| No Comments | No TrackBacks

在《解决Diana Nodes限制一例》一文中,我在文章末尾提到----"这里我猜是PL/SQL Developer自身的问题,也就是说PL/SQL Developer还是沿用了8.1.3之前的3000行代码的限制。"。

 

当时我以为我找到了问题的真相,其实还差的远这里根本就不是PL/SQL Developer的问题

 

我们来看一下问题的真相是什么:

这里PL/SQL Developer在编译PCK_SAL_VFY_BATCH_RELEASE这个package body的时候为什么会报错"PLS-123 Program too large(Diana Nodes)"是因为Bug 5936020,这个bug10.2.0.4里已经被修正

 

具体来说是这样:

PL/SQL Developer默认在编译的时候是会带上debug选项的,也就是说PL/SQL Developer默认在编译package body的时候实际上是相当于执行了alter package packagename compile debug body,这个时候如果你的数据库的版本是10.2.0.4以下,那么当package body里的代码量到一定程度后很可能就会编译不过了,这时候会报错PLS-123 Program too large(Diana Nodes),但其实这个时候并没有达到Diana Nodes的上限。

 

解决方法有三个:

1、使用我在解决Diana Nodes限制一例》中提到的不带debug选项的方式编译,但用这种方式的缺陷在于编译好的package body不能debug进去了,这个对于开发人员来说通常是不可接受的:

SQL> conn ipra/acca@ipradev;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as ipra

 

SQL> alter package PCK_SAL_VFY_BATCH_RELEASE compile debug body;

 

Warning: Package body altered with compilation errors

 

SQL> select text from sys.all_errors where name='PCK_SAL_VFY_BATCH_RELEASE';

 

TEXT

--------------------------------------------------------------------------------

PLS-00123: program too large (Diana nodes)

 

SQL> alter package PCK_SAL_VFY_BATCH_RELEASE compile body;

 

Package body altered

 

SQL> select text from sys.all_errors where name='PCK_SAL_VFY_BATCH_RELEASE';

 

TEXT

--------------------------------------------------------------------------------

 

SQL> select debuginfo,object_name,object_type from sys.all_probe_objects where object_name='PCK_SAL_VFY_BATCH_RELEASE';

 

DEBUGINFO OBJECT_NAME                    OBJECT_TYPE

--------- ------------------------------ -------------------

F         PCK_SAL_VFY_BATCH_RELEASE      PACKAGE BODY

F         PCK_SAL_VFY_BATCH_RELEASE      PACKAGE

 

2、升级数据库到10.2.0.4

如果是10.2.0.4,一模一样的代码编译的时候则不会报错

SQL> conn caipra/acca@ipratest;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0

Connected as caipra

 

SQL> alter package PCK_SAL_VFY_BATCH_RELEASE compile debug body;

 

Package body altered

 

SQL> select text from sys.all_errors where name='PCK_SAL_VFY_BATCH_RELEASE';

 

TEXT

--------------------------------------------------------------------------------

 

SQL> select debuginfo,object_name,object_type from sys.all_probe_objects where object_name='PCK_SAL_VFY_BATCH_RELEASE';

 

DEBUGINFO OBJECT_NAME                    OBJECT_TYPE

--------- ------------------------------ -------------------

T         PCK_SAL_VFY_BATCH_RELEASE      PACKAGE BODY

T         PCK_SAL_VFY_BATCH_RELEASE      PACKAGE

 

SQL> alter package PCK_SAL_VFY_BATCH_RELEASE compile body;

 

Package body altered

 

SQL> select debuginfo,object_name,object_type from sys.all_probe_objects where object_name='PCK_SAL_VFY_BATCH_RELEASE';

 

DEBUGINFO OBJECT_NAME                    OBJECT_TYPE

--------- ------------------------------ -------------------

F         PCK_SAL_VFY_BATCH_RELEASE      PACKAGE BODY

T         PCK_SAL_VFY_BATCH_RELEASE      PACKAGE

 

3、将编译出错的package body拆分成小的package body的组合,这时候在PL/SQL Developer里编译的时候(debug)就不会报Diana Nodes的错误了。

No TrackBacks

TrackBack URL: http://dbsnake.com/cgi-bin/mt/mt-tb.cgi/58

Leave a comment