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?
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
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;
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 :)