如何更新 table Oracle PLSQL 中的每一行
How to update each row in a table Oracle PLSQL
如何创建一个程序来验证 table 的每一行并根据已建立的语句更新字段?
我有 4 个工作领域
SYS_UPDATE_PING
UPDATE_PING
PING_STATUS
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 处理速度更快。
如何创建一个程序来验证 table 的每一行并根据已建立的语句更新字段? 我有 4 个工作领域
SYS_UPDATE_PING
UPDATE_PING
PING_STATUS
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 处理速度更快。