在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; 

您可以请帮忙解决这个问题。提前致谢。

+0

你为什么要在循环中执行语句? SQL通常在集合中更好。 –

+0

没有特定的原因。 SQL查询返回的数据将在循环内部修改。我必须应用各种转换规则,并且我认为通过记录处理记录的结果给了我对数据的很多控制权。因此使用如上所述的方法。 – Abhi

你有两个问题。首先,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

最后我得到了这个东西的工作。解决方案非常简单。它将移除括号,如下所示。

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子句的任何其他正常查询,它都可以工作。