在编译包时,我遇到了一条错误消息:
Error: PLS-00123: program too large (Diana nodes)
Line: 1
有问题的包装有大约1k线(规格)+ 13k线.在研究这个问题时,我遇到了这个问汤姆问题
编译PL/SQL单元时,编译器会构建一个解析树.PL/SQL单元的最大大小由解析树的大小决定.此树中存在最大数量的戴安娜节点.
高达7.3,你可以拥有
2**14(16K)戴安娜节点,2**15允许从8.0到8.1.3, (32K)戴安娜节点.使用8.1.3,这个限制已经放宽,因此您现在可以2**26在此树中拥有 (即64M)diana节点用于包和类型主体.虽然没有简单的方法来转换源代码行的限制,但我们观察到每行源代码大约有5到10个节点.在8.1.3之前,编译器可以干净地编译多达3,000行代码.
从8.1.3开始,包体和类型体的限制被放宽,现在可以有大约6,000,000行代码.这是一个粗略的估计.如果您的代码有许多空格,长标识符等,您最终可能会得到大于此的源代码.
现在,即使您考虑到关于许多空格和大型标识符的最后一个列表,我认为可以合理地得出结论,它不是接近上述限制的地方.
更进一步,
如何检查包的当前大小:
要检查包的大小,可以使用的最接近的相关数字是数据字典视图USER_OBJECT_SIZE中的PARSED_SIZE.此值提供存储在
SYS.IDL_xxx$表中的DIANA大小(以字节为单位),而不是共享池中的大小.[...]
例如,当
PARSED_SIZEinUSER_OBJECT_SIZE不超过50K 时,您可能会遇到64K限制的问题.
查询这个视图给出了结果48929- 所以我认为它的大小是47k的公平?
奇怪的是,从另一个模式中获取相同的对象并在我遇到问题的区域中运行它成功编译.
那么为什么这个特定的区域会引起问题?