【问题标题】:SQL - raise error if a select statement returns the "wrong" number of rowsSQL - 如果选择语句返回“错误”的行数,则引发错误
【发布时间】:2017-10-06 01:01:53
【问题描述】:

我正在与 Oracle 合作,但我想知道这是否可以在任何 sql 风格中实现。本质上我有一个很长的选择语句;我需要确认选择返回一定数量的记录(单独选择计数(*)的输出)并且我无法弄清楚如何以编程方式执行此操作(或解决阻止我知道的问题我的查询从一开始就 100% 正确)。

理想情况下,我想添加几行,以便返回正确的集合或引发错误

【问题讨论】:

  • 如果有足够的时间和精力,我可能可以在 sql server 中完成。与所有困难的任务一样,我一次只做一件事。在这种情况下,我要做的第一件事就是抛出一个错误。第二种是基于非常简单的条件逻辑的 throw 和 error。

标签: sql oracle11g


【解决方案1】:

所以这是在 MS-SQL 上完成的,但如果您愿意,我相信您可以轻松地使其适用于 Oracle:

DECLARE @err_message nvarchar(255)
set @err_message = 'Doesnt match count expected'

IF
(select count(*) [Counter] from(
    select ordernum from erp.orderhed where ordernum > 390000) as Ordercount) <> 3412
raiserror(@err_message,11,1)

ELSE

select ordernum from erp.orderhed where ordernum > 390000

在此示例中,我知道(因为我检查过)该查询将返回正好 3412 行,因此它将进入 ELSE 并返回我的查询(可以将其存储为视图以提高可读性) .如果该计数发生变化,那么它将引发我写的消息的异常。

我不确定你的意思是如何使用它,但我想这将非常适合存储过程。

【讨论】:

  • 您的方法是否需要执行相同的查询两次?
  • 在这个例子中是的,这对你想要完成的事情可能很重要,也可能无关紧要。如果它是一个繁重的查询和性能问题(它可能确实如此),那么您可以将内容加载到临时表中,然后评估是返回它还是抛出错误。那么您只需要支付一次查询费用。但是,您将承担查询临时表的费用。我不确定运行查询的方法,在我们评估条件时将内容保持在边缘,然后仅以单次选择的成本返回它们。
  • 是的,成本翻倍是我想要避免的。我曾想过将 ',count(*) as tot' 添加到 select 子句中,这本身不会引发错误,但也不需要两次传递?
  • 是的,但是如果您返回所有带有计数列的行,每个单元格的值只会为 1,因为 Count 基本上是 Sum(# of rows) 和 group by。我有行计数的想法,所以每行编号为 1、2、3 等...然后您可以查看 Max(RowCountColumn) 并查看它是否匹配?那可以做到。同样,它的 T-SQL 但这里有一个文档链接:support.microsoft.com/en-us/help/186133/…
猜你喜欢
  • 2019-04-22
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 2015-01-05
  • 2021-07-22
相关资源
最近更新 更多