Oracle修改序列值为ID最大值;动态SQL修改序列值;

场景描述:

       在使用kettle、plsql等工具导数据到数据库后,因为导入的数据有id,而我的表的id使用的是序列,所以需要将序列当前值设置为id的最大值,下一次项目调用的时候自动使用序列的下一个值,避免重复报错。

       因为修改序列的语句中无法将变化值使用sql语句或者是加减,所以只能手动的去算差值然后在设置,很麻烦,类似于下面的sql就会报错,好像是这样直接运行,最后的参数只能是纯数字。但是存储过程可以。

注:网上找了很久,修改序列,只能通过设置变化值(可正可负),然后取序列的下一个值,然后设置回原来的自增1。无法直接设置为具体的某个值。

错误写法:
alter sequence SEQ_ACC_DIC_FEE_CLASSIFY increment BY (select max(id) from ACC_DIC_FEE_CLASSIFY);

解决办法:

      想到能否像java那样写一个方法,直接调用,那我就省很多事了,调用一下就得到我想要的效果,然后去查了方法和存储过程(以前接触过存储过程,没有深入研究,只是简单用了一下,作为开发人员,居然没仔细研究,愧疚中)

定义:
所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过
编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数
来调用并执行它,从而完成一个或一系列的数据库操作。

       存储过程几种使用方法以及如何调用参考地址:https://www.cnblogs.com/Zeros/p/8081080.html

       Plsql创建存储过程以及如何测试参考地址:https://blog.csdn.net/news_out/article/details/82999261

       存储过程中alter语句的使用需要主要的问题参考地址:https://bbs.csdn.net/topics/70021296

       我的存储过程代码(无论是当前id大于最大值还是小于最大值,都会设置为当前已有数据的最大id):

create or replace procedure update_seq(v_table_name in varchar2,v_seq_name in varchar2) is
  --id最大值
  v_max int;
  --序列当前值
  v_seq_val int;
  --查询id最大值的sql字符串
  selectIdMaxStr VARCHAR2 (500) := 'select max(id) from ' || v_table_name;
  --查询seq下一个值的sql字符串
  selectSeqValStr VARCHAR2 (500) :='select ' || v_seq_name || '.NEXTVAL from dual' ;
begin
  EXECUTE IMMEDIATE selectIdMaxStr into v_max;
  --未修改前的序列下一个值
  EXECUTE IMMEDIATE selectSeqValStr into v_seq_val;
  EXECUTE IMMEDIATE 'alter sequence '|| v_seq_name ||' increment BY '|| (v_max - v_seq_val);
  --修改后的的序列取下一个值
  EXECUTE IMMEDIATE selectSeqValStr into v_seq_val;
  --修改为原来的1
  EXECUTE IMMEDIATE 'alter sequence '|| v_seq_name ||' increment BY 1';
  DBMS_OUTPUT.put_line(v_table_name||' 的序列 '||v_seq_name||' 已设置为 '|| v_seq_val);
end update_seq;

       我的调用:

begin
  -- Call the procedure
  update_seq('DIC_STANDARD_FEE','SEQ_DIC_STANDARD_FEE');
end;

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值