2009-05-29 8 views
4

Ceci est ma première tentative de création d'un paquet, donc il me manque quelque chose de vraiment évident (rien de ce que j'ai cherché sur Google ne semble même le mentionner).Comment exécuter des procédures privées dans un package Oracle?

Évidemment, si vous avez des procédures dans le corps de votre paquet qui ne sont pas incluses dans la section des spécifications, alors ces procédures sont privées. Le problème que j'ai, c'est que je ne peux pas comprendre comment référence ces paquets privés une fois que je les ai fait. Et SQL Developer refuse de me donner tout message plus utile que « l'exécution terminée avec avertissement », ce qui ne permet pas ...

À titre d'exemple, voici ce que j'ai essayé cela ne fonctionne pas (seulement jette l'erreur susmentionnée du compilateur):

CREATE OR REPLACE PACKAGE BODY testPackage AS 

PROCEDURE privateProc; --Forward declaration 

PROCEDURE publicProc IS 
BEGIN 
    EXECUTE privateProc(); 
END; 

PROCEDURE privateProc IS 
BEGIN 
    DBMS_OUTPUT.PUT_LINE('test'); 
END; 

END testPackage; 

J'ai aussi essayé comme référence à testPackage.privateProc, qui n'a pas fonctionné non plus.

Qu'est-ce que je fais mal?

+0

Ceci a été utile. Je faisais l'appel correctement, mais je ne savais pas que j'avais besoin d'une "déclaration avant". –

+0

@ end-user - La déclaration forward n'est nécessaire que si nous ne déclarons pas les procédures privées avant leur appel. Personnellement, je trouve plus facile de déclarer les procédures dans le bon ordre plutôt que de me donner une signature supplémentaire à maintenir. – APC

+0

Un autre avantage est que vous obtenez la suggestion de code pour les paramètres si vous implémentez la procédure au préalable, au lieu de simplement la déclarer. Au moins, c'est le comportement de Toad. – ch1ll

Répondre

15

Je pense que vous devriez faire ceci:

CREATE OR REPLACE PACKAGE BODY testPackage AS 
PROCEDURE privateProc; --Forward declaration 

PROCEDURE publicProc IS 
    BEGIN  
    privateProc(); 
END; 

PROCEDURE privateProc IS 
BEGIN  
    DBMS_OUTPUT.PUT_LINE('test'); 
END; 
END testPackage; 

Il suffit d'appeler privateProc comme si elle fait partie de la langue. Execute est pour exécuter DML ou SQL à l'intérieur de votre PL/SQL.

+0

BTW vous n'avez pas besoin des parenthèses vides() –

+0

@jeffrey Kemp - en effet - ma copie paresseuse. – Martlark

0
CREATE OR REPLACE PACKAGE BODY testPackage AS 

PROCEDURE publicProc; --Forward declaration 

PROCEDURE publicProc IS 
BEGIN 
privateProc; --exec privateProc; 
END; 

PROCEDURE privateProc IS 
BEGIN 
DBMS_OUTPUT.PUT_LINE('test'); 
END; 

END testPackage; 

//call testPackage.publicProc 
Questions connexes