根据条件进行表的更新,操作在两个表进行
UPDATE 
           MES.TEDAD010 B
       SET 
       CONVERT_FLG='1',
       OperateDT1 = PEDAB009_GET_OPERATE_DT(Spare1_01, Device_ID1),
       Floor_CD1 = pedab009_get_floor_cd(Device_ID1),
       Organization_CD1 = pedab009_get_organization_cd(Device_ID1)
       WHERE 
       EXISTS
       (
          SELECT 1 
          FROM TEDAM010 A          
          WHERE
          A.KEY3(+) = B.Device_ID1 AND                                    
          A.JOB_CD = 'EDA' AND
          A.KEY1 = '100' AND
          A.KEY2 = '110' AND
          B.CONVERT_FLG='0'                                       
       )
       AND CONVERT_FLG='0';
其中PEDAB009_GET_OPERATE_DT,pedab009_get_floor_cd,pedab009_get_organization_cd都是函数pedab009_get_floor_cd的内容(其他两个函数也类似):
SELECT 
          BODY2 
     INTO 
          RET_FLOOR_CD 
     FROM 
          TEDAM010
     WHERE
          JOB_CD = 'EDA' AND
          KEY1 = '100' AND
          KEY2 = '110' AND
          KEY3 = V_DEVICE_ID;  如果TEDAD010表有5000条数据的话,用时8秒左右,有什莫办法提高效率吗

解决方案 »

  1.   

    我劝你最好你这段程序用存储过程来完成,使用cursor效率会好一些还有最好不要使用左连接,那个太耗时间了
      

  2.   

    我是用存储过程和函数来做的,耗时4秒,TEDAM010表中 JOB_CD,KEY1 , KEY2 ,KEY3我建了索引,效果看不出。使用游标效率会高一些吗
      

  3.   

    你这样相当于3个子查询,你看看用表连接来更新,类似update 表1 set 字段=b.字段 from 表1 a ,表2 b on a.字段=b.字段
      

  4.   

    ORACLE 不支持update 表1 set 字段=b.字段 from 表1 a ,表2 b on a.字段=b.字段这种语法吧。
      

  5.   

    你可以把三个子查询合并,类似
    create table t1(f1 int, f2 int,f3 int);
    create table t2(f1 int, f2 int,f3 int);insert into t1 values(1,2,2);
    insert into t1 values(2,3,3);
    insert into t2 values(1,3,5);
    insert into t2 values(3,4,6);
    update t1  set (f2,f3)=(select f2,f3 from t2 where f1=t1.f1)
           where exists(select 1 from t2 where f1=t1.f1);
           
    select * from t1;drop table t1;
    drop table t2;
    /*
    F1 F2 F3
    1 3 5
    2 3 3
    */
      

  6.   

    自己解决了。方法和jinjazz 得差不多