Oracle包规格和正文

时间:2016-11-21 01:11:23

标签: oracle plsql

所以我知道如果你在包规范中定义了一些东西,它必须在体内实现。是否可以在正文中定义方法,而不是规范?

1 个答案:

答案 0 :(得分:12)

是的,可以在包体中定义过程或函数,但不能在包规范中定义。规范中的对象是公共的,仅在正文中的对象是该包的私有对象。

创建包规范和正文

create or replace package test_package is
    procedure public_procedure;
end;
/

create or replace package body test_package is
    procedure private_procedure is
    begin
        null;
    end;

    procedure public_procedure is
    begin
        private_procedure;
    end;
end;
/

如何调用软件包

--WORKS:
begin
    test_package.public_procedure;
end;
/

--FAILS WITH THIS ERROR:
--  ORA-06550: line 2, column 15:
--  PLS-00302: component 'PRIVATE_PROCEDURE' must be declared
--  ORA-06550: line 2, column 2:
begin
    test_package.private_procedure;
end;
/

为什么需要这样做?

在像Java这样的语言中,这个问题很可能因为过于明显而被关闭。但这是PL / SQL中一个可以理解的问题,因为大多数PL / SQL程序员都将所有内容公之于众。看一下普通的PL / SQL程序,对自己说是合理的:"必须有充分的理由。"

没有。

私人应该是默认的。只有在需要与其他对象和程序员共享时才公开。或者,如果您需要在会话期间保留某些内容。

使用私有过程和函数隐藏尽可能多的详细信息。这使包更简单。它还为其他程序和程序员提供了更少的滥用程序包的方法。