当前位置:   article > 正文

[oracle存储过程]统一修改数据库中的sequence当前值_plsql中批量将sequence当前值加上100

plsql中批量将sequence当前值加上100

一、问题描述

现在需要将数据库中的所有sequence的当前值增加1000。

编写一个存储过程,传入1000,将所有sequence的值增加1000;若传入-1000,将所有的sequence的值减少1000。

二、实现功能

先写一个临时测试的过程,

  1. declare
  2. seq_name varchar2(100);
  3. l_currval number; --序列的当前值
  4. cursor seq_cur is
  5. select ur.sequence_name from user_sequences ur;--将当前数据库所有序列的名称存放到游标中
  6. begin
  7. --dbms_output.enable(buffer_size=>null);
  8. open seq_cur;
  9. fetch seq_cur into seq_name;
  10. loop
  11. exit when not seq_cur%found;
  12. --修改数据库序列的下限
  13. execute immediate 'alter sequence '||seq_name||' minvalue -5000';
  14. --需要变化的数量
  15. execute immediate 'alter sequence '||seq_name||' increment by 1000';
  16. --给序列取下一个数
  17. execute immediate 'select '||seq_name||'.nextval from dual' into l_currval;
  18. --将序列的递增情况,恢复为按1递增
  19. execute immediate 'alter sequence '||seq_name||' increment by 1';
  20. --将数据库序列的下限修改为1
  21. execute immediate 'alter sequence '||seq_name||' minvalue 1';
  22. --dbms_output.put_line(l_currval);
  23. fetch seq_cur into seq_name;
  24. end loop;
  25. close seq_cur;
  26. end;

经过测试,发现所有的序列值都增加了1000。

代码说明:

注意上面代码的第19行,在给序列取下一个值时,写的是

execute immediate 'select '||seq_name||'.nextval from dual' into l_currval;

那如果写成:

execute immediate 'select '||seq_name||'.nextval from dual'

不是更简单吗?经过实际测试,发现如果不把值赋给一个变量的话,该存储过程运行完,sequence的当前值不会发生变化。

(虽然我们在手动执行select 序列名.nextval from dual时会有效果)

原因我也不清楚,如果有知道其中缘由的,欢迎提供分享。


将以上过程改写成可以重复调用的存储过程,代码如下:

  1. create or replace procedure updateAllSeqVal(varNum number) is
  2. seq_name varchar2(100);
  3. l_currval number; --序列的当前值
  4. cursor seq_cur is
  5. select ur.sequence_name from user_sequences ur;--将当前数据库所有序列的名称存放到游标中
  6. begin
  7. --dbms_output.enable(buffer_size=>null);
  8. open seq_cur;
  9. fetch seq_cur into seq_name;
  10. loop
  11. exit when not seq_cur%found;
  12. --dbms_output.put_line(seq_name);
  13. --修改数据库序列的下限
  14. execute immediate 'alter sequence '||seq_name||' minvalue -5000';
  15. --需要变化的数量
  16. execute immediate 'alter sequence '||seq_name||' increment by '||varNum;
  17. --给序列取下一个数
  18. execute immediate 'select '||seq_name||'.nextval from dual' into l_currval;
  19. --execute immediate 'select '||seq_name||'.nextval from dual' into l_currval;
  20. --将序列的递增情况,恢复为按1递增
  21. execute immediate 'alter sequence '||seq_name||' increment by 1';
  22. --将数据库序列的下限修改为1
  23. execute immediate 'alter sequence '||seq_name||' minvalue 1';
  24. --dbms_output.put_line(l_currval);
  25. fetch seq_cur into seq_name;
  26. end loop;
  27. close seq_cur;
  28. end;

调用过程,使当前连接数据库中的所有sequence的当前值都统一增加1000:

  1. begin
  2. updateAllSeqVal(1000);
  3. end;

查看所有序列的当前情况(主要看last_number一列):

select * from user_sequences;


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/816632
推荐阅读
相关标签
  

闽ICP备14008679号