For loop 在DB2PLSQL的For循环游标中使用“with”子句进行查询

For loop 在DB2PLSQL的For循环游标中使用“with”子句进行查询,for-loop,cursor,db2,with-clause,sql-pl,For Loop,Cursor,Db2,With Clause,Sql Pl,我有一个非常复杂的查询,其中包含With子句。在DB2客户机上执行此查询时效果良好。但是,如果在PL SQL存储过程的For循环游标中使用相同的查询,则该查询不起作用。尝试将存储过程应用于数据库时,会出现如下所示的语法错误 SQL0104N An unexpected token "AS" was found following "col5 ) FOR records AS cursors CURSOR FOR ( WITH temp1 ( col

我有一个非常复杂的查询,其中包含With子句。在DB2客户机上执行此查询时效果良好。但是,如果在PL SQL存储过程的For循环游标中使用相同的查询,则该查询不起作用。尝试将存储过程应用于数据库时,会出现如下所示的语法错误

SQL0104N  An unexpected token "AS" was found following "col5 )
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 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循环如下所示

SQL0104N  An unexpected token "AS" was found following "col5 )
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 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中执行是不真实的。

最后我让它工作起来了。解决办法相当简单。要删除包含查询的大括号,如下所示

SQL0104N  An unexpected token "AS" was found following "col5 )
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 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子句的普通查询。

与我在这里使用的for循环类似,DB2隐式创建了一个游标,我可以在其上循环。我不需要明确声明。对于我所写的查询,我试图缩小问题范围,而不是编写确切的查询。当然,在我上面的查询中,with子句后面有一个select。请检查我的编辑,让我知道它现在是否有意义。查询仍然无效,FOR语句语法仍然错误。您可能需要检查手册中这两种语言的语法是否正确。我在下面的链接中使用了相同的for循环结构。它确实可以毫无问题地工作。还有什么不对劲吗。为什么要在循环中执行该语句?SQL通常更擅长在集合中工作。没有具体的原因。SQL查询返回的数据将在循环内修改。我必须应用各种转换规则,我认为逐条记录处理结果可以让我更好地控制数据。因此,使用如上所述的方法。