包规范中的程序

Jåc*_*cob 10 oracle plsql scope stored-procedures package

我有一个名为save_db_values的包

我有两个名为store_records的过程,另一个名为db_activities. db_activities将通过传递db_activities中的所有值从我的应用程序调用我将调用store_records过程来执行insert和delete.

我是否需要在包规范中定义store_records过程?当我没有在规范中定义store_records时,我收到错误store_records not declared in this scope.

store_records程序我不想暴露,因此我没有添加规范.我该如何解决这个问题?

Nic*_*nov 31

如果您不希望某些过程公开,您可以不在包规范中声明它们.仅在包体中声明它们.您遇到的错误的原因是包体中的过程的声明顺序或缺少前向声明.例如:

 create or replace package Test_pkg as
  2    procedure Proc1;
  3  end;
  4  /

Package created

create or replace package body Test_pkg as
  2  
  3    procedure proc1 is
  4    begin
  5      proc2;
  6    end;
  7  
  8    procedure Proc2 is
  9    begin
 10      dbms_output.put_line('proc2 is being executed');
 11    end;
 12  
 13  end;
 14  /

Warning: Package body created with compilation errors
Error: PLS-00313: 'PROC2' not declared in this scope
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为我们正在调用Proc2稍后在包中声明的内容.在这种情况下,我们的选择是:

pro2在调用它的过程之前声明

 create or replace package body Test_pkg as
  2  
  3  
  4    procedure Proc2 is
  5    begin
  6      dbms_output.put_line('proc2 is being executed');
  7    end;
  8  
  9    procedure proc1 is
 10    begin
 11      proc2;
 12    end;
 13  
 14  end;
 15  /

Package body created
Run Code Online (Sandbox Code Playgroud)

使用前向声明.

create or replace package body Test_pkg as
  2  
  3    procedure Proc2;
  4  
  5    procedure proc1 is
  6    begin
  7      proc2;
  8    end;
  9  
 10    procedure Proc2 is
 11    begin
 12      dbms_output.put_line('proc2 is being executed');
 13    end;
 14  
 15  
 16  end;
 17  /

Package body created

SQL> exec test_pkg.Proc1;

proc2 is being executed

PL/SQL procedure successfully completed
Run Code Online (Sandbox Code Playgroud)