我想在 oracle 中创建一个字母数字序列。表名是rel_details
它由四列组成。
rel_id
rel_name
rel_modified_date
rel_desc
在rel_id
我想生成像REL230420151001
REL
是一个字符串,
23042015
是今天的日期,
1001
是一个起始数字。
如何创建此类型序列。
我想在 oracle 中创建一个字母数字序列。表名是rel_details
它由四列组成。
rel_id
rel_name
rel_modified_date
rel_desc
在rel_id
我想生成像REL230420151001
REL
是一个字符串,
23042015
是今天的日期,
1001
是一个起始数字。
如何创建此类型序列。
如果您在12c上,那么这是使用IDENTITY 列和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,否则隐式转换将使其达到最大大小。有关更多详细信息,请参阅此内容在虚拟列表达式中连接数字会引发 ORA-12899: value too large for column
如果我是你,我不会费心将这样的序列存储在列中;我会分别存储包含相关信息的列,然后要么有一个将它们连接在一起的虚拟列,要么在视图中进行连接。
勾选此项,您可能无法创建 seq ,但您可以使用 select 如下。
创建序列 mysec 最小值 0 从 10001 开始,增量为 1 nocache;
选择'REL'||to_char(sysdate,'DDMMYYYY')||mysec.nextval from dual;