我想为这个varchar创建一个序列。如果它是一个数字而不是varchar会更容易。在那种情况下,我可以做到
seq_no:= seq_no + 1;
但是当我想将列中的下一个值存储为A0000002时,如果前一个值为A0000001(将下一个varchar rowby中的数字增加为1),我该怎么办?
答案 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')