PL / SQL Package Table - PullRequest
       9

PL / SQL Package Table

3 голосов
/ 25 августа 2009

Мне нужно поддерживать состояние в приложении PL / SQL. Во время сеанса нужно держать маленький столик.

Насколько я понимаю, это достигается с помощью переменной пакета, но я не знаю, как создать таблицу как переменную пакета.

Кто-нибудь объяснит, как это сделать или альтернативы?

Расширение задачи:
У меня есть WHERE IN условие, которое я должен заполнить в курсоре во время выполнения. Поскольку, насколько мне известно, я могу заполнить его только жестко заданным литералом или SELECT, мне нужно хранить все IN's, выбранные пользователем во время сеанса.

Ответы [ 4 ]

5 голосов
/ 26 августа 2009

Вы определяете переменную с типом таблицы в пакете. Если вы хотите, чтобы состояние было доступно извне пакета, оно определено в заголовке - если вы хотите, чтобы оно было приватным, вы определяете его в теле.

Если вы хотите инициализировать переменную при первом обращении к пакету, используйте блок инициализации внизу пакета.

Несколько советов:

  • Будьте осторожны с обработкой исключений при использовании блоков инициализации. Если возникает исключение, вы должны убедиться, что вы используете четкие сообщения об ошибках или сообщения журнала. Программист обслуживания, устраняющий проблему, может перейти непосредственно к вызываемому методу, чтобы устранить неполадки, а не исследовать неявный блок инициализации.
  • Oracle может перетасовывать пакеты в память и из нее при различных условиях, после чего переменная уровня пакета очищается. Убедитесь, что ваше состояние требуется только для этого сеанса, и что этот сеанс достаточно короток (т.е. не существует в течение нескольких дней). Если вам нужно более надежное постоянство, используйте физическую таблицу, а не переменную пакета.
  • Я часто нахожу проблему, которая начинается с того, что подходящая для таблицы уровня пакета со временем обычно усложняется. Возможно, лучше использовать реальную таблицу с точки зрения расширяемости. Это зависит от того, ищете ли вы краткосрочное решение для простой проблемы, или долгосрочное решение для миссионерско-ритуальной проблемы, или проблему, которая будет развиваться со временем.

Пример использования простой таблицы сопоставления «имя-значение»:

create or replace package bob as
  procedure do_stuff;
end bob;

create or replace package body bob as
  type my_table is table of varchar2(100) index by varchar2(100);
  my_variable my_table;

procedure do_stuff
begin
  --do stuff to my_variable
end;

begin
  --initialise my_variable
end bob;
2 голосов
/ 25 августа 2009

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

Из O'Reilly мы видим, что таблица, определенная в спецификации PACKAGE, считается глобальной, но таблица, объявленная в спецификации PACKAGE BODY, является переменной уровня пакета.

1 голос
/ 02 сентября 2009

GLOBAL TEMP TABLE, для которого установлено значение Commit Preserve Rows, настроенное как ключ / значение, может помочь в использовании значений во время сеанса, а не только в пакете. Затем запросы SQL могут быть построены вокруг предложений IN или EXIST с таблицей, используя доступ по ключу.

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