Oracle - Использование пакета

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

Если в пакете только одна процедура, кажется, что в package. Я до сих пор не понимаю, какие процедуры или функции мне нужно сгруппировать в пакет. Не могли бы вы сказать мне, какие процедуры я должен сгруппировать в пакет?

Sambath Prum 18.11.2008 05:06

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

bart 18.11.2008 05:33

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

ObiWanKenobi 14.12.2010 12:03

Еще одна причина использования пакетов заключается в том, что Oracle не сохраняет комментарии «заголовков», которые вы пишете до начала или после окончания автономной функции или хранимой процедуры (в отличие от SQL Server, который сохраняет эту информацию).

Shane Wealti 20.09.2011 22:49

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

GolezTrol 23.11.2012 13:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
2 180
4

Ответы 4

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

Чтобы продолжить, у вас может быть автономный, например

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.

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

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

Другие вопросы по теме