Запрос с предложением "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.