Выберите последнюю обновленную строку в Oracle - PullRequest
1 голос
/ 27 мая 2011

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

Ответы [ 4 ]

5 голосов
/ 27 мая 2011

SQL - это язык на основе множеств.Если вы собираетесь обновить несколько строк, не существует понятия «последняя обновленная строка».

Убедитесь, что ваш API вставляет UPPER (column_name), что вам нужно.

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

:new.column_name := upper(:new.column_name);

Но это будет менее эффективно, чем предлагать имя столбца в верхнем регистре в вашем API.

С уважением,
Роб.

5 голосов
/ 27 мая 2011

Просто напишите триггер, чтобы сделать это:

create trigger mytable_trg
before insert or update on mytable
for each row
begin
   :new.col1 := upper(:new.col1);
   :new.col2 := upper(:new.col2);
end;

Триггер срабатывает для каждой вставленной или обновленной строки, поэтому нет необходимости "находить" строку.

4 голосов
/ 27 мая 2011

Многие разработчики Oracle попытаются сказать вам, что триггеры - плохая идея, и их действительно следует использовать только в качестве крайней меры для решения проблемы, если все остальное было опробовано.Они часто привыкли делать вещи, для которых они никогда не были предназначены.Том Кайт описал некоторые причины избегания триггеров в этой статье Oracle Magazine .

В своем ответе Роб ван Вейк говорит, что API, используемый для изменения данных, должен позаботиться о том, чтобы вставлялись только данные верхнего регистра.Альтернативой этому было бы создание проверочного ограничения для столбца, чтобы можно было только добавлять данные верхнего регистра.

SQL> create table my_temp_table (
  2  col_1 varchar2(50) check (col_1 = upper(col_1))
  3  );
Table created.

Создать таблицу.Затем попытайтесь вставить недопустимое значение, и ограничение проверки вызовет ошибку.

SQL> insert into my_temp_table values ('data');
insert into my_temp_table values ('data')
*
ERROR at line 1:
ORA-02290: check constraint (EMIR_MONTHLY_PAL.SYS_C00113139) violated

Допустимые данные будут введены без проблем.

SQL> insert into my_temp_table values ('DATA');

1 row created.
0 голосов
/ 27 мая 2011

Вы можете использовать return rowid into, чтобы получить идентификатор последней обновленной строки

в sqlplus:

create table t (id number, val varchar2(10));
insert into t (id, val) values(1, 'abc');

var rid varchar2(100);

update t set val = 'xxx' where id = 1 return rowid into :rid;

select * from t where rowid = :rid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...