Я прочитал несколько книг программирования PL SQL, и они рекомендуют мне группировать процедуры, функции, курсоры и т. Д. В пакете. Пакеты обеспечивают модульность и скрытие информации, что является дизайном OO. Тем не менее, я просто знаком с отдельными процедурами. Кто-нибудь любезно предоставит несколько примеров кода и как вызвать пакет от клиента? В настоящее время я использую ODP.NET в качестве доступа к данным в клиентском приложении. Спасибо.Oracle - Использование пакета
ответ
Если вы знакомы с вызовами отдельных процедур, процедуры вызова в пакетах не очень разные. Просто префикс имени процедуры с именем пакета следующим образом: имя_пакета.процедура_имя.
Чтобы следить, вы можете иметь автономные как
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 („бар“);»
Для одной процедуры использование пакета может не придавать большей ясности. Но если вы имеете дело с множеством функций и процедур, это намного чище.
Вы вводите код для процедур, функций и т. Д. В тело пакета вместе с объявлениями для частных переменных. Вы помещаете объявления этих процедур и функций, а также общедоступные переменные в пакет. Только последние доступны извне пакета, и для этого вам нужно префикс их имен с именем пакета и точкой.
Вы также можете определить типы данных для этого пакета: если публичные процедуры используют их в качестве входных или выходных данных, они должны быть обнародованы; если нет, то вы можете выбирать.
Пример кода, из памяти и не проверял, так что может быть ошибки в нем:
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.
По-прежнему существует хорошая практика использования пакетов вместо простого объявления функций с глобальной областью.
Если у вас есть пакеты, он может обеспечить расширяемость, если вам захочется позже добавить функции с одним и тем же контекстом, и это может сделать ваши процедуры более понятными, поскольку в нем указано, из какой библиотеки (пакета) является функция, называемая из.
Если в пакете есть только одна процедура, вам не нужно иметь пакет. Я все еще не понимаю, какие типы процедур или функций я должен группировать в пакет. Не могли бы вы рассказать мне, какие процедуры я должен группировать в пакет? – 2008-11-18 02:06:20