#sql #oracle
#sql #Oracle
Вопрос:
Как я могу получить последнюю обновленную строку или запись в базе данных Oracle?
Я хочу убедиться, что запущен триггер для проверки, содержит ли последняя обновленная строка все записи в верхнем регистре, и если нет, преобразуйте их в верхний регистр.
Ответ №1:
Просто напишите триггер для этого:
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;
Триггер срабатывает для каждой вставленной или обновленной строки, поэтому нет необходимости «находить» строку.
Ответ №2:
SQL — это язык, основанный на наборе. Если вы собираетесь обновить несколько строк, понятия «последняя обновленная строка» не существует.
Убедитесь, что ваш API вставляет ВЕРХНИЙ (column_name), похоже, это то, что вы хотите.
Вы также можете создать триггер обновления перед строкой, который выполняет:
:new.column_name := upper(:new.column_name);
Но это было бы менее эффективно, чем предлагать имя_столбца в верхнем регистре в вашем API.
С уважением,
Роб.
Ответ №3:
Многие разработчики Oracle попытаются сказать вам, что триггеры — плохая идея и их действительно следует использовать только в качестве последнего средства для решения проблемы, если все остальное было испробовано. Они часто привыкают делать то, для чего они на самом деле никогда не были предназначены. Некоторые из причин, по которым следует избегать триггеров, описаны Томом Кайтом в этой статье Oracle Magazine.
В своем ответе Роб ван Вейк говорит, что API, используемый для изменения данных, должен позаботиться о том, чтобы вставлять только данные в верхнем регистре. Альтернативой этому было бы создать контрольное ограничение для столбца, чтобы можно было добавлять данные только в верхнем регистре.
SQL> create table my_temp_table (
2 col_1 varchar2(50) check (col_1 = upper(col_1))
3 );
Table created.
Создайте таблицу. Затем попробуйте вставить что-нибудь недопустимое, и ограничение check выдаст сообщение об ошибке.
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.
Комментарии:
1. 1 хорошее дополнение. Не следует забывать об ограничении проверки.
Ответ №4:
вы можете использовать return rowid into
для получения rowid последней обновленной строки
в 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;
Комментарии:
1. Это работает только в особом случае, когда инструкция обновляет только одну строку. Вы получите сообщение «ORA-24369: требуемые обратные вызовы не зарегистрированы для одного или нескольких дескрипторов привязки», если имеется более одной строки.