gpt4 book ai didi

oracle - 在包体内调用私有(private)函数

转载 作者:行者123 更新时间:2023-12-04 16:51:04 24 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

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

  • 在调用它的任何过程/函数之前声明 ADD_STUDENT 函数。
  • 使用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 可能是必要的。

    关于oracle - 在包体内调用私有(private)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42722228/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com