PL/SQL使用游标重写表中的值



我试图在游标的帮助下重写表中的值,但没有成功。例如,在表测试我需要重写值'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。

最新更新