2012-10-03 29 views
10

tengo un paquete llamado save_db_values ​​Procedimiento de especificación del paquete

Tengo dos procedimientos mencionados store_records y otra que se llama db_activities. db_activities serán llamados de mi solicitud al pasar todos los valores en db_activities te llamaré store_records procedimiento para hacer inserción y el borrado.

¿Necesito definir store_records procedimiento en la especificación del paquete? Cuando no me defino store_records en la especificación estoy error al obtener store_records not declared in this scope.

store_records procedimiento no quiero exponer y por lo tanto no añadí en la especificación. ¿Cómo puedo resolver este problema?

Respuesta

26

Si no desea que algunos procedimientos estén a disposición del público que no puede declarar en la especificación del paquete. Declararlos solo en el cuerpo del paquete. La causa del error al que se enfrenta es el orden de declaración de los procedimientos en el cuerpo del paquete o la falta de declaración directa. Por ejemplo:

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 

Esto sucede porque estamos llamando Proc2 que declaró más tarde en el paquete. En este caso, nuestras opciones son:

Declarar pro2 antes de que el procedimiento que llama

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 

Uso declaración adelantada.

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

Muchas gracias por señalar el error – user75ponic

2

Puede declarar procedimientos solo en el cuerpo, pero el orden en el que aparecen es relevante; el procedimiento de llamada debe definirse después del procedimiento llamado. O bien utilizar una declaración hacia adelante para hacer más fácil:

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

Muchas gracias por señalar el error. – user75ponic

0

Está sucediendo debido a la escritura del cuerpo del procedimiento en el cuerpo del paquete. si no está declarando ningún procedimiento en la especificación del paquete, entonces debe escribirlo en primer lugar.

funcionará :)

Cuestiones relacionadas