2016-01-05 63 views
-1

我很抱歉,這可能是一個愚蠢的問題!我創建了一個維護並運行一系列程序/功能的程序。如果在任何過程中發生錯誤,則會向我發送電子郵件,並使用失敗的過程名稱設置自動刷新參數。單表包含所有過程(確切名稱爲varchar2),以循環結構自上而下的順序運行。如何跳到使用select語句失敗的過程,同時抓取失敗過程下的所有其他過程?基本上我希望程序從停止的地方開始,並繼續運行所有其他程序。我會欣賞任何想法,因爲我只是在學習。SQL SELECT語句跳過基於WHERE語句的行

UPDATE

對於那些困惑。我需要一個SELECT語句,它基於where來跳過行,並抓住第一行下面的所有其他行。基本psuedocode下面...

SELECT procedure_name 
FROM table_whatever 
SKIP ROWS that procedure_status <> 'completed' 
AND grab all rows underneath 
WHILST keeping rows in proper order 

id procedure   status 
15 table_insert  failed 
16 table_update  In Queue 
17 email_completion In Queue 

我需要抓住失敗的程序以及下面的一切。

任何想法?

預先感謝您!

+3

請閱讀如何問StackOverflow上一個問題給予的常見問題最好的機會回答:http://stackoverflow.com/help/how-to-ask。您應該擁有表格結構,示例數據和預期結果。 –

+0

請提供代碼,沒有人喜歡閱讀某些語句,而且這沒有幫助,您的程序中您的問題在哪裏? –

+0

@TomH謝謝。下次我會記住這一點。不幸的是我不能顯示結構,示例數據或類似的東西。這正在我公司的測試服務器上進行測試,準備在pl/sql和Oracle數據庫中進行認證。我希望有人能夠給出我可能遵循的一個非常基本的例子,或者告訴我這是不可能的。 – PZNevill

回答

3

我會咬,什麼。根據您上述數據它假定只能有一排用「失敗」的狀態,並且假設程序是在「身份證」的順序:

SELECT procedure 
FROM table_whatever 
WHERE id >= (SELECT ID 
       FROM table_whatever 
       where status = 'failed') 
ORDER by id; 
+0

是的,你所陳述的關於我制定的基本設計是真實的。作爲SQL和PL/SQL的初學者,我沒有意識到你可以在WHERE子句中創建一個SELECT。這似乎對我的教程中的這個繞道有足夠的動態。 – PZNevill

+0

使用'min(ID)'可以消除只有一個可能出現失敗狀態的要求。 – shawnt00

0

根據您的最小的僞代碼,並假設「正確的順序「由ID,你可以排除那些完成:

SELECT procedure_name 
FROM table_whatever 
WHERE procedure_status <> 'completed' 
ORDER BY id; 

如果你明確要尋找‘失敗’ - 所以同樣的查詢可用於任何已運行之前揭開序幕序列 - 你可以使用分析查詢和內聯視圖,所以你只需要一次點擊表格:

SELECT procedure_name 
FROM (
    SELECT id, procedure_name, procedure_status, 
    MIN(CASE WHEN procedure_status = 'failed' THEN id END) OVER() AS failed_id 
    FROM table_whatever 
) 
WHERE id >= COALESCE(failed_id, 0) 
ORDER BY id; 

對於一張小桌子打它可能兩次不算什麼大不了的事,所以Gary_W的子查詢的方式將工作一樣好......