【问题标题】:How to append an Incrementing number to a table value in Oracle?如何将递增数字附加到 Oracle 中的表值?
【发布时间】:2022-07-25 20:38:21
【问题描述】:

使用 Oracle,我有一个创建唯一 ID 号的过程。目前,ID 号是用 sysdate 年份与“-”连接的。然后,我更新 ID 号以连接表中破折号后的值。

例如:2022-8501。

我想将破折号后面的数字增加 1,而不是使用表值,并且它应该每年从 1 开始。

例如:2022-1、2022-2、2022-3 //(明年)2023-1、2023-2、2023-3

解决这个问题的最佳方法是什么?我在下面附上了我当前的代码。

INSERT INTO PLANE_INFO.ID_NUMBERS (PLANE_ID)
    VALUES (TO_CHAR(SYSDATE, 'YYYY')||'-')
    RETURNING ENTRY_ID INTO v_entry_id;

UPDATE PLANE_INFO.ID_NUMBERS
    SET PLANE_ID = PLANE_ID || LPAD(v_entry_id,5,'0')
    WHERE ENTRY_ID = v_entry_id;

【问题讨论】:

    标签: oracle toad


    【解决方案1】:

    “最好”的方式?使用序列。

    create sequence seq;
    
    insert into plane_info.id_numbers (plane_id)
    values (extract (year from sysdate) ||'-'|| seq.nextval);
    

    【讨论】:

    • 如果我想在每年之后重置号码怎么办? @Littlefoot
    • 重置序列,或创建一个自定义函数,该函数将接受年份作为参数并返回每年的序列值(您还需要一个存储每年最后获取的序列值的表)。函数应该是自治事务,因为您必须在该表中插入/更新行。
    【解决方案2】:

    [TL;DR] 只需使用正常序列,如果您想生成每年重新开始的伪序列,那么您可以计算它以用于 显示 目的(但您不应该将其用作引用约束)。


    如果你有桌子:

    CREATE TABLE PLANE_INFO.ID_NUMBERS (
      id   NUMBER
           GENERATED ALWAYS AS IDENTITY
           CONSTRAINT table_name__id__pk PRIMARY KEY,
      year NUMBER(4)
           CONSTRAINT table_name__year__nn NOT NULL
    );
    

    注意:IDENTITY 列在 Oracle 12 中可用。

    然后您有一个递增序列(您可以将其用作主键并用于任何引用约束)和一个年份列。

    您可以使用ROW_NUMBER() 分析函数和字符串连接来生成伪序列(用于显示目的,而不是作为参考约束):

    SELECT t.*,
           YEAR
           || '-'
           || LPAD(ROW_NUMBER() OVER (PARTITION BY YEAR ORDER BY id), 5, '0')
             AS pseudo_seq
    FROM   PLANE_INFO.ID_NUMBERS t
    

    db小提琴here

    【讨论】:

      猜你喜欢
      • 2013-08-19
      • 2017-05-14
      • 2016-08-21
      • 1970-01-01
      • 2022-07-05
      • 2019-02-22
      • 2023-04-04
      • 2011-11-12
      • 1970-01-01
      相关资源
      最近更新 更多