2012-10-03 13 views
10

mam pakiet nazwie save_db_values ​​Procedura specyfikacji pakietu

że dwie procedury nazwie store_records i drugi, o nazwie db_activities. db_activities będzie wywoływana z mojej aplikacji przekazując wszystkie wartości w db_activities będę nazywając store_records procedurę, aby wkładać i usuwać.

Czy muszę zdefiniować procedurę store_records w specyfikacji pakietu? Kiedy nie określają store_records w specyfikacji jestem coraz error store_records not declared in this scope.

store_records procedura Nie chcę narażać, a więc ja nie dodawać w opisie. Jak mogę rozwiązać ten problem?

Odpowiedz

26

Jeśli nie chcesz pewne procedury powinny być dostępne publicznie, że nie może zadeklarować je w opisie pakietu. Deklaruj je tylko w treści pakietu. Przyczyną błędu, z którym się spotkasz, jest kolejność deklaracji procedur w pakiecie lub brak zgłoszenia do przodu. Na przykład:

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 

Dzieje się tak dlatego wzywamy Proc2 który deklarowaną później w opakowaniu. W tym przypadku nasze wybory są:

Declare pro2 przed zabiegiem, który wzywa go

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 

Zastosowanie naprzód deklaracja.

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 
+0

Wielkie dzięki za wskazanie błędu – user75ponic

2

Możesz zadeklarować procedury tylko w treści, ale kolejność, w jakiej się pojawiają, jest istotna; procedurę wywołującą należy zdefiniować po wywołanej procedurze. Lub użyć do przodu deklarację, aby ułatwić:

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; 
+0

Wielkie dzięki za wskazanie błędu. – user75ponic

0

Dzieje się tak, ponieważ w korpusie paczki znajduje się treść instrukcji. jeśli nie deklarujesz żadnej procedury w specyfikacji pakietu, powinieneś to zapisać na pierwszym miejscu.

to zadziała :)