【发布时间】:2020-12-02 19:01:15
【问题描述】:
表上有一个触发器,它定期创建插入并抛出 TooManyRowsAffectedException。在 Sql server 中,我们可以将触发器设置为 NoCount 来解决这个问题。甲骨文有什么想法吗?
FluentNHibernate 2.12 .net 4.7.2 甲骨文11g
【问题讨论】:
标签: oracle nhibernate fluent-nhibernate
表上有一个触发器,它定期创建插入并抛出 TooManyRowsAffectedException。在 Sql server 中,我们可以将触发器设置为 NoCount 来解决这个问题。甲骨文有什么想法吗?
FluentNHibernate 2.12 .net 4.7.2 甲骨文11g
【问题讨论】:
标签: oracle nhibernate fluent-nhibernate
我认为你在谈论两件不同的事情:
设置编号
停止显示受影响行数的消息 由 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 中的异常用于控制和处理特定错误。
【讨论】: