Exception в триггере

igor2222
Дата: 24.09.2004 19:22:24
Сорри за ламерский вопрос
Как правильно написать триггер бефоре инсерт, который при вставке записи и получения эксепшена (запись по ПК уже есть в базе) делал бы ее UPDATE ?
SY
Дата: 24.09.2004 19:30:26
Well, правильно would be to use MERGE instead of INSERT (assuming your version supports MERGE operator).

SY
igor2222
Дата: 24.09.2004 19:35:37
К сожалению я не могу в процедуре, вставляющей записи в таблицу анализировать эту таблицу на присутствие записи по ПК. Могу только триггер прицепить. Как это сделать правильно?
Elic
Дата: 24.09.2004 19:53:42
Нельзя такого сделать в триггере.
Надо менять процедуру. Анализировать таблицу нет надобности:
- либо update...; if sql%rowcount=0 then insert...; end if;
- либо merge.
igor2222
Дата: 24.09.2004 20:03:11
Хорошо, тогда как правильно написать merge?
Задача следующая Есть процедура, выполняющая insert into table1 (select .... from table2, table3 where....)
Select пробегает приблизительно 100 000 записей из двух таблиц по 1 млн...
Denis Popov
Дата: 24.09.2004 20:10:16
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_915a.htm#2080977

Сразу заодно - не указывай в секции UPDATE те поля, по которым ты соединяешь таблицы - оно этого не переваривает.
eev
Дата: 24.09.2004 20:32:35
Вопрос может быть тоже ламерский, но объясните мне как вы определите что запись которую вы хотите вставить существует в таблице
John.D
Дата: 27.09.2004 06:21:33
eev
объясните мне как вы определите что запись которую вы хотите вставить существует в таблице

Например - DUP_VAL_ON_INDEX exception...
igor2222
Дата: 27.09.2004 11:47:05
Всё равно немного не понял.
Пишу так:

MERGE INTO Table_result a
USING (Select на 200 строк) b
ON (a.str1=b.str1) and (a.str2=b.str2)
WHEN MATCHED THEN UPDATE SET a.str3=b.str3
WHEN NOT MATCHED THEN
INSERT (a.str1, a.str2, a.str3, a.str4)
VALUES (b.str1, b.str2, b.str3, b.str4)


Так работать будет?
b возвращает около 100 000 строк
a около 5 млн строк. Индекс ПК (str1+str2) причем таблица организейшен индекс
Димитрий_
Дата: 27.09.2004 12:11:27
update bigT a

where exists (select null from ..., t и
where a.pk = b.pk);

insert into

select ...
where NOT exists (select null from ..., t и
where a.pk = b.pk);

Думаю что megre делает тоже самое.


PS. Игорь можите позвонить по Харькову.

Димитрий.