0

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

rel_id
rel_name
rel_modified_date
rel_desc

rel_id我想生成像REL230420151001

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

如何创建此类型序列。

4

3 回答 3

1

如果您在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

于 2015-04-23T11:18:25.643 回答
0

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

于 2015-04-23T10:48:58.500 回答
0

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

创建序列 mysec 最小值 0 从 10001 开始,增量为 1 nocache;

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

于 2015-04-23T11:22:09.493 回答