2017-10-05 115 views
0

我正在使用Oracle,但是我會對是否可以在任何sql版本中感興趣。基本上,我有一個長期的選擇陳述;我需要確認select返回一定數量的記錄(一個單獨的select count(*)的輸出),我一直無法弄清楚如何以編程方式執行此操作(或解決阻止我知道的問題我的查詢從開始就是100%正確的)。SQL - 如果select語句返回「錯誤的」行數,則會引發錯誤

理想情況下,我想添加幾行,這樣,無論是正確的一組返回,或拋出一個錯誤

+0

有足夠的時間和精力,我可以在sql server中做到這一點。與所有艱鉅的任務一樣,我會一次做一件事。在這種情況下,我會做的第一件事就是拋出一個錯誤。第二種是基於非常簡單的條件邏輯來拋出錯誤。 –

回答

1

所以這是在MS-SQL這樣做,但我敢肯定,你可以很容易使它甲骨文工作,如果你覺得傾斜:

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並返回我的查詢(可以作爲可讀性存儲)。如果這個計數發生變化,那麼它會通過我寫的信息引發異常。

我不確定你的意思是如何使用它,但我想這會適合存儲過程相當好。

+0

你的方法需要兩次執行相同的查詢嗎? –

+0

在這個例子中,是的,這可能與你想要完成的事情無關。 如果它的查詢和性能很重要(它可能會),那麼你可以將內容加載到臨時表中,然後評估是否返回它或拋出錯誤。然後你只需要支付一次查詢的費用。儘管如此,您仍然會花費查詢臨時表的費用。 我不確定運行查詢的方法,當我們評估我們的條件時,將內容保存在緩存中,然後僅返回單個選擇的成本。 – BWoods

+0

是翻倍的成本是我想要避免的。我曾想過在select子句中添加',count(*)作爲tot',這不會導致錯誤本身,但也不需要兩次傳遞? –