Какова цель этого пакета? - PullRequest
0 голосов
/ 06 февраля 2019

Я новичок в Oracle PL / SQL.Я нашел этот пакет, и он вызывается из триггера.Я просто не могу понять, что делает этот простой пакетный код.

Вызывается из триггера, как показано ниже:

IF INSERTING THEN
        i := STATE_PKG_OVERRIDE_CN.AffectedRows.COUNT+1;
        STATE_PKG_OVERRIDE_CN.AffectedRows(i).IDU := :new.IDU;
        STATE_PKG_OVERRIDE_CN.AffectedRows(i).cn := :new.cn;

Это пакет.Может кто-нибудь, пожалуйста, объясните основы того, что он делает?это возвращает значение?изменить значение?Что такое AfferedRows RIDARRAY или EMPTY?

create or replace PACKAGE        STATE_PKG_OVERRIDE_CN
AS
   TYPE rowid_cn IS RECORD
        (
        idu     dirxml.USR.IDU%TYPE,
        cn      dirxml.USR.CN%TYPE
        );

     TYPE RIDARRAY IS TABLE OF rowid_cn INDEX BY BINARY_INTEGER;

        AffectedRows RIDARRAY;
        EMPTY   RIDARRAY;
END;

Я нашел в Google EMPTY, но ничего не нашел, полагаю, он создает таблицу записей типа.Триггер передает значение cn или IDU. Я знаком с этими двумя значениями.Но что делает пакет?или возвращение?я в замешательстве.
Ура

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Он начинается с пакета, который

  • объявляет тип ROWID_CN как запись, содержащую два значения: IDU и CN
  • Синтаксис требуется для создания другоготип (RIDARRAY), основанный на ранее объявленных ROWID_CN
  • affectedrows и empty * массивах , тип которых RIDARRAY.По сути, вы можете представить их в виде таблицы с двумя столбцами: IDU и CN

Теперь триггер: фрагмент кода, который вы разместили, говорит, что эти 3 строки выполняются, когда кто-то вставляетстрока в таблице, на которой основан триггер.Например,

create or replace trigger trg_biu_emp 
  before insert or update on emp
  for each row
declare
  i number;
begin
  if inserting then ...

По-видимому, существует некоторый код, который выполняется при обновлении или даже удалении строк.

В любом случае:

  • i := ... строка подсчитывает количество элементов в массиве affectedrows (который объявлен в пакете) и добавляет 1 к этому числу.Например, если бы было 3 элементов, i было бы 4.
  • ...affectedrows(i).idu := :new.idu вводит новую строку в массив.Его порядковый номер i (4 в нашем примере).Когда вы вставляете строку в таблицу, триггер знает значение IDU столбца :new и помещает его в массив.Например, если вы использовали

    insert into emp (idu, cn) values (100, 'A')
    

    , то affectedrows(4).idu = 100, тогда как affectedrows(4).cn = 'A'

Это, вероятно, что-то похожее с массивом EMPTY.Google не может ничего вернуть полезно , это просто пользовательский массив.

0 голосов
/ 06 февраля 2019

Это сделанный на заказ пакет, принадлежащий вашей организации.(Вот почему Google не был полезен для вас.) Мы не можем точно сказать вам, что он делает или как его используют.Но мы можем догадаться.

Пакет не имеет процедур или функций, он просто определяет переменные массива определенного типа, которые могут использоваться другими программными модулями, такими как триггеры.Размещенный вами триггер присваивает значения массиву AffectedRows.Предположительно, этот триггер срабатывает ДЛЯ КАЖДОГО РЯДА.Вероятно, есть еще один триггер в той же таблице, который запускает ПОСЛЕ ЗАЯВЛЕНИЯ, который читает этот массив и выполняет некоторую обработку, а затем назначает AffectedRows := EMPTY для сброса массива.

Цель этой инфраструктуры - передать состояние через действия триггера.Распространенной причиной для этого является обход исключений из таблицы мутаций.Они рискованны, потому что государство не может быть гарантировано;например, если вставка завершится неудачно до того, как сработает триггер AFTER STATEMENT, массив AffectedRows не будет повторно инициализирован, поэтому последующая обработка будет некорректной (или не удастся выполнить).

Поскольку 11g Oracle предоставляет составные триггеры, которые удаляютнужен для такого рода упаковки. Узнать больше .

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

select * 
from user_dependencies
where referenced_type = 'PACKAGE'
and referenced_name = 'STATE_PKG_OVERRIDE_CN'
...