Nhibernate TooManyRowsAffectedException Oracle

问题描述

表上有一个触发器,该触发器会定期创建一个插入并引发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中的异常用于控制和处理特定错误。

相关问答

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