Процедура в спецификации пакета

У меня есть пакет с именем save_db_values ​​

У меня есть две процедуры с именем store_records, а другая - db_activities. db_activities будет вызываться из моего приложения, передав все значения в db_activities. Я буду называть store_records процедуру для вставки и удаления.

Нужно ли определять процедуру store_records в спецификации пакета? Когда я не определил store_records в спецификации, я получаю ошибку store_records not declared in this scope.

store_records процедура, которую я не хочу раскрывать, и поэтому я не добавлял в спецификацию. Как я могу решить эту проблему?

Ответ 1

Если вы не хотите, чтобы некоторые процедуры были общедоступными, вы можете не объявлять их в спецификации пакета. Объявите их только в корпусе упаковки. Причиной ошибки, с которой вы столкнулись, является порядок объявления процедур в корпусе пакета или отсутствие прямого объявления. Например:

 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

Это происходит потому, что мы вызываем 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

Использовать форвардную декларацию.

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

Ответ 2

Вы можете объявлять процедуры только в теле, но порядок, в котором они отображаются, имеет значение; процедура вызова должна быть определена после вызванной процедуры. Или вы используете форвардную декларацию, чтобы упростить ее:

package save_db_values is
   procedure db_activities;
end save_db_values;

package body save_db_values is
   procedure store records; -- forward declaration

   procedure db_activities is
   begin
     store_records;
   end;

   procedure store records is
   begin
      null;
   end;
end save_db_values;

Ответ 3

Это происходит из-за написания тела процедуры в корпусе пакета. если вы не объявляете какую-либо процедуру в спецификации пакета, тогда вы должны записать ее на первом месте.

он будет работать:)