Ответ 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