0

"With" 句を含む非常に複雑なクエリがあります。このクエリは、DB2 クライアントで実行すると正常に機能します。ただし、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

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 で実行されるという主張は真実ではありません。

于 2013-12-09T22:10:07.643 に答える