используйте столбец для определения порядка отображения таблицы оракула - PullRequest
1 голос
/ 07 октября 2011

У меня есть таблица, которая представляет места в кампусе.Я отображаю эти местоположения для пользователя в веб-программе и хочу дать им возможность изменять порядок отображения местоположений. У меня есть столбец для этого, который называется ord.Сейчас я пытаюсь создать для пользователя способ обновления этого столбца и убедиться, что
1) нет ord дубликатов
2) что все значения ord> = 0 &&

Я полагаю, я должен сделать это с помощью триггеров.Во-первых, перед обновлением я использую код, чтобы убедиться, что значение> = 0 &

create or replace 
trigger plantry_campus_edit_after
after update on plantry_campus
for each row
declare 
  v_pkid number;
begin
  SELECT pkid INTO v_pkid FROM plantry_campus WHERE ord = :new.ord && pkid != :new.pkid;
  UPDATE plantry_campus SET ord = :old.ord WHERE pkid = v_pkid;
end;

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

Ответы [ 4 ]

1 голос
/ 07 октября 2011

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

0 голосов
/ 11 октября 2011

ИМХО, использование триггера в этом случае не очень хорошая идея, как говорит @Ben. Я бы переупорядочил таблицу на стороне приложения так:

Очевидное:

UPDATE plantry_campus SET
  ord = :new_order
where pkid = :pkid

И порядок обновления обновлений:

If (:new_order > :old_order) then    
  UPDATE plantry_campus SET
    ord = ord + 1
  where pkid != :pkid
    and ord >= :new_order
    and ord < :old_order;
elsif (:new_order < :old_order) then
  UPDATE plantry_campus SET
    ord = ord - 1
  where pkid != :pkid
    and ord > :old_order
    and ord <= :new_order;
end if;

Если вы не хотите делать это в приложении, просто поместите функцию PL / SQL в пакет.

0 голосов
/ 08 октября 2011

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

Вам нужно будет расширить триггер, чтобы включить все столбцы, которые вы собираетесь обновить.

create or replace view v_plantry_campus_edit as select * from plantry_campus;


create or replace 
trigger plantry_campus_edit_after
after update on v_plantry_campus
for each row
declare 
  v_pkid number;
begin
  SELECT pkid INTO v_pkid FROM plantry_campus WHERE ord = :new.ord && pkid != :new.pkid;
  UPDATE plantry_campus 
     SET ord = :old.ord
         -- etc
       , col1 = :new.col1
   WHERE pkid = v_pkid;
end;
0 голосов
/ 08 октября 2011

Если вы хотите сделать это, попробуйте использовать переменную пакета с табличным типом plsql. Заполните таблицу plsql в триггере строки, затем выполните обновление в триггере оператора. Это позволит обойти проблему изменяющейся таблицы, поскольку триггеры уровня операторов в этом сценарии не затрагиваются.

Аналогично этому.

проблема с триггером в оракуле

Помните, что переменные пакета сохраняются на протяжении всего сеанса, поэтому инициализируйте их в триггере before.

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