如何更新 table Oracle PLSQL 中的每一行

How to update each row in a table Oracle PLSQL

如何创建一个程序来验证 table 的每一行并根据已建立的语句更新字段? 我有 4 个工作领域

  1. SYS_UPDATE_PING
  2. UPDATE_PING
  3. PING_STATUS
  4. TIME_OUT_PING

这是我的代码:

create or replace procedure SP_DASHBOARD_PINGSTATUS is
begin
  declare
  sp_ping_final number;
  BEGIN
        Update rsmes.tb_op_pc_monitoring_v4 t
         set t.sys_update_ping = sysdate;
   for c in (select ((SYS_UPDATE_PING - UPDATE_PING)*60*60*24) as PING_RESULT into sp_ping_final from TB_OP_PC_MONITORING_V4)
     loop
       sp_ping_final := c.ping_result;
       if c.ping_result <= 5 then
        Update rsmes.tb_op_pc_monitoring_v4 tg
        set tg.ping_status = 'OK',
            tg.time_out_ping = sp_ping_final;
       else
        Update rsmes.tb_op_pc_monitoring_v4 tn
        set tn.ping_status = 'NG',
            tn.time_out_ping = sp_ping_final;
        end if;
       end loop;
        commit;
  END;
end SP_DASHBOARD_PINGSTATUS;

我在 SYS_UPDATE_PING 和 UPDATE_PING 之间设置了时间差,如果以秒为单位的结果小于 5,则必须将 PING_STATUS 字段更新为 OK 并将秒差放入TIME_OUT_PING,否则会更新 NG 并将秒差放入 TIME_OUT_PING, 我希望它在每一行上进行比较,但它会在所有字段上更新我,而不是一个一个地更新。

我知道我忘记了什么,但你能帮我找到我的错误并知道解决办法吗? 谢谢

那是因为 UPDATE 语句缺少 WHERE 子句。没有它,您总是在更新 table.

中的所有行

这意味着游标应该包含某种 ID,您将在 UPDATE 中重用它。例如:

for c in (select id,                            --> this
                ((sys_update_ping - ...)
         ) loop
  ...
  update tb_op_pc_monitoring_v4 tg set
    tg.ping_status = 'OK'
    where tg.id = c.id;                         --> this
  ...
end loop;

此外,您没有 SELECT INTO 光标。完全删除 sp_ping_final


最后,我要说的是您根本不需要 PL/SQL(尤其是循环)。你写的整个代码可以改写成一个

UPDATE tb_op_pc_monitoring_v4 tg
   SET tg.ping_status =
          CASE
             WHEN (SYSDATE - tg.update_ping) * 60 * 60 * 24 <= 5 THEN 'OK'
             ELSE 'NG'
          END,
       tg.time_out_ping = (SYSDATE - tg.update_ping) * 60 * 60 * 24;

这应该比您的 row-by-row 处理速度更快。