大家好我有一个pl / sql游标,执行时间太长。我想知道如何制作相同的过程,但具有更好的性能和可能更好的代码。我是PL / SQL的新手。
Declare
Cursor Cursor1 is
select * from table1 where
field1 IS NULL
or
field2 IS NULL or field3 IS NULL or field4 is null or field5 IS NULL or field6 IS NULL;
Begin
For i in Cursor1 loop
if i.field1 IS NULL then
update table1 set field1=0 where recordId=i.recordId;
end if;
if i.field2 IS NULL then
update table1 set field2=0 where recordId=i.recordId;
end if;
if i.field3 IS NULL then
update table1 set field3=0 where recordId=i.recordId;
end if;
if i.field4 IS NULL then
update table1 set field4=0 where recordId=i.recordId;
end if;
if i.field5 IS NULL then
update table1 set field5=0 where recordId=i.recordId;
end if;
if i.field6 IS NULL then
update table1 set field6=0 where recordId=i.recordId;
end if;
End loop;
End;
问题基本上是如何在考虑到该领域的条件的情况下更新一个特定记录的字段。问题是,如果条件适用于记录中的许多字段,则更新可以在同一记录中多次发生。
...谢谢
答案 0 :(得分:3)
可以对一个UPDATE
UPDATE table1 SET
field1 = COALESCE(field1, 0)
, field2 = COALESCE(field2, 0)
, field3 = COALESCE(field3, 0)
, field4 = COALESCE(field4, 0)
, field5 = COALESCE(field5, 0)
, field6 = COALESCE(field6, 0)
WHERE field1 IS NULL OR field2 IS NULL OR field3 IS NULL
OR field4 IS NULL OR field5 IS NULL OR field6 IS NULL
答案 1 :(得分:3)
以下是对此的另一种看法:
UPDATE TABLE1
SET FIELD1 = NVL(FIELD1, 0),
FIELD2 = NVL(FIELD2, 0),
FIELD3 = NVL(FIELD3, 0),
FIELD4 = NVL(FIELD4, 0),
FIELD5 = NVL(FIELD5, 0),
FIELD6 = NVL(FIELD6, 0);
基本原理:执行此更新的任何查询都会进行全表扫描,因为它正在寻找NULL,在通常的情况下不会被索引,即使它们被索引,优化器也很可能会无论如何选择全表扫描。为什么浪费时间检查六个不同的字段是否为NULL?
分享并享受。
答案 2 :(得分:0)
尝试执行这样的几个更新,避免使用游标:
update table1 set field1=0 where field1 IS NULL;
update table1 set field2=0 where field2 IS NULL;
update table1 set field3=0 where field3 IS NULL;
update table1 set field4=0 where field4 IS NULL;
update table1 set field5=0 where field5 IS NULL;
update table1 set field6=0 where field6 IS NULL;
我不认为有更有效的方法可以做到这一点。