【问题标题】:Calling private function within package body在包体内调用私有函数
【发布时间】:2017-08-01 00:36:11
【问题描述】:

根据 Oracle 文档,可以通过在正文中而不是在规范中声明项目来使项目在包中成为私有。

我在这个包中有一个过程,它需要调用一个不应在这个包之外访问的函数。 Oracle SQL Developer 返回PLS-00313 'ADD_STUDENT' not declared in this scope

声明:

PACKAGE SCHOOL AS
    PROCEDURE ADD_PEOPLE(...);
END SCHOOL;

主体:

PACKAGE BODY SCHOOL AS
    PROCEDURE ADD_PEOPLE(...)
        ...
        ADD_STUDENT();
    END ADD_PEOPLE;

    FUNCTION ADD_STUDENT(...)
        ...
    END ADD_STUDENT;
END SCHOOL;

我找不到调用内部函数/过程以及是否需要包声明的示例 ex:SCHOOL.ADD_STUDENT()

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您遇到的问题(假设您以正确的方式调用正确命名的过程/函数)是您试图调用对尚未声明的函数的调用。有两种方法可以解决这个问题,假设你想保持函数私有:

    1. 在调用它的任何过程/函数之前声明 ADD_STUDENT 函数。
    2. 在函数被调用之前使用forward declaration声明函数。

    因此,对于选项 1,您的示例代码如下所示:

    PACKAGE BODY SCHOOL AS
        FUNCTION ADD_STUDENT(...)
            ...
        END ADD_STUDENT;
    
        PROCEDURE ADD_PEOPLE(...)
            ...
            some_var := ADD_STUDENT();
        END ADD_PEOPLE;
    END SCHOOL;
    /
    

    对于选项 2,您的代码如下所示:

    PACKAGE BODY SCHOOL AS
        -- forward declared function
        FUNCTION ADD_STUDENT(...);
    
        PROCEDURE ADD_PEOPLE(...)
            ...
            some_var := ADD_STUDENT();
        END ADD_PEOPLE;
    
        FUNCTION ADD_STUDENT(...)
            ...
        END ADD_STUDENT;
    END SCHOOL;
    /
    

    就个人而言,我更喜欢选项 1,因为这意味着包体中的东西更少,但如果您有两个相互引用的模块,则选项 2 可能是必要的。

    【讨论】:

    • 很好的答案,没有意识到包体是按顺序加载的。然后对此进行小扩展:您知道在包顶部最常调用的公共函数和过程是否会提高性能?
    • 我认为这不太可能;我相信编译器会将代码转换成更精简的东西,所以当你查看包体文本时看到的不一定是数据库代码看到的。
    【解决方案2】:

    你需要在body中引用它之前定义私有函数。

    只需定义函数,然后定义过程。

    不需要包声明 - 只需使用正文中的名称调用它,因为该名称已经在范围内。

    【讨论】:

    • 澄清一下;将其添加到包声明中会使其公开,从而使该用例无效。
    • @Thor - 不建议将其添加到包头。只是说在主体中 PRIVATE 函数需要在被引用之前定义。
    【解决方案3】:

    在包规范中,您将函数定义为 ADD_STUDENT 当你调用 ADD_STUDENTS();

    请删除“S”并重新编译。

    【讨论】:

    猜你喜欢
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    相关资源
    最近更新 更多