Oracle 软件包规范和正文

标签 oracle plsql

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

最佳答案

是的,可以在包体中定义过程或函数,但不能在包规范中定义。规范中的对象是公共(public)的,只有主体中的对象是该包私有(private)的。

创建包规范和正文

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 程序,有理由对自己说:“这一定有充分的理由。”

没有。

私有(private)应该是默认值。仅当您需要与其他对象和程序员共享时才将其公开。或者,如果您需要在 session 期间保留某些内容。

使用私有(private)过程和函数来隐藏尽可能多的细节。这使得包更简单。它还为其他程序和程序员提供了更少的滥用你的包的方法。

关于Oracle 软件包规范和正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40711425/

相关文章:

java - ORA-01465 : invalid hex number or data mismatch error using hibernate jpa and oracle in coalesce

java - oracle 更改通知问题

java - Oracle 子查询不返回任何记录

sql - Oracle中如何将select语句的结果存储到临时表中?

oracle - 这是 PL/SQL 错误吗?

sql - Entity Framework 代码优先 : querying a view with no primary key

c# - 在 Oracle DB 中获取正确的自动递增 ID

java - 在过程内动态添加的表上创建触发器

oracle - 通过 Hibernate 获取 PL/SQL 函数的返回值

oracle - PL/SQL 过程参数中的类通用行为