0

これが状況です。OracleSQLDBにテーブルがあります。そのテーブルは、レポートの目的で使用されます。これはテスト/開発環境です。このDBを使用してレポートツールで新しいグループ化機能をテストしたいのですが、すべての「番号」を更新して置き換える必要があります(そのテーブルのキーではありません)。複数のデータセットが同じ「番号」を共有できます。更新された番号は、自動テスト可能であるために特定のパターンに従う必要があります。新しい数字ごとに増加する整数のようなものを考えました。これまでに行ったことは次のとおりです。最初に、そのテーブル内のすべての一意の「数値」をクエリし、次に結果テーブルをループして、見つかった「数値」のそれぞれを生成された「new_number」に置き換えます。次に、「new_number」を1つ増やしてから、次の「number」を取得します。

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

DECLARE
    Cursor MyCursor IS
        SELECT DISTINCT NUMBER
            FROM TABLE
            ORDER BY NUMBER;

    entry MyCursor%ROWTYPE;
    new_number NUMBER := 111111;

    BEGIN
    FOR entry IN MyCursor LOOP
        IF MyCursor%FOUND THEN
            UPDATE TABLE
                SET
                NUMBER = new_number,
                WHERE  NUMBER = ENTRY.NUMBER;
        new_number := new_number + 1;
        ELSIF myCursor%NOTFOUND THEN
             EXIT;
        END IF;
    END LOOP;
END;

問題は、スクリプトが実行されることですが、更新された行は1つだけであると言われています(最後の行のようです)。

何故ですか?

私は置くことができます

DBMS_OUTPUT.PUT_LINE(entry.number);

ループ内にあり、反復ごとにTABLEで見つかったすべての一意の番号が表示されるため、ループ自体が機能しているように見えます。

そして、ただmabye ...ループなしでそれを行う方法はありますか?何も思いつかなかった。

このスクリプトは、テスト実行の準備として1回だけ(動作するとすぐに)実行されます。

よろしくお願いします!

4

2 に答える 2

3

オラクルドキュメントの引用

%FOUND:INSERT、UPDATE、またはDELETEステートメントが1つ以上の行に影響を与えた場合、またはSELECT INTOステートメントが1つ以上の行を返した場合、TRUEを返します。それ以外の場合は、FALSEを返します。

あなたは本当にカーソルの挿入、更新、削除をチェックする必要がありますか?

あなたが探しているようです:

FOR entry IN MyCursor LOOP

    UPDATE TABLE
            SET
            NUMBER = new_number,
            WHERE  NUMBER = ENTRY.NUMBER;
    new_number := new_number + 1;

END LOOP;

または

FOR entry IN MyCursor LOOP

    UPDATE TABLE
            SET
            NUMBER = new_number,
            WHERE  NUMBER = ENTRY.NUMBER;
    IF SQL%FOUND THEN
       new_number := new_number + 1;
    END IF;
END LOOP;
于 2012-12-04T15:38:48.983 に答える
1

実際、皆さんは正しかった-そもそも私もそうだった。とにかくあなたの答えをありがとう、私はそれを感謝します!

私が使用しているDBMS(Hora)は、すべての変更を手動で確認するように構成されています。反復するたびに、確認/コミットするプロンプトを「上書き」し、最後に発生した変更のみを要求しました。私はそれを変更してもらい、スクリプトが実行され、現在想定されていたことを実行します。Horaはまだ変更する行を1つしか表示しませんが、コミットするとすべての行が変更されるようになりました。

再度、感謝します。

于 2012-12-04T16:06:58.167 に答える