0

我有一个非常复杂的查询,其中包含一个“With”子句。在 DB2 Client 上执行该查询时可以正常工作。但是,如果在 PL SQL 存储过程的 For 循环游标内使用相同的查询,则它不起作用。在尝试将存储过程应用于数据库时,它会给出如下所示的语法错误。

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;

你能帮忙解决这个问题吗?提前致谢。

4

2 回答 2

0

最后我得到了这个东西。解决方案相当简单。它是删除包围查询的大括号,如下所示。

 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 子句的普通查询。

于 2013-12-11T18:29:33.083 回答
0

你有两个问题。一、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 中执行是不正确的。

于 2013-12-09T22:10:07.643 回答