如何解决在oracle中选择最后更新的行
| 如何获得上次更新的行或记录在oracle数据库中? 我想确保触发一个触发器,以检查最后更新的行是否具有所有大写条目,如果没有,则将它们转换为大写。解决方法
只需编写一个触发器即可:
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;
触发器将针对插入或更新的每一行触发,因此无需“查找”该行。
, SQL是一种基于集合的语言。如果要更新几行,则没有“最后更新的行”的概念。
确保您的API插入UPPER(column_name)似乎是您想要的。
您还可以创建行更新触发器,该触发器执行以下操作:
:new.column_name := upper(:new.column_name);
但这将比在API中提供大写的column_name效率低。
问候,
抢。
, 许多Oracle开发人员将尝试告诉您触发器不是一个好主意,并且如果尝试了所有其他方法,则实际上仅应将其用作解决问题的最后手段。他们经常习惯于做从未真正设计过的事情。 Tom Kyte在《 Oracle杂志》的这篇文章中描述了避免触发的一些原因。
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.
, 您可以使用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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。