2011-04-07 176 views
2

我試圖在存儲過程中使用WITH,但是失敗。我的假設是我可以使用WITH作爲我的SELECT聲明的一部分;現在我不確定是否有可能,並且我做錯了,或者如果這是不可能的。在存儲過程中使用WITH

我都試過以下,但都扔在AS錯誤繼WITH

嘗試1:

SET p_temp = (
    WITH 
     temp (id) AS (
      SELECT orgs.id 
      FROM orgstruct.tOrgs AS orgs 
      WHERE orgs.prnt = p_OrgID 
     ) 
    SELECT 1 
    FROM temp 
    FETCH FIRST 1 ROWS ONLY); 

嘗試2:

IF EXISTS (
     WITH 
      temp (id) AS (
       SELECT orgs.id 
       FROM orgstruct.tOrgs AS orgs 
       WHERE orgs.prnt = p_OrgID 
      ) 
     SELECT 1 
     FROM temp) THEN 
    SET p_temp = 1; 
END IF; 

的是隻有解決方案才能爲每個通常想要使用的WITH創建視圖?

+0

看到這個http://www.orafaq.com/node/1879 – ashishjmeshram 2011-04-07 13:11:58

+0

我沒有問題從命令行執行查詢,問題是當我嘗試在存儲過程中使用相同的查詢。這是我混亂的根源:沒有'WITH'的'SELECT'語句很好,但是在嘗試創建過程時出現'WITH'會引發錯誤。 – Matt 2011-04-07 13:40:38

回答

1

我結束了以下準備:

DECLARE p_exists SMALLINT; 

DECLARE c1 CURSOR 
    WITHOUT HOLD 
    WITHOUT RETURN 
    FOR 
     WITH 
      cte AS (SELECT x FROM y) 
     SELECT 1 
     FROM cte 
     FETCH FIRST 1 ROWS ONLY 
    FOR READ ONLY 
    OPTIMIZE FOR 1 ROWS; 
OPEN c1; 
SET p_exists = 0; 
FETCH c1 INTO p_exists; 
CLOSE c1; 

p_exists是1,如果一個或多個記錄存在,否則爲0。 我曾希望避免使用遊標,但它仍然是最好的意見。

1

如何

with cte as 
(
SELECT COUNT(orgs.id) as cte_result 
      FROM orgstruct.tOrgs AS orgs 
      WHERE orgs.prnt = p_OrgID 
) 
select 
    case 
     when cte.cte_result > 0 
      then '>0' 
     else '=0' 
    end 
from cte 

返回 '> 0' 或 '= 0' 作爲結果。

絕對不需要觀點或光標...

0

如果你的表達是真的只是返回基於匹配的行存在一個標值,可以存儲過程中完成的,而無需使用CTE:

SELECT CASE WHEN (EXISTS (SELECT 1 FROM orgstruct.tOrgs AS orgs WHERE orgs.prnt = p_OrgID)) 
    THEN 1 
    ELSE 0 
    END 
INTO p_exists 
FROM sysibm.sysdummy1 
; 

對於那些確實需要的CTE更復雜的查詢,你也有嵌入的CTE用戶定義的函數中,然後調用從存儲過程的功能選項。