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 中的嵌入式脚本 [重复]
oracle 11g 中 for 循环中的 PL/SQL 限制
PL/SQL Developer连接本地Oracle 11g 64位数据库