2009-05-29 64 views
4

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

显然,如果程序包体中没有包含在规范部分中的程序,那么这些程序是私有的。我得到的问题是,我似乎无法弄清楚如何参考这些私人包裹,一旦我已经使他们。并且SQL Developer拒绝给我任何比'执行完成并且警告'更有用的消息,这对我没有帮助...

作为一个例子,这就是我一直在尝试的,不起作用的抛出上述编译器错误):

CREATE OR REPLACE PACKAGE BODY testPackage AS 

PROCEDURE privateProc; --Forward declaration 

PROCEDURE publicProc IS 
BEGIN 
    EXECUTE privateProc(); 
END; 

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

END testPackage; 

我也试着将其称为testPackage.privateProc,这也不奏效。

我在做什么错?

+0

这很有帮助。我正确地拨打了电话,但我不知道我需要一个“前向声明”。 – 2012-10-04 18:22:10

+0

@最终用户 - 只有在调用之前不声明私有过程时,才需要前向声明。就我个人而言,我发现以正确的顺序声明程序比给予自己额外的签名更容易维护。 – APC 2013-04-22 08:59:43

回答

15

我认为你应该这样做:

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,就好像它是语言的一部分。执行是为了在PL/SQL中运行DML或SQL。

0
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