Oracle 11g PL/SQL Diana 节点数限制

Posted

技术标签:

【中文标题】Oracle 11g PL/SQL Diana 节点数限制【英文标题】:Oracle 11g PL/SQL Diana Nodes Limit 【发布时间】:2012-02-10 11:37:11 【问题描述】:

我有一个如下的声明,但它一次可以打 1000 个电话。超出此范围的任何内容都会引发 PLS-123 错误 Program Too Large Diana Nodes

begin
sp_myprocedure(....)
sp_myprocedure(....)
sp_myprocedure(....)
sp_myprocedure(....)
end

我们正在迁移到 11g,我想知道这个限制是否可以增加到 2000,例如。

谢谢

【问题讨论】:

> “我有如下声明,但它一次填充了 1000 个电话 >” 你为什么要这样做?为什么不改用 LOOP? 每个存储过程调用的参数都不一样 Are you compiling with debug information added? 【参考方案1】:

“我有一个如下的声明,但它填充了 1000 次调用 一次”

这是一个非常糟糕的编程策略。多次编写相同的东西是一种代码味道。每当我们发现自己使用 cut'n'paste 进行编程,然后进行一些编辑时,我们就应该停下来问自己,“嗯,有没有更好的方法来做到这一点?”

“每个存储过程调用的参数都不一样”

是的,但参数必须来自某个地方。大概目前您正在对它们进行一千次硬编码。呸。

更好的解决方案是将它们存储在一个表中。然后你可以写一个简单的循环。像这样:

for prec in ( select p1, p2 from my_parameters
              order by id -- if ordering is important 
            )
loop
    sp_myprocedure(prec.p1, prec.p2);
end loop;

因为您将参数存储在一个表中,所以您可以随意调用该过程,并且不受 Diana 节点限制的约束。

确实,您必须将参数值移动到表中,但在表中维护数据并不比在源代码中维护硬编码值更难。

【讨论】:

+1 @APC。将数据保存在表中而不是源代码中的值是至关重要的!【参考方案2】:

如果您只是从 10g 迁移,那么我认为限制没有改变。因此,如果您现在遇到问题,那么您将在 11g 中再次遇到这些问题。看看thisAsk Tom 的文章。一般建议是将您的程序放在一个包中。或者,将其分解成更小的块。如果您只是在运行调用该过程 1000 次的块并且在该过程中单独出现错误,那么我建议您按照 APC 所说的那样尝试并循环遍历它,因为这应该会减少节点的数量。

【讨论】:

以上是关于Oracle 11g PL/SQL Diana 节点数限制的主要内容,如果未能解决你的问题,请参考以下文章

用于 oracle 11g 的 PL/SQL 中的嵌入式脚本 [重复]

PL/SQL Oracle 11g 记录组

oracle 11g 中 for 循环中的 PL/SQL 限制

PL/SQL Developer连接本地Oracle 11g 64位数据库

在 Oracle 11g Express Edition 中运行 PL/SQL 代码 - 错误

PL/SQL32位连接Oracle 11g64位