Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Тригер, вставка по условию  [new]
iv_roman_vl
Member

Откуда: Москва
Сообщений: 173
Всем привет.

Можно ли, в тригере при вставке добавлять новую или обновить нужную строку?

например ,

если (выражение) равно true, то вставляем новую запись
если нет то обновляем нужную запись

если да то пример скинте плиз
18 июл 18, 10:29    [21580167]     Ответить | Цитировать Сообщить модератору
 Re: Тригер, вставка по условию  [new]
шК0ДЕР
Member

Откуда: Издалека долго
Сообщений: 1206
MERGE
18 июл 18, 10:32    [21580182]     Ответить | Цитировать Сообщить модератору
 Re: Тригер, вставка по условию  [new]
Elic
Member

Откуда:
Сообщений: 29976
RTFM PL/SQL Triggers (FAQ)
18 июл 18, 10:33    [21580185]     Ответить | Цитировать Сообщить модератору
 Re: Тригер, вставка по условию  [new]
iv_roman_vl
Member

Откуда: Москва
Сообщений: 173
Суть такова, что перед вставкой я проверяю, есть ли в этой таблице такая же запись, если да то я не создаю новую запись а просто делаю update существующей.

И почему то при select к этой таблице в тригере exception.
18 июл 18, 11:00    [21580260]     Ответить | Цитировать Сообщить модератору
 Re: Тригер, вставка по условию  [new]
iv_roman_vl
Member

Откуда: Москва
Сообщений: 173
create or replace TRIGGER имя_тригера BEFORE
  INSERT ON t1 FOR EACH ROW 
  DECLARE
	v_count NUMBER;
  BEGIN
    IF :NEW.ID IS NULL THEN
      SELECT имя_сиквенса.NEXTVAL INTO :NEW.ID FROM dual;
      select count(*) into v_count from t1;
    END IF;

END;


Убираю
select count(*) into v_count  from t1;

и все ок...

если например сделать с select к другой таблице:
select count(*) into v_count from MPG.EMP;

то все ок
18 июл 18, 11:06    [21580284]     Ответить | Цитировать Сообщить модератору
 Re: Тригер, вставка по условию  [new]
Elic
Member

Откуда:
Сообщений: 29976
iv_roman_vl
Суть такова, что перед вставкой я проверяю, есть ли в этой таблице такая же запись, если да то я не создаю новую запись а просто делаю update существующей.

И почему то при select к этой таблице в тригере exception.
Потому что не понимаешь простых вещей.
Выкинь свой говнокод подальше и прислушайся к шкодеру.
18 июл 18, 11:19    [21580338]     Ответить | Цитировать Сообщить модератору
 Re: Тригер, вставка по условию  [new]
iv_roman_vl
Member

Откуда: Москва
Сообщений: 173
Elic,

MERGE для того что бы кастомно склеить две таблицы по ключу.
У меня же имеется запрос в котором есть строки с одинаковыми ключами. И мне надо эти строки "схлопнуть" в одну, записав недостающие данные либо из одной либо из другой.

Попробую конечно MERGE скормить запрос сам на себя, посмотрим что из этого выйдет)
18 июл 18, 11:31    [21580391]     Ответить | Цитировать Сообщить модератору
 Re: Тригер, вставка по условию  [new]
Elic
Member

Откуда:
Сообщений: 29976
iv_roman_vl
У меня же имеется запрос в котором есть строки с одинаковыми ключами. И мне надо эти строки "схлопнуть" в одну, записав недостающие данные либо из одной либо из другой.
Быдло-мышление.
Не создавай "дублей" в данных - не придётся мучаться, чтобы от них избавиться.
18 июл 18, 11:36    [21580414]     Ответить | Цитировать Сообщить модератору
 Re: Тригер, вставка по условию  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Elic
Не создавай "дублей" в данных - не придётся мучаться, чтобы от них избавиться.
Иногда дубли создаются одними, а убирать приходится другим
18 июл 18, 11:40    [21580429]     Ответить | Цитировать Сообщить модератору
 Re: Тригер, вставка по условию  [new]
iv_roman_vl
Member

Откуда: Москва
Сообщений: 173
Elic,

Во первых, эти данные из другой системы.
Во вторых, это не дубли. В сторонней системе это две отдельные записи, несущие свою смысловую загрузку. В нашей системе данные по этим строкам совмещаются в одну запись. Так как эти "дубли", как ты их называешь, дополняют друг друга.
18 июл 18, 11:41    [21580435]     Ответить | Цитировать Сообщить модератору
 Re: Тригер, вставка по условию  [new]
Elic
Member

Откуда:
Сообщений: 29976
iv_roman_vl
В нашей системе данные по этим строкам совмещаются в одну запись.
Ну так совмести их сразу в запросе.
18 июл 18, 11:42    [21580439]     Ответить | Цитировать Сообщить модератору
 Re: Тригер, вставка по условию  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18483
Есть еще INSTEAD OF триггеры
18 июл 18, 12:02    [21580509]     Ответить | Цитировать Сообщить модератору
 Re: Тригер, вставка по условию  [new]
Elic
Member

Откуда:
Сообщений: 29976
Вячеслав Любомудров
Есть еще INSTEAD OF триггеры
Оригинальный способ сделать group by.
18 июл 18, 12:15    [21580561]     Ответить | Цитировать Сообщить модератору
 Re: Тригер, вставка по условию  [new]
iv_roman_vl
Member

Откуда: Москва
Сообщений: 173
Пробовал MERGE,
как я понял он предназначен для вставки/обновления данных в таблицу с уже существующими данными, по полям базовой и донорской таблицы.
У меня же изначально пул данных приходит одним запросом с внешней среды и мне надо внутри этих данных, по некоторым условиям, схлопнуть строки.
Соответственно у меня нет базовой таблицы, с которой сравнивать поля. Можно конечно заморочится и написать два одинаковых запроса к внешней системе и применить к ним MERGE. Но постольку поскольку, запрос адский по составу и по времени выполнения.
Этот вариант не подошел.

Пробовал INSTEAD OF,
На сколько я понял, он проверяет дубли для инсертов внутри тригера(на внешние таблицы).
А мне нужно проверять дубли на самом инсерте в текущую таблицу.

Решил задачу, другим способом. Может примитивно, но работает быстро.
1) Запрос ко внешним ресурсам и запись результата в таблицу t1.
2) Запрос к таблице t1:
ищу те строки которые надо схлопнуть, при чем именно те которые будут нести доп информацию.
из всех записей t1 вычитаю выше найденные строки.
Селектом беру результат по разнице и селектом по ключам достаю значения ранее вычтенных строк.

Так же плюс в том, что проект на начальной стадии и ключи поиска будут меняться в процессе.
И из за простоты решения не составить труда менять ключи поиска.

А то я представил как я это буду делать с group by , MERGE, INSTEAD OF на минуту стало плохо)

Всем спасибо за участие.
Я не гуру sql так что может не правильно воспринял предложенные методы...
19 июл 18, 07:40    [21583284]     Ответить | Цитировать Сообщить модератору
 Re: Тригер, вставка по условию  [new]
Elic
Member

Откуда:
Сообщений: 29976
iv_roman_vl
Я не гуру sql так что
говнокодь дальше.
19 июл 18, 07:55    [21583305]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить