在Oracle中没有包规范的包主体有什么用?

时间:2018-12-28 03:56:51

标签: oracle plsql

我在一次采访中遇到了这个问题。

没有规范,包主体无效,但他们要求优势。您能解释一下在Oracle中没有包规范的包主体有什么用吗?

2 个答案:

答案 0 :(得分:2)

我认为问题的前提是误导性的,并且可能是错误的。访调员也许想让您知道在包装说明中 已定义的变量和过程之间的区别并在包主体内部内部定义和调用或使用。包主体可用于定义本地过程和变量,而无需在包规范内部进行定义。

create or replace package pkg_spec_test
AS
procedure p1;
v_1 NUMBER := 10;
END;
/

create or replace package body pkg_spec_test
AS
procedure p1 AS
 BEGIN
  dbms_output.put_line('HELLO. I can be called externally');
END p1;

procedure p2 AS
BEGIN
  dbms_output.put_line('I''m private to package body.');

 END;
 procedure main as
 begin
   p2;  --called within the body;
  END main; 
 END pkg_spec_test;
/


begin
pkg_spec_test.p1;
end;
/

很好。

HELLO. I can be called externally
PL/SQL procedure successfully completed.

begin
pkg_spec_test.p2;
end;
/

原因错误

Error starting at line : 30 in command -
begin
pkg_spec_test.p2;
end;
Error report -
ORA-06550: line 2, column 15:
PLS-00302: component 'P2' must be declared

下面的一个很好用

begin
pkg_spec_test.main;
end;
/


I'm private to package body.


PL/SQL procedure successfully completed.

答案 1 :(得分:1)

正如您所说的,没有其规范的包主体是无用的

SQL> create package body pkg_test as
  2    procedure p_test;
  3  end;
  4  /

Warning: Package Body created with compilation errors.

SQL> show err
Errors for PACKAGE BODY PKG_TEST:

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0      PL/SQL: Compilation unit analysis terminated
1/14     PLS-00201: identifier 'PKG_TEST' must be declared
1/14     PLS-00304: cannot compile body of 'PKG_TEST' without its
         specification

SQL> exec pkg_test.p_test;
BEGIN pkg_test.p_test; END;

      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'PKG_TEST.P_TEST' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored


SQL>

因此,我认为拥有包体没有任何优势。

也许它可以用作代码墓地-您知道,您编写了一些过程和函数,但您不再需要它们-创建一个包主体并将所有代码放入那里。您将无法使用它们,但如有必要,可以进行查看。就像您自己的代码存储库存储在数据库中一样,而不是分散在硬盘上的不同目录和不同类型的文件(.SQL,.PRC,.PKG等)中。