2009-05-29 2 views
4

Это моя первая попытка создания пакета, поэтому я должен упустить что-то действительно действительно очевидное (ничего, что я искал в Google, похоже, даже считает, что стоит упомянуть).Как выполнить частные процедуры в пакете Oracle?

Очевидно, что если у вас есть процедуры в корпусе вашего пакета, которые не включены в раздел спецификации, эти процедуры являются частными. Проблема у меня в том, что я не могу понять, как ссылки эти частные пакеты, как только я их создал. И SQL Developer отказывается дать мне какое-либо сообщение, более полезное, чем «выполнение, выполненное с предупреждением», что не помогает ...

В качестве примера, это то, что я пытался, что не работает (просто бросает вышеупомянутую ошибку компилятора):

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; 

Я также попытался называя его testPackage.privateProc, который не работал ни.

Что я делаю неправильно?

+0

Это было полезно. Я правильно звонил, но я не знал, что мне нужна «форвардная декларация». –

+0

@ end-user - объявление вперед необходимо только в том случае, если мы не объявляем частные процедуры до их вызова. Лично мне легче объявлять процедуры в правильном порядке, а не давать дополнительную подпись для поддержки. – APC

+0

Еще одно преимущество заключается в том, что вы получаете предложение кода для параметров, если вы заранее реализуете процедуру, а не просто объявляете ее. По крайней мере, это поведение в жабе. – 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, как будто он является частью языка. Выполнение выполняется для запуска DML или SQL внутри PL/SQL.

+0

BTW вам не нужны пустые скобки() –

+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 
Смежные вопросы