この varchar のシーケンスを作成したいと思います。varchar ではなく数値だったらもっと簡単だったでしょう。その場合、私はできる
seq_no := seq_no + 1;
しかし、前の値が A0000001 だったときに、次の値を A0000002 として列に格納したい場合 (次の varchar 行の数値を 1 ずつインクリメントするため) はどうすればよいでしょうか?
これは、
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')
必要なクエリで..これにより、言及したようにシーケンスが作成されます
シーケンスは純粋に数値です。ただし、とにかくトリガーが必要なので、そのようなトリガーを調整して、目的のプレフィックスを挿入するだけです。
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;
可能であれば、 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 であるため、存在するかどうかは問題ではありません。
フォーマットが常に文字の後に7桁の数字である場合は、次のことができます。
sequence = lpad(substr(sequence,2,7)+1,7,'0')