在Oracle中为varchar2字段创建序列

时间:2013-01-28 11:38:59

标签: sql database oracle sequences

我想为这个varchar创建一个序列。如果它是一个数字而不是varchar会更容易。在那种情况下,我可以做到

  

seq_no:= seq_no + 1;

但是当我想将列中的下一个值存储为A0000002时,如果前一个值为A0000001(将下一个varchar rowby中的数字增加为1),我该怎么办?

4 个答案:

答案 0 :(得分:7)

这可以通过

完成
to_char(seq_no,'FM0000000')

您的示例可以通过在oracle

中创建序列来完成
create sequence seq_no  start with 1 increment by 1;

然后

select 'A'||to_char(seq_no.nextval,'FM0000000') from dual;

现在我已经使用了双..但是这个

'A'||to_char(seq_no.nextval,'FM0000000')

在您要求的查询中..这将创建您提到的序列

<强> sqlfiddle

答案 1 :(得分:5)

序列纯粹是数字的。但是,无论如何都需要触发器,因此只需调整此类触发器即可插入所需的前缀:

CREATE OR REPLACE TRIGGER FOO_TRG1
    BEFORE INSERT
    ON FOO
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
BEGIN
    IF :NEW.FOO_ID IS NULL THEN
        SELECT 'A' || TO_CHAR(FOO_SEQ1.NEXTVAL, 'FM0000000') INTO :NEW.FOO_ID FROM DUAL;
    END IF;
END FOO_TRG1;
/
ALTER TRIGGER FOO_TRG1 ENABLE;

答案 2 :(得分:2)

如果你能够实际使用CREATE TABLE语法中定义的虚拟列。如果需要,它可以更容易地扩展。

这是一个有效的例子。

SQL> create table tmp_test (
  2     id number(7,0) primary key
  3   , col1 number
  4   , seq varchar2(8 char) generated always as (
  5           'A' || to_char(id, 'FM0999999'))
  6      );

Table created.

SQL>
SQL> create sequence tmp_test_seq;

Sequence created.

SQL>
SQL> create or replace trigger tmp_test_trigger
  2    before insert on tmp_test
  3    for each row
  4  begin
  5
  6    :new.id := tmp_test_seq.nextval;
  7  end;
  8  /

Trigger created.

SQL> show errors
No errors.
SQL>
SQL> insert into tmp_test (col1)
  2   values(1);

1 row created.

SQL>
SQL> select * from tmp_test;

        ID       COL1 SEQ
---------- ---------- --------------------------------
         1          1 A0000001

说完了;如果你没有这样做,除非你有一个令人难以置信的紧迫的业务需求,你会更好。通过在数字上加上一个常数值,让生活变得更加困难是没有意义的。由于A总是A,无论它是否存在都无关紧要。

答案 3 :(得分:0)

如果格式总是一个字母后跟7位数字,您可以这样做:

sequence = lpad(substr(sequence,2,7)+1,7,'0')