2016-11-21 3 views

ответ

9

Да, процедура или функция могут быть определены в корпусе упаковки, но не в спецификации пакета. Объекты в спецификации являются общедоступными, объекты только в теле являются частными для этого пакета.

Создание спецификации и тела пакета

create or replace package test_package is 
    procedure public_procedure; 
end; 
/

create or replace package body test_package is 
    procedure private_procedure is 
    begin 
     null; 
    end; 

    procedure public_procedure is 
    begin 
     private_procedure; 
    end; 
end; 
/

Как звонить пакет

--WORKS: 
begin 
    test_package.public_procedure; 
end; 
/

--FAILS WITH THIS ERROR: 
-- ORA-06550: line 2, column 15: 
-- PLS-00302: component 'PRIVATE_PROCEDURE' must be declared 
-- ORA-06550: line 2, column 2: 
begin 
    test_package.private_procedure; 
end; 
/

Почему вы должны сделать это?

На языке, подобном Java, этот вопрос, вероятно, будет закрыт для того, чтобы быть слишком очевидным. Но это понятный вопрос в PL/SQL, поскольку большинство программистов PL/SQL делают все общедоступным. Рассматривая среднюю программу PL/SQL, разумно сказать себе: «для этого должна быть веская причина».

Нет.

Частное лицо должно быть по умолчанию. Сделайте только что-нибудь общедоступное, если вам нужно нужно, чтобы поделиться им с другими объектами и программистами. Или если вам нужно, чтобы что-то сохранялось во время сеанса.

Используйте частные процедуры и функции, чтобы скрыть как можно больше деталей. Это упрощает пакеты. Это также дает другим программам и программистам меньше способов злоупотреблять вашим пакетом.

+0

Благодарим вас за подробное описание. Ваш ответ прошел выше и выше! –

Смежные вопросы