2013-12-09 1 views
0

"With"절이 포함 된 매우 복잡한 쿼리가 있습니다. 이 쿼리는 DB2 클라이언트에서 실행될 때 올바르게 작동합니다. 그러나 동일한 쿼리가 PL SQL 저장 프로 시저의 For 루프 커서 내에서 사용되는 경우 작동하지 않습니다. 저장 프로 시저를 데이터베이스에 적용하려고하면 아래와 같이 구문 오류가 발생합니다.DB2 PL의 for 루프 커서 내에서 "With"절을 사용하여 쿼리 SQL

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 Loop의 종류와 함께 DB2는 암시 적으로 커서를 반복하여 루프 할 수 있습니다. 나는 그것을 명시 적으로 선언 할 필요가 없다. 내가 작성한 쿼리를 사용하여 정확한 쿼리를 작성하는 대신 문제를 좁히려 고했습니다. 물론 위의 쿼리에서 with 절을 따르는 select가 있습니다. 제 편집을 확인하고 지금 이해가되는지 알려주세요. – 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 절이없는 다른 일반 쿼리에 대해서는 정상적으로 작동합니다.