问题描述
表上有一个触发器,该触发器会定期创建一个插入并引发TooManyRowsAffectedException。在Sql Server中,我们可以将触发器设置为NoCount以解决该问题。在Oracle中有什么想法吗?
流利NHibernate 2.12 .net 4.7.2 甲骨文11g
解决方法
我认为您在谈论两个不同的话题:
设置NOCOUNT开
停止显示受影响的行数计数的消息 由Transact-SQL语句或存储过程返回 结果集的一部分。当SET NOCOUNT为ON时,不返回计数。当SET NOCOUNT为OFF时,返回计数。
我猜您在谈论Oracle中的异常Too_Many_Rows
,因为Hibernate的TooManyRowsAffectedException
表示受影响的行数超出了我们的预期。通常表示给定表中存在重复的“ PK”值。
SELECT INTO发生TOO_MANY_ROWS异常(ORA-01422) 语句返回多个行。
Oracle中的异常在PL / SQL程序中处理到异常部分中,在SQL Server中,其对应部分为TRY CATCH
。
当Oracle中的程序包含异常块时,您可以通过更改错误的结果来控制许多特定错误之一的输出,从而可以控制发生错误时程序应采取的措施。 异常基本上是一个逻辑表达式,可以回答一个简单的问题:当错误发生时,您将如何处理。
exception
when ... then ...
让我给你看一个例子
SQL> create table t ( c1 number,c2 number ) ;
Table created.
SQL> alter table t add primary key (c1) ;
Table altered.
SQL> set timing off
SQL> declare
begin
insert into t values ( 1,1 );
commit ;
insert into t values ( 1,2 );
commit;
exception
when dup_val_on_index then null;
when others then raise;
end;
/
PL/SQL procedure successfully completed.
SQL> select * from t ;
C1 C2
---------- ----------
1 1
如您在上面的示例中所见,我只是控制了异常dup_val_on_index
以防止程序引发错误。对于too_many_rows
异常,我可以做同样的事情。
基本上,如果您想忽略该异常,则可以在触发器中更改代码,以避免在发生异常时引发错误。您也可以禁用触发器,但是我想这可能不是一个选择。
您只需要意识到这两者是不同的。 SET NOCOUNT ON阻止将受影响的行的消息传递到客户端程序。 Oracle PL / SQL中的异常用于控制和处理特定错误。