如何在 Oracle 包中执行私有过程?

Posted

技术标签:

【中文标题】如何在 Oracle 包中执行私有过程?【英文标题】:How do I execute private procedures in an Oracle package? 【发布时间】:2009-05-29 05:20:09 【问题描述】:

这是我第一次尝试创建一个包,所以我一定遗漏了一些非常明显的东西(我用谷歌搜索过的东西似乎都不值得一提)。

显然,如果您的包主体中有未包含在规范部分中的过程,那么这些过程是私有的。我遇到的问题是,一旦我制作了这些私有包,我似乎无法弄清楚如何引用这些包。而且 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,但也没有用。

我做错了什么?

【问题讨论】:

这很有帮助。我正确地拨打了电话,但我不知道我需要“前向声明”。 @end-user - 仅当我们在调用私有过程之前不声明私有过程时才需要前向声明。就我个人而言,我发现以正确的顺序声明程序比给自己一个额外的签名来维护更容易。 另一个好处是,如果您事先实现该过程,而不是仅仅声明它,您可以获得参数的代码建议。至少在 Toad 中是这样的。 【参考方案1】:

我认为你应该这样做:

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 - 确实 - 我的懒惰复制。【参考方案2】:
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

【讨论】:

以上是关于如何在 Oracle 包中执行私有过程?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用实体框架在 oracle 包中调用存储过程?

如何从包中删除过程或函数

如何找到 ORACLE 包中的过程的最后一个 DDL? [复制]

如何调用ORACLE程序包中的存储过程

oracle 包中定义全局变量

我如何在包中读取函数和过程 body/ddl?