首页 > 解决方案 > PL/SQL 通过游标更新行值

问题描述

我是 pl/sql 的新手,我被卡住了。我有一个由 3 列组成的表:package_uid、csms_package_id 和 flag。前两列已填满,第三列为空。当以过程比较该表和另一个表中的 package_id-s 的方式调用过程时,标志列被填充,如果它们匹配,则标志应为“是”。这是我的代码:

DECLARE
  package_uid varchar2(256);
  CURSOR abc IS SELECT csms_package_id, PACKAGE_UID, FLAG FROM table1 tpc;
  CURSOR defg IS SELECT package_id FROM table2 tpc2;
BEGIN
  for i in abc  loop
    for j in defg loop
      begin
        if i.CSMS_PACKAGE_ID=j.package_id THEN
          i.flag := 'YES' ;
          DBMS_OUTPUT.PUT_LINE(i.flag);
        end if;
      end;
    end loop;
  end loop;

end;

输出写入“是”正确次数,但我的表未使用“是”值更新。如何更新表中的标志值?

标签: sqloracleplsqlplsql-package

解决方案


你没有更新任何东西;如果你想这样做,你必须使用UPDATEorMERGE声明。

不过,为什么要使用 PL/SQL 以及为什么要使用嵌套循环?这看起来非常低效。一个简单的单一的merge怎么样?

MERGE INTO table1 a
     USING table2 b
        ON (a.package_uid = b.package_id)
WHEN MATCHED
THEN
   UPDATE SET a.flag = 'YES';

推荐阅读