如何使用日期和序列号

时间:2015-04-23 10:35:27

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

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

rel_id
rel_name
rel_modified_date
rel_desc

rel_id我希望生成ID REL230420151001

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

如何创建此类型序列。

3 个答案:

答案 0 :(得分:1)

如果您使用的是 12c ,则可以使用 IDENTITY column VIRTUAL列进行此操作。

标识列在版本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

,请参阅此处

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

创建序列mysec     minvalue 0     从10001开始     增加1     非缓存;

从双重选择'REL'|| to_char(sysdate,'DDMMYYYY')|| mysec.nextval;