1

このエラーが発生するのはなぜですか。また、ステートメントが解析されないということはどういう意味ですか。

 ORA-01003: no statement parsed 

コードは次のとおりです。

PROCEDURE ORIGINAL_TABLE.UPDATE_GROUPS   IS
-- cursor loaded with the swam groups
CURSOR cursor1 IS
    SELECT ID, NEW_DESCRIPTION
    FROM NEW_TABLE.NEW_GROUP_TABLE@DB_LINK.X;

BEGIN
    FOR C1_REC IN cursor1 LOOP
        UPDATE
            ORIGINAL_TABLE."GROUPS"
        SET
            GROUP_ID = C1_REC.ID
        WHERE
            ORIGINAL_TABLE."GROUPS".DESCRIPTION = C1_REC.NEW_DESCRIPTION;

        IF (SQL%ROWCOUNT = 0) THEN
           INSERT INTO
                  ORIGINAL_TABLE.GROUPS("GROUP_ID", "DESCRIPTION")
           VALUES (C1_REC.ID, C1_REC.NEW_DESCRIPTION);
        END IF;

    END LOOP;

    EXCEPTION
    WHEN OTHERS THEN
         dbms_output.put_line(SQLERRM);
END;

上記のコードで私がやろうとしているのは、古いテーブルを新しいテーブルの値で更新し、新しいグループが存在しない場合はそれを挿入することです。

更新:%ROWCOUNT = 0の場合に%ROWCOUNT>0を変更

4

1 に答える 1

5

MERGEステートメントを使用してください。更新/挿入がより効率的に行われ、plsqlが意図したものを提供していないことに注意してください。更新ステートメントを作成しようとし、レコードが見つかった場合は別のレコードを挿入します。これを修正するには、IF(SQL%ROWCOUNT = 0)を使用します。問題の原因は。であると推測されます。DBLINK名で。

さらに、スキーマ名だけでなく、万が一の場合に備えて、テーブル/フィールドの引用符を削除することをお勧めします。

別の言葉はすべてのORIGINAL_TABLEを削除します。

merge into groups g
using (
SELECT ID, NEW_DESCRIPTION
FROM NEW_TABLE.NEW_GROUP_TABLE@DB_LINK.X
) nt
on (nt.NEW_DESCRIPTION = g.description  )
when matched then update set g.group_id = nt.id
when non matched then insert(GROUP_ID, DESCRIPTION)
                      values(nt.id, nt.NEW_DESCRIPTION)
于 2012-09-03T19:18:21.333 に答える