4

この varchar のシーケンスを作成したいと思います。varchar ではなく数値だったらもっと簡単だったでしょう。その場合、私はできる

seq_no := seq_no + 1;

しかし、前の値が A0000001 だったときに、次の値を A0000002 として列に格納したい場合 (次の varchar 行の数値を 1 ずつインクリメントするため) はどうすればよいでしょうか?

4

4 に答える 4

8

これは、

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

于 2013-01-28T12:08:51.210 に答える
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;
于 2013-01-28T11:48:15.500 に答える
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 であるため、存在するかどうかは問題ではありません。

于 2013-01-28T14:03:33.973 に答える
0

フォーマットが常に文字の後に7桁の数字である場合は、次のことができます。

sequence = lpad(substr(sequence,2,7)+1,7,'0')
于 2013-01-28T11:46:15.140 に答える