2008-11-17 4 views
1

Я прочитал несколько книг программирования PL SQL, и они рекомендуют мне группировать процедуры, функции, курсоры и т. Д. В пакете. Пакеты обеспечивают модульность и скрытие информации, что является дизайном OO. Тем не менее, я просто знаком с отдельными процедурами. Кто-нибудь любезно предоставит несколько примеров кода и как вызвать пакет от клиента? В настоящее время я использую ODP.NET в качестве доступа к данным в клиентском приложении. Спасибо.Oracle - Использование пакета

+0

Если в пакете есть только одна процедура, вам не нужно иметь пакет. Я все еще не понимаю, какие типы процедур или функций я должен группировать в пакет. Не могли бы вы рассказать мне, какие процедуры я должен группировать в пакет? – 2008-11-18 02:06:20

ответ

3

Если вы знакомы с вызовами отдельных процедур, процедуры вызова в пакетах не очень разные. Просто префикс имени процедуры с именем пакета следующим образом: имя_пакета.процедура_имя.

1

Чтобы следить, вы можете иметь автономные как

create or replace procedure foo (i_something in varchar2) as 
begin 
    -- do some stuff; 
end foo; 

, которую вы называете с "Foo ('бар');"

Это станет пакет и тело пакета, как

create or replace package my_package as 
    procedure foo (i_something in varchar2); 
end; 

create or replace package body my_package as 
    procedure foo (i_something in varchar2); 
    begin 
     -- do some stuff; 
    end foo; 
end my_package; 

, которую вы называете с «my_package.foo („бар“);»

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

2

Вы вводите код для процедур, функций и т. Д. В тело пакета вместе с объявлениями для частных переменных. Вы помещаете объявления этих процедур и функций, а также общедоступные переменные в пакет. Только последние доступны извне пакета, и для этого вам нужно префикс их имен с именем пакета и точкой.

Вы также можете определить типы данных для этого пакета: если публичные процедуры используют их в качестве входных или выходных данных, они должны быть обнародованы; если нет, то вы можете выбирать.

Пример кода, из памяти и не проверял, так что может быть ошибки в нем:

create or replace package foo as 
    a number;   
    function test1(s1 in varchar2) return varchar2; 
    procedure test2(i1 in integer); 
end; 
/

create or replace package body foo as 
    b number; -- internal only 
    function internalfunc(s in varchar2) return varchar2; 

    function test1(s1 in varchar2) return varchar2 is 
    s varchar2(32000); 
    -- variables ... 
    begin 
    -- code ... 
    return internalfunc(s); 
    end; 

    procedure test2(i1 in integer) is 
    -- variables ... 
    begin 
    -- code ...  
    end; 

    function internalfunc(s in varchar2) return varchar2 is 
    begin 
    return INITCAP(LOWER(s));  
    end; 

end; 
/

Использование foo.a, foo.test1 и т.д., чтобы использовать эти функции и переменные. Вы не можете получить доступ к внутренним функциям извне пакета. Их нужно объявлять только в начале пакета, если их вызывают выше, чем их реализация.

Пакеты имеют дополнительное преимущество перед обычными функциями и процедурами: вы можете перегружать их имена, иметь несколько разных процедур с тем же именем, но с разными типами параметров в одном пакете, и будет вызываться соответствующая функция в зависимости от того, какой параметр типы, которые вы используете. В отличие от этого, имя автономной функции или процедуры должно быть уникальным.

HTH.

1

По-прежнему существует хорошая практика использования пакетов вместо простого объявления функций с глобальной областью.

Если у вас есть пакеты, он может обеспечить расширяемость, если вам захочется позже добавить функции с одним и тем же контекстом, и это может сделать ваши процедуры более понятными, поскольку в нем указано, из какой библиотеки (пакета) является функция, называемая из.

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