Oracle APEX Database Trigger - проблемы со ссылками на столбцы базы данных - PullRequest
1 голос
/ 26 января 2012

У меня есть список значений, разделенных двоеточиями, которые хранятся в столбце varchar2, ORDER_PARTS_LIST, в моей базе данных Oracle.

(Я понимаю, что хранение данных в списке, подобном этому, может быть не лучшей практикой, но сейчас просто игнорируйте этот факт.)

Вот соответствующие столбцы таблицы:

 ORDER_TABLE(
    ORDER_NUMBER number,
    ORDER_PARTS_LIST varchar(4000))

 PARTS_TABLE(
    PART_NUMBER varchar(20),
    ASSIGNED_ORDER_NUMBER number)

У меня есть условный триггер:

 create or replace trigger "ORDER_PARTS_T1"
 BEFORE
 insert or update or delete on "ORDER_TABLE"
 for each row
 begin
   if :new.ORDER_PARTS_LIST LIKE '%'+PART_NUMBER+'%' then
     update PARTS_TABLE set ASSIGNED_ORDER_NUMBER = :ORDER_NUMBER;   
   end if;

 end;

Когда я запускаю этот триггер, я получаю следующую ошибку:

 PLS-00201: identifier 'PART_NUMBER' must be declared

Предполагается, что триггер проверяет, какие PART_NUMBERs в PARTS_TABLE включены в ORDER_PARTS_LIST, в ORDER_TABLE, а затем вставляет ORDER_NUMBER для соответствующей строки в ORDER_TABLE, в столбец ASSIGNED_ORDER_NUMBER, PARTS_TABLE.

В конце концов, все ЧАСТИ в ЗАКАЗЕ должны быть помечены НОМЕРОМ этого ЗАКАЗА.

Имеет ли это ЛЮБОЙ смысл ???

Я не уверен точно, как правильно определить переменные в этом триггере, чтобы он работал, и, честно говоря, у меня есть несколько сомнений относительно того, будет ли триггер делать то, что, я думаю, должен, даже если бы он работал ЛЮБЫЕ предложения или помощь в получении триггера, функционирующего так, как я определил, это было бы здорово. Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 27 января 2012

Вы можете выполнить сопоставление строк для проверки каждой строки:

create or replace trigger "ORDER_PARTS_T1"
BEFORE
insert or update on "ORDER_TABLE"
for each row
begin
  update PARTS_TABLE p
  set p.ASSIGNED_ORDER_NUMBER = :new.ORDER_NUMBER
  where instr(':' || :new.ORDER_PARTS_LIST || ':'
             ,':' || p.PART_NUMBER || ':') > 0;
end;

Так, например, если ORDER_PARTS_LIST равен '123:456:789', INSTR найдет совпадения для идентификаторов 123, 456 и 789, но не для 124, 45 или 8, например.

При удалении деталей из заказа вам потребуется другой триггер, чтобы NULL соответствующие поля в PARTS_TABLE:

create or replace trigger "ORDER_PARTS_T1"
BEFORE
update on "ORDER_TABLE"
for each row
begin
  update PARTS_TABLE p
  set p.ASSIGNED_ORDER_NUMBER = NULL
  where instr(':' || :new.ORDER_PARTS_LIST || ':'
             ,':' || p.PART_NUMBER || ':') = 0
  and instr(':' || :old.ORDER_PARTS_LIST || ':'
             ,':' || p.PART_NUMBER || ':') > 0;
end;
0 голосов
/ 27 января 2012

Вы создаете триггер для ORDER_TABLE.Поскольку ORDER_TABLE не содержит столбец с именем PART_NUMBER, Oracle не может найти идентификатор «PART_NUMBER», поскольку он принадлежит PARTS_TABLE.

Вам потребуется написать отдельный запрос в триггере, чтобы получить доступ к PART_NUMBER в PARTS_TABLE.

0 голосов
/ 27 января 2012

Не совсем уверен, как все это совмещается (кажется, что это не учитывает одну и ту же деталь в нескольких заказах), но похоже, что вы пытаетесь сделать что-то вроде этого:

...