Я прочитал несколько книг по программированию PL SQL, и они рекомендуют мне сгруппировать процедуры, функции, курсоры и т. д. В пакет. Пакеты обеспечивают модульность и скрытие информации, что является конструкцией объектно-ориентированного проектирования. Однако я просто знаком с отдельными процедурами. Кто-нибудь любезно предоставит несколько примеров в коде и как вызвать пакет от клиента? В настоящее время я использую ODP.NET в качестве доступа к данным в клиентском приложении. Спасибо.
Просто: процедуры, которые «принадлежат друг другу». Вещи, которые на любом другом языке программирования вы бы поместили в тот же исходный файл.
Всегда используйте пакеты; даже если у вас есть только одна процедура / функция для начала, ваш код со временем будет расти, и вы можете добавлять в свой пакет больше, не изменяя все ваши вызовы автономных процедур.
Еще одна причина использования пакетов заключается в том, что Oracle не сохраняет комментарии «заголовков», которые вы пишете до начала или после окончания автономной функции или хранимой процедуры (в отличие от SQL Server, который сохраняет эту информацию).
@ShaneWealti Вряд ли это должно быть причиной. Вы также можете добавить комментарии внутри функции. Я не говорю, что вы не должны использовать пакеты, но не по этой причине.





Если вы знакомы с вызовом автономных процедур, вызов процедур в пакетах не сильно отличается. Просто добавьте перед именем процедуры имя пакета, например, имя_пакета.имя_процедуры.
Чтобы продолжить, у вас может быть автономный, например
create or replace procedure foo (i_something in varchar2) as
begin
-- do some stuff;
end foo;
который вы вызываете с помощью "foo ('bar');"
Это станет пакетом и телом пакета как
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 ('bar');"
Для одной процедуры использование пакета может не добавить большой ясности. Но если вы имеете дело с большим количеством функций и процедур, это намного чище.
Вы помещаете код для процедур, функций и т. д. В тело пакета вместе с объявлениями для частных переменных. Вы помещаете в пакет объявления этих процедур и функций, а также общедоступные переменные. Только последние доступны извне пакета, и для этого вам нужно поставить перед их именами имя пакета и точку.
Вы также можете определить типы структур данных для этого пакета: если общедоступные процедуры используют их как ввод или вывод, то они должны быть общедоступными; в противном случае вы можете выбирать.
Пример кода, из памяти и не проверенный, поэтому в нем могут быть ошибки:
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.
По-прежнему существует хорошая практика использования пакетов вместо простого объявления функций с глобальной областью видимости.
Если у вас есть пакеты, он может обеспечить расширяемость, если вы позже захотите добавить функции с тем же контекстом, и может сделать ваши процедуры более разборчивыми, поскольку в нем указано, из какой библиотеки (пакета) вызывается функция.
Если в пакете только одна процедура, кажется, что в package. Я до сих пор не понимаю, какие процедуры или функции мне нужно сгруппировать в пакет. Не могли бы вы сказать мне, какие процедуры я должен сгруппировать в пакет?