在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;
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...