我试图在游标的帮助下重写表中的值,但没有成功。例如,在表测试我需要重写值'N'在列酒精'NO'。有人能给我一些建议吗?
DECLARE
CURSOR kurzor IS SELECT * FROM testik ORDER BY datum DESC;
ttest kurzor%ROWTYPE;
BEGIN
FOR ttest IN kurzor LOOP
IF (ttest.alcohol = 'N') THEN
INSERT INTO testik(alcohol) VALUES ('NO');
END IF;
END LOOP;
END;
/
当我运行脚本时,它将返回过程成功完成,但没有更改表测试。
当你正在学习游标之类的东西时,这里有一个你可能会考虑的选择。
样本表:
SQL> select * from testik;
ID ALC
---------- ---
1 Y
2 N --> should be updated to NO
3 YES
4 NO
5 N --> should be updated to NO
游标只获取你感兴趣的行;如果您不想对alcohol
列值与N
不同的行做任何操作,那么循环遍历整个表是没有意义的。
注意,它被声明为for update
,所以你可以用where current of
子句来使用update
;它会更新你刚刚获取的行
我还显示了更新的行数(你没有要求,但这样做没有害处)。
SQL> set serveroutput on;
SQL> declare
2 cursor c1 is select id, alcohol
3 from testik
4 where alcohol = 'N'
5 order by id
6 for update;
7 c1r c1%rowtype;
8 l_cnt number := 0;
9 begin
10 open c1;
11 loop
12 fetch c1 into c1r;
13 exit when c1%notfound;
14
15 update testik set
16 alcohol = 'NO'
17 where current of c1;
18 l_cnt := l_cnt + 1;
19 end loop;
20 close c1;
21 dbms_output.put_line('Updated ' || l_cnt || ' row(s)');
22 end;
23 /
Updated 2 row(s)
PL/SQL procedure successfully completed.
结果:
SQL> select * from testik;
ID ALC
---------- ---
1 Y
2 NO
3 YES
4 NO
5 NO
SQL>
非常令人困惑,我只能提供一个有根据的猜测。你的解释听起来好像你想要更新,但你的代码实际上插入。
也许你想做的实际上只是:
UPDATE testik SET alcohol = 'NO' WHERE alcohol = 'N';
COMMIT;
PS:简单的更新不需要PL/SQL。