2012-05-18 30 views
1

我們目前有一個存儲過程,需要做到以下幾點: 如果查詢1返回任何結果打開SYS_REFCURSOR遊標爲,然後返回 其他 打開的遊標QUERY2的Oracle存儲過程返回數據集的基礎上計數

目前我們正在對Query1的from和where子句計數(*),並在if-else語句中使用count。但是,這會導致query1被執行兩次。有沒有一種方法來優化這個?

回答

1

打開光標查詢1 &執行真正的查詢。將它包裝在BEGIN .. END塊中&捕獲無數據發現異常。

BEGIN 

-- query1 code 

-- return data 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    NULL; 

BEGIN 
-- query2 code 

-- return data 

END; 

query2代碼將在query1沒有返回數據時運行。

0

我喜歡菲爾的回答爲好,但另一種選擇是使用你使用相同的邏輯,但是轉換計數查詢使用ROWNUM STOPKEY,如:

select count(1) 
into v_cnt 
from some_table 
where some_field like 'ABC%' 
and rownum <= 1; 

的ROWNUM可以讓甲骨文停止計數一旦得到一個命中(意味着有一個或多個行從查詢中返回)。當然可以根據數據和查詢做出很大的改變。

相關問題