2013-12-09 56 views
0

我有一個非常複雜的查詢,其中包含「With」子句。這個查詢在DB2客戶端上執行時工作正常。但是,如果在PL SQL存儲過程的For循環遊標中使用相同的查詢,則它不起作用。試圖將存儲過程應用於數據庫時,它會給出語法錯誤,如下所示。在DB2 PL的For循環遊標中使用「With」子句進行查詢

SQL0104N An unexpected token "AS" was found following "col5) 

for循環如下所示。

FOR records AS cursors CURSOR FOR 
    (
    WITH 
    temp1 
    (
     col1, col2, col3, col4, col5 
    ) 
    AS 
    (
     SELECT 
     col1, col2, col3, col4, col5 
    FROM 
     table1 
    ) 
    WITH 
    temp2 
    (
     col6, col7, col8, col9, col10 
    ) 
    AS 
    (
     SELECT 
     col6, col7, col8, col9, col10 
    FROM 
     table2 
    ) 
    SELECT col1, col2, col3, col4, col5, col6, co7, col8, col9, col10 
    FROM temp1, temp2 
) 
DO 
    -- Do Something here. 
END FOR; 

您可以請幫忙解決這個問題。提前致謝。

+0

你爲什麼要在循環中執行語句? SQL通常在集合中更好。 –

+0

沒有特定的原因。 SQL查詢返回的數據將在循環內部修改。我必須應用各種轉換規則,並且我認爲通過記錄處理記錄的結果給了我對數據的很多控制權。因此使用如上所述的方法。 – Abhi

回答

0

你有兩個問題。首先,FOR聲明不正確;它應該是指先前聲明的光標:

... 
CURSOR mycur IS WITH ... SELECT ...; 
... 
FOR rec IN mycur LOOP ... 

二,查詢

WITH temp1 (col1, col2, col3, col4, col5) AS ( 
    SELECT col1, col2, col3, col4, col5 FROM table1 
) 
WITH temp2 (col6, col7, col8, col9, col10) AS ( 
    SELECT col6, col7, col8, col9, col10 FROM table2 

是無效的,絕不會在自己獨立運行,所以你的要求,它在CLP執行是不真實的。

+0

使用我在此使用的For循環的種類,DB2隱式創建了一個可循環的遊標。我不需要明確地聲明它。隨着我寫的查詢,我試圖縮小問題的範圍,而不是寫出確切的查詢。在上面的查詢中,當然有一個選擇符合with子句。請檢查我的編輯並讓我知道現在是否有意義。 – Abhi

+0

查詢仍然是無效的,而'FOR'語句的語法仍然是錯誤的。您可能需要檢查手冊中是否有正確的語法。 – mustaccio

+0

我已經使用了相同的FOR循環結構,如下面的鏈接中給出。它確實沒有任何問題。還有什麼不對嗎? http://stackoverflow.com/questions/15198577/how-to-get-db2-9-7-cursor-value-in-for-loop-where-returned-value-is-a-string – Abhi

0

最後我得到了這個東西的工作。解決方案非常簡單。它將移除括號,如下所示。

FOR records AS cursors CURSOR FOR 

    WITH 
    temp1 
    (
     col1, col2, col3, col4, col5 
    ) 
    AS 
    (
     SELECT 
     col1, col2, col3, col4, col5 
    FROM 
     table1 
    ) 

    WITH 
    temp2 
    (
     col6, col7, col8, col9, col10 
    ) 
    AS 
    (
     SELECT 
     col6, col7, col8, col9, col10 
    FROM 
     table2 
    ) 
    SELECT col1, col2, col3, col4, col5, col6, co7, col8, col9, col10 
    FROM temp1, temp2 
DO 
    -- Do Something here. 

END FOR ; 

我不太確定爲什麼會發生這種情況。對於沒有WITH子句的任何其他正常查詢,它都可以工作。