如何使这个pl / sql游标更有效?

时间:2014-05-30 23:57:51

标签: sql oracle plsql

大家好我有一个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;                             

问题基本上是如何在考虑到该领域的条件的情况下更新一个特定记录的字段。问题是,如果条件适用于记录中的许多字段,则更新可以在同一记录中多次发生。

...谢谢

3 个答案:

答案 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;

我不认为有更有效的方法可以做到这一点。