Запрос с предложением "With" внутри контура For Loop DB2 PL SQL

У меня очень сложный запрос, включающий предложение "С". Этот запрос отлично работает при выполнении на клиенте DB2. Но если тот же запрос используется внутри курсора For Loop хранимой процедуры PL 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;

Можете ли вы помочь решить эту проблему. Заранее спасибо.

2 ответа

У тебя две проблемы. Во-первых, 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, не соответствует действительности.

Наконец-то у меня все заработало. Решение было довольно простым. Это должно было удалить скобки, заключающие запрос, как показано ниже.

 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.

Другие вопросы по тегам