【问题标题】:How to create alphanumeric sequence using date and sequence number如何使用日期和序列号创建字母数字序列
【发布时间】:2015-07-01 11:43:18
【问题描述】:

我想在 oracle 中创建一个字母数字序列。表名为rel_details,由四列组成。

rel_id
rel_name
rel_modified_date
rel_desc

rel_id 我想生成像REL230420151001 这样的ID

REL 是一个字符串, 23042015 是今天的日期, 1001 是一个起始编号。

如何创建这种类型序列。

【问题讨论】:

    标签: sql oracle sequence identity-column virtual-column


    【解决方案1】:

    如果您使用的是 12c,那么这是一种使用 IDENTITY columnVIRTUAL 列的方法。

    12c版本引入了标识列,11g版本引入了虚拟列。

    SQL> CREATE TABLE t
      2            (
      3              ID NUMBER GENERATED ALWAYS AS IDENTITY
      4              START WITH 1000 INCREMENT BY 1,
      5              text VARCHAR2(50),
      6              dt DATE DEFAULT SYSDATE,
      7              my_text varchar2(1000) GENERATED ALWAYS AS (text||to_char(dt, 'DDMMYYYY')||ID) VIRTUAL
      8            );
    
    Table created.
    
    SQL>
    SQL> INSERT INTO t(text) VALUES ('REL');
    
    1 row created.
    
    SQL>
    SQL> SELECT text, my_text FROM t;
    
    TEXT  MY_TEXT
    ----- ------------------------------
    REL   REL230420151000
    
    SQL>
    

    我创建的身份列以 1000 开头,您可以自定义您想要的方式。

    关于 VIRTUAL 列有一个小技巧。您必须将其显式转换为具有固定大小的 varchar2,否则隐式转换将使其达到 最大大小。有关更多详细信息,请参阅此Concatenating numbers in virtual column expression throws ORA-12899: value too large for column

    【讨论】:

    • @TapajyotiGiri 没问题,使用显式序列对象,然后你就知道该怎么做了。当然,也排除了虚拟列。但是,逻辑保持不变。一切顺利。
    【解决方案2】:

    如果我是你,我不会费心将这样的序列存储在列中;我会分别存储包含相关信息的列,然后要么有一个将它们连接在一起的虚拟列,要么在视图中进行连接。

    【讨论】:

      【解决方案3】:

      勾选此项,您可能无法创建 seq ,但您可以使用 select 如下。

      创建序列 mysec 最小值 0 从 10001 开始 增加 1 无缓存;

      select 'REL'||to_char(sysdate,'DDMMYYYY')||mysec.nextval from dual;

      【讨论】:

      • 创建序列 mysec minvalue 0 从 10001 开始,递增 1 nocache;选择'REL'||to_char(sysdate,'DDMMYYYY')||来自双重的 mysec.nextval;
      猜你喜欢
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      相关资源
      最近更新 更多