create or replace package pkg as
procedure main (n0 in out number);
end;
/
... 与身体 ...
create or replace package body pkg as
-- forward declarations
procedure p1 (n1 in out number);
procedure p2 (n2 in out number);
-- actual declarations
procedure p1 (n1 in out number)
is
begin
dbms_output.put_line('P1='||n1);
if n1 < 3 then
p2(n1);
end if;
end p1;
procedure p2 (n2 in out number)
is
begin
dbms_output.put_line('P2='||n2);
n2 := n2+1;
if n2 < 3 then
p1(n2);
end if;
end p2;
procedure main (n0 in out number)
is
begin
if n0 < 0 then
p1(n0);
else
p2(n0);
end if;
end main;
end pkg;
/
3 回答
我认为这些都是私有程序,也就是说,既没有出现在软件包规范中 .
如果规范中出现这两个程序就没有问题,因为正文反编译公开声明 .
同样,如果规范中出现了一个过程,则再次出现问题:只需在公共过程之前在私有过程中编写私有过程 .
但如果两个程序都是私有的,那么你需要使用前向声明 . 这只是意味着在包的顶部声明过程的签名 . 完全像把它们放在规范中,只有私有 . 这是一个规范......
... 与身体 ...
你真的应该试图找出一种避免循环依赖的方法 . 这是一个非常糟糕的编程习惯 . 很难理解程序是如何相互关联的,我们必须管理递归并确保两个程序最终都会在不调用另一个程序的情况下最终退出 . 请记住,这不仅仅是一个问题:它是一个传统,你将把一个传递给你的代码的未来维护者 .
您可以在编译包体之前使用包并编译所有包规范来破坏依赖关系链 . 规范将全部编译而不考虑依赖关系,然后在编译主体时,它们可以按任何顺序执行,因为它们将引用已编译的规范 . 通常,您将使用* .pks后缀和带有* .pkb后缀的主体以及编译它们的某种构建脚本来存储包规范 . 像这样
如果两个过程都在规范中,那么只需编译包就可以了:
当然,这假设您的包是有效的 .
如果任何一个(或两个)过程不在规范中,最好的做法是将它列为包体开头的前向声明 .