• 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;

  • 相关阅读:
    prototype.js超强的javascript类库
    MySQL Server Architecture
    Know more about RBA redo block address
    MySQL无处不在
    利用Oracle Enterprise Manager Cloud Control 12c创建DataGuard Standby
    LAMP Stack
    9i中DG remote archive可能导致Primary Database挂起
    Oracle数据库升级与补丁
    Oracle为何会发生归档日志archivelog大小远小于联机重做日志online redo log size的情况?
    Oracle Ksplice如何工作?How does Ksplice work?
  • 原文地址:https://www.cnblogs.com/rdchen/p/14240242.html
Copyright © 2020-2023  润新知