Oracle - Использование пакета - PullRequest
1 голос
/ 17 ноября 2008

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

Ответы [ 4 ]

3 голосов
/ 17 ноября 2008

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

2 голосов
/ 18 ноября 2008

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

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

Пример кода из памяти и не проверен, поэтому в нем могут быть ошибки:

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 и т. Д. Для использования этих функций и переменных. Вы не можете получить доступ к внутренним функциям извне пакета. Их нужно объявлять в начале пакета только в том случае, если они вызываются выше, чем их реализация.

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

НТН.

1 голос
/ 18 ноября 2008

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

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

1 голос
/ 17 ноября 2008

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

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');"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...