如何在Oracle包中执行私有过程? 这是我第一次尝试创建一个包,所以我一定错过了一些非常明显的东西(我没有搜索到的东西,甚至认为它值得一提)。

如何在Oracle包中执行私有过程? 这是我第一次尝试创建一个包,所以我一定错过了一些非常明显的东西(我没有搜索到的东西,甚至认为它值得一提)。,oracle,plsql,Oracle,Plsql,显然,如果包体中有规范部分未包含的过程,那么这些过程是私有的。我遇到的问题是,一旦我制作了这些私人软件包,我似乎无法想出如何引用它们。SQL开发人员拒绝给我任何比“执行已完成并带有警告”更有用的消息,这对我没有帮助 举个例子,这就是我一直尝试的不起作用的东西(只是抛出前面提到的编译器错误): 我还尝试将其称为testPackage.privateProc,但它也不起作用 我做错了什么?我认为你应该这样做: CREATE OR REPLACE PACKAGE BODY testPackage AS

显然,如果包体中有规范部分未包含的过程,那么这些过程是私有的。我遇到的问题是,一旦我制作了这些私人软件包,我似乎无法想出如何引用它们。SQL开发人员拒绝给我任何比“执行已完成并带有警告”更有用的消息,这对我没有帮助

举个例子,这就是我一直尝试的不起作用的东西(只是抛出前面提到的编译器错误):

我还尝试将其称为
testPackage.privateProc
,但它也不起作用


我做错了什么?

我认为你应该这样做:

CREATE OR REPLACE PACKAGE BODY testPackage AS
PROCEDURE privateProc; --Forward declaration

PROCEDURE publicProc IS
  BEGIN    
    privateProc();
END;

PROCEDURE privateProc IS
BEGIN    
  DBMS_OUTPUT.PUT_LINE('test');
END;
END testPackage;

只要调用privateProc,就好像它是语言的一部分一样。Execute用于在PL/SQL中运行DML或SQL。

顺便说一句,您不需要空括号()@jeffrey Kemp-事实上-我的惰性复制。这很有帮助。我的调用是正确的,但我不知道我需要一个“转发声明”。@end-user-转发声明只有在调用私有过程之前不声明它们时才有必要。就我个人而言,我发现按照正确的顺序声明过程比给自己一个额外的签名来维护更容易。另一个优点是,如果您事先实现了过程,而不仅仅是声明它,您就可以得到参数的代码建议。至少蟾蜍是这样的。
CREATE OR REPLACE PACKAGE BODY testPackage AS

PROCEDURE publicProc; --Forward declaration

PROCEDURE publicProc IS
BEGIN
privateProc; --exec privateProc;
END;

PROCEDURE privateProc IS
BEGIN
DBMS_OUTPUT.PUT_LINE('test');
END;

END testPackage;

//call testPackage.publicProc
CREATE OR REPLACE PACKAGE BODY testPackage AS

PROCEDURE publicProc; --Forward declaration

PROCEDURE publicProc IS
BEGIN
privateProc; --exec privateProc;
END;

PROCEDURE privateProc IS
BEGIN
DBMS_OUTPUT.PUT_LINE('test');
END;

END testPackage;

//call testPackage.publicProc