Oracle 方法中形成的PLSQL循环

Oracle 方法中形成的PLSQL循环,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,在一个包中,我有调用其他程序的程序,正在形成循环,并得到PLS-00313:“检查表”未在该范围内声明 Checklist procedure -> Task method. Task method -> Step Checklist method. Step Checklist method -> Checklist method. 如何解决这个问题?PLSQL是否有C++原型?< P>如果您要调用的包中有私有过程或函数。< /P> 专用功能和过程是规范中未定义的功能和过程

在一个包中,我有调用其他程序的程序,正在形成循环,并得到PLS-00313:“检查表”未在该范围内声明

Checklist procedure -> Task method.
Task method -> Step Checklist method.
Step Checklist method -> Checklist method.

如何解决这个问题?PLSQL是否有C++原型?

< P>如果您要调用的包中有私有过程或函数。< /P> 专用功能和过程是规范中未定义的功能和过程

备选案文1: 被调用的过程始终位于包体的顶部或调用者的顶部

e、 g: 清单是公开的

create OR REPLACE PACKAGE mypck AS 
  procedure Checklist procedure;
  procedure main;
end;
/
CREATE OR REPLACE PACKAGE BODY mypck AS 

  -- private procedures

  procedure Step Checklist is ... -- should be here because is called from  Task method, calls public checklist procedure

  procedure Task is ... -- should be here,because it calls private Step Checklist procedure and is called from  Checklist

 -- public procedures

  procedure Checklist is ... -- calls private Task procedure

  procedure main is ... -- calls public Checklist procedure

END mypck; 
/ 
备选案文2: 使用转发声明,通过输入整个正文的签名,使所有私有过程在包正文中可见

create OR REPLACE PACKAGE mypck AS 
  procedure main;
end;
/
CREATE OR REPLACE PACKAGE BODY mypck AS 

  -- forward declaration here of all private signature

  procedure Task ;
  procedure Step Checklist;
  procedure Checklist;

  -- define implementation of private procedures

  -- use in order you want to use it
  procedure Step Checklist is ... -- calls private Checklist procedure 

  procedure Task is ...  -- calls private Step Checklist procedure

  procedure Checklist is ...  -- calls private Task procedure


  -- public procedure

  procedure main is -- calls private Checklist procedure

END mypck; 
/ 

如果包中有要调用的私有过程或函数

专用功能和过程是规范中未定义的功能和过程

备选案文1: 被调用的过程始终位于包体的顶部或调用者的顶部

e、 g: 清单是公开的

create OR REPLACE PACKAGE mypck AS 
  procedure Checklist procedure;
  procedure main;
end;
/
CREATE OR REPLACE PACKAGE BODY mypck AS 

  -- private procedures

  procedure Step Checklist is ... -- should be here because is called from  Task method, calls public checklist procedure

  procedure Task is ... -- should be here,because it calls private Step Checklist procedure and is called from  Checklist

 -- public procedures

  procedure Checklist is ... -- calls private Task procedure

  procedure main is ... -- calls public Checklist procedure

END mypck; 
/ 
备选案文2: 使用转发声明,通过输入整个正文的签名,使所有私有过程在包正文中可见

create OR REPLACE PACKAGE mypck AS 
  procedure main;
end;
/
CREATE OR REPLACE PACKAGE BODY mypck AS 

  -- forward declaration here of all private signature

  procedure Task ;
  procedure Step Checklist;
  procedure Checklist;

  -- define implementation of private procedures

  -- use in order you want to use it
  procedure Step Checklist is ... -- calls private Checklist procedure 

  procedure Task is ...  -- calls private Step Checklist procedure

  procedure Checklist is ...  -- calls private Task procedure


  -- public procedure

  procedure main is -- calls private Checklist procedure

END mypck; 
/ 

有两种方法可以解决这个问题

第一种方法是通过在包规范中包含检查表来修复范围错误,该检查表是公开的,因此可以由正文中定义的任何程序引用,或者通过使用前向声明来定义包正文顶部的程序,从而允许后续程序引用这些程序,而不管其顺序如何哪些程序是编写的

然而,这种方法有一个问题:您的代码执行这样的递归循环

Checklist -> Task -> Step Checklist -> Checklist
因此,您必须在检查表或步骤检查表中编写一些代码,以打破循环并解开代码。这样做的必要性是一个危险信号,表明您的设计中存在一些错误

因此,第二种方法是回退并考虑是否有另一种方法来实现业务逻辑而无循环依赖性。循环依赖在软件体系结构中是一件坏事,应该尽可能避免。通常的解决方案是隔离公共依赖关系——在这种情况下,检查表和步骤检查表都需要执行的操作——并将其提取到新的子例程中。然后更改这两个过程以调用新过程


这可能很容易实现,也可能很难实现,这取决于公共依赖的性质:修复一段纯代码会更容易,修复底层数据模型中的递归会更难。无论哪种方式,都值得花时间删除循环依赖关系。非循环依赖关系图不那么脆弱,更容易理解和维护。

有两种方法可以解决这个问题

第一种方法是通过在包规范中包含检查表来修复范围错误,该检查表是公开的,因此可以由正文中定义的任何程序引用,或者通过使用前向声明来定义包正文顶部的程序,从而允许后续程序引用这些程序,而不管其顺序如何哪些程序是编写的

然而,这种方法有一个问题:您的代码执行这样的递归循环

Checklist -> Task -> Step Checklist -> Checklist
因此,您必须在检查表或步骤检查表中编写一些代码,以打破循环并解开代码。这样做的必要性是一个危险信号,表明您的设计中存在一些错误

因此,第二种方法是回退并考虑是否有另一种方法来实现业务逻辑而无循环依赖性。循环依赖在软件体系结构中是一件坏事,应该尽可能避免。通常的解决方案是隔离公共依赖关系——在这种情况下,检查表和步骤检查表都需要执行的操作——并将其提取到新的子例程中。然后更改这两个过程以调用新过程


这可能很容易实现,也可能很难实现,这取决于公共依赖的性质:修复一段纯代码会更容易,修复底层数据模型中的递归会更难。无论哪种方式,都值得花时间删除循环依赖关系。非循环依赖关系图不那么脆弱,更容易理解和维护。

我不知道原型。您是否将所有这些程序纳入了包装规范?如果没有,请这样做并重试。为什么要在过程和方法之间切换?术语上的不一致性是否与架构相关?我不知道原型。您是否将所有这些程序纳入了包装规范?如果没有,请这样做并重试。为什么要在过程和方法之间切换?术语的不一致性是否与体系结构相关?我已经编辑了您的代码,以澄清第二个实现。前进点
最重要的是,所有的例行程序都是保密的。我们以任何顺序声明签名,然后以任何顺序定义程序,尽管使用与转发声明相同的顺序是一种良好的做法。我已编辑了您的代码以澄清第二个实现。向前声明的要点是所有例程都保持私有。我们以任何顺序声明签名,然后以任何顺序定义程序,尽管使用与转发声明相同的顺序是一种良好做法。