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

  • 本文关键字:包体 包规范 Oracle oracle plsql
  • 更新时间 :
  • 英文 :


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

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

正如你所说,没有规范的包体是没有用的:

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。中华人民共和国。噗嗤,...

我认为这个问题的前提具有误导性,可能是错误的。面试官可能想让您知道变量和过程之间的区别,这些变量和过程包规范中定义,在包正文内部定义、调用或使用。包主体可用于定义局部过程和变量,而无需在包规范中定义它们。

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.

最新更新