• oracle之序列问题集


    创建语句

    create sequence REQ_Name
    increment by 1 
    start with 1
    maxvalue 99999 
    cycle 
    nocache;

    重置序列(不删除重建方式)

    Oracle中一般将自增sequence重置为初始1时,都是删除再重建,这种方式有很多弊端,依赖它的函数和存储过程将失效,需要重新编译。

    不过还有种巧妙的方式,不用删除,利用步长参数,先查出sequence的nextval,记住,把递增改为负的这个值(反过来走),然后再改回来。

    假设需要修改的序列名:seq_name

    1、select seq_name.nextval from dual; //假设得到结果5656

    2、 alter sequence seq_name increment by -5655; //注意是-(n-1)

    3、 select seq_name.nextval from dual;//再查一遍,走一下,重置为1了

    4、 alter sequence seq_name increment by 1;//还原

    可以写个存储过程,以下是完整的存储过程,然后调用传参即可:

    create or replace procedure seq_reset(v_seqname varchar2) as n number(10);
    tsql varchar2(100);
     begin
     execute immediate 'select '||v_seqname||'.nextval from dual' into n;
      n:=-(n-1);
      tsql:='alter sequence '||v_seqname||' increment by '|| n;
      execute immediate tsql;
     execute immediate 'select '||v_seqname||'.nextval from dual' into n;
      tsql:='alter sequence '||v_seqname||' increment by 1';
     execute immediate tsql;
     end seq_reset;

    序列为什么不是从1开始

    问题原因:

    ·当我们使用序列作为插入数据时,如果使用了“延迟段”技术,则跳过序列的第一个值

    ·Oracle从 11.2.0.1版本开始,提供了一个“延迟段创建”特性:

    当我们创建了新的表(table)和序列(sequence),
    在插入(insert)语句时,序列会跳过第一个值(1)。
    所以结果是插入的序列值从 2(序列的第二个值) 开始, 而不是 1开始。

    想要解决这个问题有两种方法:
    更改数据库的“延迟段创建”特性为false(需要有相应的权限)

    ALTER SYSTEM SET deferred_segment_creation=FALSE;
    或者
    在创建表时让seqment立即执行,如:

    CREATE TABLE tbl_test(
    test_id NUMBER PRIMARY KEY,
    test_name VARCHAR2(20)
    )
    SEGMENT CREATION IMMEDIATE;

  • 相关阅读:
    maven笔记
    enum笔记
    mysql笔记
    git笔记
    spark笔记
    使用GitHub进行团队合作
    深度学习网站
    顶级论文索引网站
    研究生-数学建模集
    算法练习网站
  • 原文地址:https://www.cnblogs.com/rdchen/p/14240242.html
Copyright © 2020-2023  润新知