将FOR..LOOP中的多个UPDATE转换为单个SELECT / UPDATE语句

时间:2013-01-23 12:11:13

标签: sql plsql oracle11g

如果可能的话,我想将以下PL / SQL语句优化为单个SELECT+UPDATE SQL语句。

--Key is a VARCHAR2, Value is a CLOB
FOR Pair IN (select Key, Value from PairTable) 
LOOP           
  update UpdatableTable
  set CLOBColumn = CLOBColumn || Pair.Value
  where ID in
    (select ID from UpdatableTable
    where CONTAINS("indexedcolumns", '{' || Pair.Key || '}') > 0); 
  commit;
END LOOP;

问题是我需要在同一个UPDATE的{​​{1}}子句中使用WHERE的{​​{1}}子句的部分结果。从概念上讲,我想首先UPDATE SET中的所有ID。然后使用SELECT字符串查看它是否包含在PairTable中。然后将Key字符串(与前面提到的UpdatableTable字符串相对应)设置为Value的{​​{1}}。

2 个答案:

答案 0 :(得分:1)

至少在PLSQL中使用FORALL

答案 1 :(得分:0)

you can use the below update statements

update UpdatableTable
  set CLOBColumn = CLOBColumn || Value from PairTable
  where ID in
    (select ID from UpdatableTable
    where CONTAINS("indexedcolumns", '{' || Pair.Key || '}') > 0); 

or

update UpdatableTable
  set CLOBColumn = CLOBColumn || b.Value from  (select Key, Value from PairTable) b
  where ID in
    (select ID from UpdatableTable
    where CONTAINS("indexedcolumns", '{' || Pair.Key || '}') > 0);