情况就是这样:我在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 ......有没有办法在没有循环的情况下做到这一点?无法想出任何东西。
这个脚本只会在准备测试运行时执行一次(一旦它起作用)。
非常感谢我的进步!
答案 0 :(得分:3)
%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仍然只显示要更改的一行,但它在提交时会更改所有行。
再次感谢。