web-dev-qa-db-fra.com

Procédure dans la spécification du paquet

J'ai un paquet nommé save_db_values ​​

J'ai deux procédures nommées store_records et une autre appelée db_activities . db_activities sera appelé à partir de mon application en transmettant toutes les valeurs dans db_activities j'appellerai store_records procedure pour faire insérer et supprimer.

Dois-je définir la procédure store_records dans la spécification du paquet? Lorsque je ne définis pas store_records dans la spécification, l'erreur store_records not declared in this scope. s'affiche

store_records procedure Je ne veux pas exposer et par conséquent je n'ai pas ajouté de spécification. Comment puis-je résoudre ce problème?

10
Jåcob

Si vous ne souhaitez pas que certaines procédures soient accessibles au public, vous ne pouvez pas les déclarer dans la spécification du package. Déclarez-les uniquement dans le corps du paquet. La cause de l'erreur que vous rencontrez est l'ordre de déclaration des procédures dans le corps du package ou l'absence de déclaration anticipée. Par exemple:

 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

Cela se produit car nous appelons Proc2 qui a été déclaré plus tard dans le paquet. Dans ce cas nos choix sont:

Déclarer pro2 avant la procédure qui l'appelle

 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

Utiliser la déclaration à terme.

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
28
Nick Krasnov

Vous pouvez déclarer des procédures uniquement dans le corps, mais l'ordre dans lequel elles apparaissent est pertinent; la procédure appelante doit être définie après la procédure appelée. Ou vous utilisez une déclaration forward pour faciliter les choses:

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;
4

Cela se produit à cause du corps de la procédure d'écriture dans le corps du paquet. Si vous ne déclarez aucune procédure dans la spécification du package, vous devez l'écrire en premier lieu.

ça va marcher :)