2012-10-03 14 views
10

ho un pacchetto chiamato save_db_values ​​Procedura in specifica del pacchetto

Ho due procedure denominate store_records e un altro chiamato db_activities. db_activities saranno chiamati dalla mia applicazione passando tutti i valori in db_activities Sarò chiamando store_records procedura di fare inserire ed eliminare.

Devo definire la procedura store_records nelle specifiche del pacchetto? Quando non ho definisco store_records in specifiche sto errore ottenendo store_records not declared in this scope.

store_records procedura che non voglio esporre e, quindi, non ho aggiunto nella specifica. Come posso risolvere questo problema?

risposta

26

Se non si desidera alcune procedure siano disponibili al pubblico non si può dichiararli nella specifica pacchetto. Dichiarali solo nel corpo del pacchetto. La causa dell'errore che si sta affrontando è l'ordine di dichiarazione delle procedure nel corpo del pacchetto o la mancanza di dichiarazione anticipata. Per esempio:

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 

Questo accade perché stiamo chiamando Proc2 che ha dichiarato in seguito nel pacchetto. In questo caso, le nostre scelte sono:

Declare pro2 prima che la procedura che lo chiama

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 

Usa dichiarazione anticipata.

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

Grazie mille per aver segnalato l'errore – user75ponic

2

È possibile dichiarare le procedure solo nel corpo, ma l'ordine in cui appaiono è pertinente; la procedura chiamante deve essere definita dopo la procedura chiamata. O si utilizza una dichiarazione anticipata per rendere più facile:

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

Grazie mille per aver segnalato l'errore. – user75ponic

0

Sta accadendo a causa del corpo della procedura di scrittura nel corpo del pacchetto. se non stai dichiarando alcuna procedura nella specifica del pacchetto, dovresti scriverlo al primo posto.

funzionerà :)

Problemi correlati