Триггер Oracle: объявить глобальную переменную - PullRequest
4 голосов
/ 17 февраля 2011

У меня есть таблица, для которой я написал триггер:

CREATE OR REPLACE TRIGGER EMPLOYEE_TRG 
AFTER INSERT OR DELETE OR UPDATE ON EMPLOYEE 

FOR EACH ROW

DECLARE
  TYPE arr IS TABLE OF VARCHAR2(32) INDEX BY PLS_INTEGER;
  v_array arr;

BEGIN
  IF UPDATING THEN
    DBMS_OUTPUT.PUT_LINE('NEW DATA: ' || :new.NAME || ', OLD DATA: ' || :old.NAME);
    DBMS_OUTPUT.PUT_LINE('ID: ' || :new.P_ID);
    v_array(:new.P_ID) := :new.NAME;
    DBMS_OUTPUT.PUT_LINE('COUNTER: ' || v_array.COUNT); -- DISPLAY COUNTER: 1
  END IF; 
END;

когда я обновляю EMPLOYEE триггер таблицы работает нормально. Но массив v_array не хранит данные? кто-нибудь может помочь?

Ответы [ 2 ]

7 голосов
/ 17 февраля 2011

объявите v_array в пакете, если вы хотите сделать его глобальным (для сеанса - каждый сеанс будет иметь свою собственную копию переменной).

CREATE OR REPLACE PACKAGE my_global_pkg IS

   TYPE arr IS TABLE OF VARCHAR2(32) INDEX BY PLS_INTEGER;
   g_array arr;

END my_global_pkg;

CREATE OR REPLACE TRIGGER EMPLOYEE_TRG 
   AFTER INSERT OR DELETE OR UPDATE ON EMPLOYEE 
   FOR EACH ROW
BEGIN
   IF UPDATING THEN
      DBMS_OUTPUT.PUT_LINE('NEW DATA: ' ||:new.NAME ||', OLD DATA: '||:old.NAME);
      DBMS_OUTPUT.PUT_LINE('ID: ' || :new.P_ID);
      my_global_pkg.g_array(:new.P_ID) := :new.NAME;
      DBMS_OUTPUT.PUT_LINE('COUNTER: ' || my_global_pkg.g_array.COUNT);
   END IF;
END;

Для многосессионных глобальных переменных используйте реляционные таблицы (с соответствующей многопользовательской блокировкой).

0 голосов
/ 17 февраля 2011

Откуда вы знаете, что данные не сохраняются?Вы объявляете массив внутри триггера.Так что это не глобально, а локально.Каждый раз, когда запускается ваш триггер, вы получаете новый массив.Вы добавляете один элемент, отображаете его количество и снова отпускаете.Подсчет показывает 1, так что это работает.

Ваш код работает нормально, хотя и бесполезно.:) Что ты имеешь в виду? Нет, подождите, счет принадлежит другому массиву.Вы помещаете элемент в локальный массив и отображаете счетчик другого (глобального?) Массива.Не удивительно, что это не сработает.Я думаю, что вы изменяете неправильный массив.

...