0

情况是这样的:我在 Oracle SQL DB 中有一个表。该表用于报告目的。这是一个测试/开发环境。我想使用这个数据库在我们的报告工具中测试一个新的分组功能,但是我必须更新和替换所有的“数字”(不是那个表的关键)。几个数据集可以共享相同的“数字”。更新后的数字应遵循某种模式以进行自动测试。我想到了一个整数,每个新数字都会增加一个整数。所以这是我到目前为止所做的事情:首先我查询该表中所有唯一的“数字”,然后我循环遍历结果表以用生成的“new_number”替换找到的每个“数字”。然后 'new_number' 加一,然后再取下一个 '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;

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

这是为什么?

我可以放一个

DBMS_OUTPUT.PUT_LINE(entry.number);

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

只是mabye ...有没有办法在没有循环的情况下做到这一点?什么都想不出来。

在准备测试运行时,该脚本将只执行一次(一旦工作)。

非常感谢我提前!

4

2 回答 2

3

引用 oracle 文档

%FOUND:如果 INSERT、UPDATE 或 DELETE 语句影响了一行或多行,或者 SELECT INTO 语句返回了一行或多行,则返回 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 仍然只显示要更改的一行,但它现在在提交时会更改所有行。

再次感谢。

于 2012-12-04T16:06:58.167 回答