2009-05-29 8 views
4

これはパッケージを作成する私の最初の試みなので、私は本当に明白な何かを見逃しているに違いありません。Oracleパッケージでプライベート・プロシージャを実行するにはどうすればよいですか?

明らかに、パッケージ本体に仕様セクションに含まれていないプロシージャがある場合、それらのプロシージャはプライベートです。私が持っている問題は、一度私がそれらを作ったら参照それらのプライベートパッケージを理解するように思えないということです。そして、SQL Developerは、「警告が表示されて実行が完了しました」というメッセージが表示されないようにすることを拒否しています...

例として、これは動作しません私もどちらかの仕事をしていないtestPackage.privateProc、としてそれを参照しようとした

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; 

:前述のコンパイラエラー)をスローします。

私は間違っていますか?

+0

これは役に立ちました。私は正しく電話していましたが、私は "前方宣言"が必要であるかどうか分かりませんでした。 –

+0

@ end-user - 前方宣言は、プライベートプロシージャが呼び出される前に宣言しない場合にのみ必要です。個人的には、維持するための追加の署名を与えるのではなく、正しい順序で手続きを宣言する方が簡単です。 – APC

+0

もう一つの利点は、宣言するだけでなく、あらかじめプロシージャを実装しておけば、パラメータのコード提案が得られることです。 少なくともToadの動作です。 – ch1ll

答えて

15

私はあなたがこれを行うべきだと思う。それは言語の一部であるかのように

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; 

ちょうどprivateProcを呼び出します。 Executeは、PL/SQL内でDMLまたはSQLを実行するためのものです。

+0

あなたは空の括弧()を必要としません。 –

+0

@jeffrey Kemp - 確かに - 私の怠惰なコピー。 – 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 
関連する問題