【问题标题】:Nhibernate TooManyRowsAffectedException OracleNhibernate TooManyRowsAffectedException Oracle
【发布时间】:2020-12-02 19:01:15
【问题描述】:

表上有一个触发器,它定期创建插入并抛出 TooManyRowsAffectedException。在 Sql server 中,我们可以将触发器设置为 NoCount 来解决这个问题。甲骨文有什么想法吗?

FluentNHibernate 2.12 .net 4.7.2 甲骨文11g

【问题讨论】:

    标签: oracle nhibernate fluent-nhibernate


    【解决方案1】:

    我认为你在谈论两件不同的事情:

    设置编号

    停止显示受影响行数的消息 由 Transact-SQL 语句或存储过程返回为 结果集的一部分。当 SET NOCOUNT 为 ON 时,不返回计数。当 SET NOCOUNT 为 OFF 时,返回计数。

    我猜您是在谈论 Oracle 中的异常 Too_Many_Rows,因为 Hibernate 的 TooManyRowsAffectedException 表明受影响的行数比我们预期的要多。通常表示给定表中存在重复的“PK”值。

    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 中的异常用于控制和处理特定错误。

    【讨论】:

    • 不,这不正确。感谢您的回答,但您的回答和经验都来自 Oracle 方面,而且您不熟悉 Nhibernate。
    • @Dys1,你说对了一部分。我的意思是解释为什么异常与 SQL Server 中的 NOCOUNT 不同。我知道您的异常与Oracle无关,而是与Nhibernate有关,但这与SQL Server中的SET NOCOUNT无关
    猜你喜欢
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2011-03-17
    相关资源
    最近更新 更多