将序列值重置为1

时间:2015-03-10 12:05:09

标签: sql oracle csv sql-loader

我有test.csv,test1.csv,test2.csv ...等文件。 我通过sql loader将这些文件加载​​到自定义表测试中。 在表测试中,我有名为seq_no的列,process_id除了上面提到的平面文件中的列之外。 我为上面提到的两列创建了两个序列,如下所述。

CREATE SEQUENCE  test  
MINVALUE 1  
INCREMENT BY 1   
START WITH 1  
NOCACHE  
NOORDER   
NOCYCLE ;  

CREATE SEQUENCE  test1   
MINVALUE 1  
INCREMENT BY 1  
START WITH 1  
NOCACHE         
NOORDER   
NOCYCLE ;  

现在,seq_no将被填充,具体取决于加载的no.of文件 E.G:如果v有5个文件,那么seq_no将是1,2,3,4,5 而process_id将在文件内部有多少“FDETL”记录 E.G如果v有文件1,FDETL = 2则seq_no = 1,process_id = 1,2     如果v有文件2,FDETL = 3则seq_no = 2,process_id = 1,2,3。 有一点像process_id应该重复/文件。 现在我使用的是test1.nextval 那么如何重置序列test1以便每个文件process_id将从1重复计数(FDETL)记录?

1 个答案:

答案 0 :(得分:3)

没有直接的方法可以做到这一点。您需要对其进行编码或手动执行,以便每次特定进程结束时,序列都会从1开始。 AskTom上有一个similar question。您可以按以下步骤执行此操作:

  1. 找出序列的当前值。
  2. 将序列更改为由步骤1中序列的当前值返回的负值。
  3. 现在序列重置为0.
  4. 将序列改为1。
  5. 现在序列设置为1。
  6. 注意:以下示例仅适用于使用序列的唯一过程。否则,其他用户将获得 ORA-08004:序列S.NEXTVAL低于MINVALUE且无法实例化错误,直到您将序列增量设置回1为止。

    例如,

    SQL> create sequence s;
    
    Sequence created.
    
    SQL> select s.nextval from user_objects;
    
       NEXTVAL
    ----------
             1
             2
             3
             4
             5
             6
             7
             8
             9
            10
            11
            12
    
    12 rows selected.
    
    SQL> select s.nextval from dual;
    
       NEXTVAL
    ----------
            13
    

    让我们通过 -13 增加它,

    SQL> alter sequence s increment by -13 minvalue 0;
    
    Sequence altered.
    
    SQL> select s.nextval from dual;
    
       NEXTVAL
    ----------
             0
    
    SQL> alter sequence s increment by 1;
    
    Sequence altered.
    
    SQL> select s.nextval from dual;
    
       NEXTVAL
    ----------
             1
    
    SQL>
    

    序列现在重置为1.