在DB2 PL的For循环游标中使用“With”子句进行查询
我有一个非常复杂的查询,其中包含“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;
您可以请帮忙解决这个问题。提前致谢。
你有两个问题。首先,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循环的种类,DB2隐式创建了一个可循环的游标。我不需要明确地声明它。随着我写的查询,我试图缩小问题的范围,而不是写出确切的查询。在上面的查询中,当然有一个选择符合with子句。请检查我的编辑并让我知道现在是否有意义。 – Abhi
查询仍然是无效的,而'FOR'语句的语法仍然是错误的。您可能需要检查手册中是否有正确的语法。 – mustaccio
我已经使用了相同的FOR循环结构,如下面的链接中给出。它确实没有任何问题。还有什么不对吗? http://stackoverflow.com/questions/15198577/how-to-get-db2-9-7-cursor-value-in-for-loop-where-returned-value-is-a-string – Abhi
最后我得到了这个东西的工作。解决方案非常简单。它将移除括号,如下所示。
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子句的任何其他正常查询,它都可以工作。
你为什么要在循环中执行语句? SQL通常在集合中更好。 –
没有特定的原因。 SQL查询返回的数据将在循环内部修改。我必须应用各种转换规则,并且我认为通过记录处理记录的结果给了我对数据的很多控制权。因此使用如上所述的方法。 – Abhi