Oracle SQL / PL / SQL:循环中的'update'失败

时间:2012-12-04 15:06:26

标签: sql loops plsql sql-update

情况就是这样:我在Oracle SQL DB中有一个表。该表用于报告目的。这是一个测试/开发环境。 我想在使用此数据库的报告工具中测试新的分组功能,但我必须更新并替换所有“数字”(不是该表的密钥)。 几个数据集可以共享相同的“数字”。更新后的数字应遵循某种模式进行自动测试。我想到了一个类似于每个新数字增加的整数。 所以这是我到目前为止所做的: 首先,我查询该表中的所有唯一“数字”,然后循环结果表以替换生成的“new_number”中找到的每个“数字”。然后'new_number'增加1,然后在实时表中交换结果表的下一个“数字”,依此类推。

以下是代码:

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;

现在的问题是,脚本运行但是我被告知只有一行更新(最后一行,似乎)。

为什么?

我可以放一个

DBMS_OUTPUT.PUT_LINE(entry.number);

在循环内部,它将显示每次迭代在TABLE中找到的所有唯一数字,因此循环本身似乎正在工作。

只是mabye ......有没有办法在没有循环的情况下做到这一点?无法想出任何东西。

这个脚本只会在准备测试运行时执行一次(一旦它起作用)。

非常感谢我的进步!

2 个答案:

答案 0 :(得分:3)

Quoting oracle docs

  

%FOUND:如果是INSERT,UPDATE或DELETE语句,则返回TRUE   受影响的一行或多行或SELECT INTO语句返回一个或   更多行。否则,它返回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;

答案 1 :(得分:1)

实际上,你们所有人都是对的 - 就像我在第一时间一样。无论如何,谢谢你的回答,我很感激!

我正在使用的DBMS(Hora)配置为手动确认每次更改。每次迭代都会“覆盖”确认/提交的提示,并且只询问发生的最后一次更改。 我把它改变了,脚本运行并完成它现在应该做的事情。 虽然Hora仍然只显示要更改的一行,但它在提交时会更改所有行。

再次感谢。