在pl \ sql中自动执行大量更新查询

时间:2014-11-03 12:13:12

标签: oracle plsql

在频繁的一段时间内,我正在使用连续值更新少数表的相同过程。希望在下面举一个简单的例子,

UPDATE   Table_1 SET   vchar_val = REPLACE (vchar_val, '.360/', '.370/'),
      WHERE   vchar_val LIKE 'http://services%.360/%'
     AND c_version IN ('ALL', 'N/A', '37.0'); 

对于第37版,我将替换“36'与' 37'同样的我会为38'做并且它继续......这让我感到烦恼和耗费时间过程,因为对于我手动编辑所有更新查询的不同表格,我有50个这样的记录。

所以我计划编写一个调度程序,我可以通过提供输入作为先前版本和当前版本来触发每个版本,其中我将把所有这些更新查询。

我来到的地方,如果我通过提供版本值作为输入,我应该将本地参数引入存储。我如何将本地变量分配给我的更新脚本。??????

我将连接文本连接到

  REPLACE (vchar_val, '.'+ @PrevVersion  +'/', '.'+ @CurrentVersion  +'/')

PrevVer **& CurrentVer **是我的局部变量,其值为.360& .370 resp。

我想我在这个代码片段中错过了一段代码,因为我在运行此代码时遇到错误。

请帮助我们重新排列此代码以自动执行查询或您的评论以任何其他方式完成此工作...

谢谢

-VIno

2 个答案:

答案 0 :(得分:0)

本地变量:

declare
  my_local_valiable number;
begin
  update my_table ... ;
  commit;
end;

自动增量:sequence

update table_1 set my_field = '.' || my_sequence.nextval where ...;

UPD

  1. 数字始终位于相同位置(例如,字符串中的2位数,第10位和第11位符号):

    update table_1 set my_field = substr(my_field, 1, 9) || to_char(to_number(substr(my_field, 10, 2)) + 1) || substr(my_field, 12);

  2. 这会转换字符串' abracadab29ra'到' abracadab30ra'。 与replace相同:

    update table_1 set my_field = replace(my_field, substr(my_field, 10, 2), to_char(to_number(substr(my_field, 10, 2)) + 1));
    
    1. 数字始终跟在字符串'value = '之后,并且有两位数字:

      update table_1 set my_field = replace(my_field, substr(my_field, instr(my_field, 'value = ', 1) + 8, 2), to_char(to_number(substr(my_field, instr(my_field, 'value = ', 1) + 8, 2)) + 1))

    2. 这会转换字符串'我的值= 33'我的价值= 34'。

答案 1 :(得分:0)

begin 
  for i in 36 .. 50 loop
    UPDATE   Table_1 
    SET vchar_val = REPLACE (vchar_val, '.'|| i ||'0/', '.'|| i+1 ||'0/')
    WHERE vchar_val LIKE 'http://services%.'|| i ||'0/%'
    AND c_version IN ('ALL', 'N/A', i+1 ||'.0'); 
  end loop;
end;

当然你可以用一些花哨的reg_exp在一次更新中做到这一点,但我把这个练习留给另一个伙伴stackoverflower:)