如何在oracle数据库中获取最后更新的行或记录? 我想确保触发一个触发器来检查上一个更新的行是否包含所有大写条目,如果没有将它们转换为大写。
答案 0 :(得分:5)
只需编写一个触发器即可:
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;
触发器会触发插入或更新的每一行,因此无需“找到”该行。
答案 1 :(得分:5)
SQL是一种基于集合的语言。如果要更新多行,则不存在“上次更新行”的概念。
确保您的API插入UPPER(column_name)似乎就是您想要的。
您还可以创建一个行前更新触发器:
:new.column_name := upper(:new.column_name);
但这比在API中提供大写的column_name效率低。
的问候,
罗布。
答案 2 :(得分:4)
许多Oracle开发人员会尝试告诉您触发器是一个坏主意,如果其他所有内容都已经过尝试,那么它们应该只是作为解决问题的最后手段。他们经常习惯于做他们从未真正设计过的事情。 Tom Kyte在此Oracle Magazine article中描述了避免触发器的一些原因。
在他的回答中,Rob van Wijk说用于修改数据的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.
答案 3 :(得分:0)
您可以使用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;