整数値のシーケンスのみを作成できます。
したがって、ステートメントは次のようになります。
CREATE SEQUENCE invoice_nun
START WITH 1
INCREMENT BY 1;
フェッチした値を文字列に変換し、適切なプレフィックスを追加できます。
select 'INV'||to_char(invoice_nun.nextval,'FM09999999')
from dual;
適切な文字列値を返すシーケンスをシミュレートする関数を作成できます
create or replace function next_invoice_nun return varchar2
as
begin
return('INV'||to_char(invoice_nun.nextval,'FM09999999') );
end;
/
これでできるようになりました
select next_invoice_nun
from dual;
上で定義されたシーケンスは、いくつかのデフォルト値を使用します。これは、データベースSQL言語リファレンス に記載されています。 。次のステートメントと同等です
CREATE SEQUENCE invoice_nun
CACHE 20
NOORDER
START WITH 1
INCREMENT BY 1;
次の点に注意する必要があります:
1)トランザクションがシーケンス値をフェッチしてロールバックすると、シーケンス値は失われます。したがって、次のことを行うと:
-- fetch invoice_id INV00000001
insert into invoices(invoice_id,...) values (next_invoice_nun,...);
commit;
-- fetch invoice_id INV00000002
insert into invoices(invoice_id,...) values (next_invoice_nun,...);
rollback;
-- fetch invoice_id INV00000003
insert into invoices(invoice_id,...) values (next_invoice_nun,...);
commit;
請求書ID INV00000001
およびコード> INV00000003
は
に挿入されます 請求書テーブルですが、請求書ID
INV00000002`は、それをフェッチしたステートメントがロールバックされたために失われました
2)インスタンスがクラッシュすると、インスタンスのキャッシュにあるすべてのシーケンスが失われます。あなたの例では、キャッシュのデフォルト値である20が使用されています。したがって、インスタンスがクラッシュすると、最大20のシーケンス値が失われる可能性があります。ネイティブの変更は、キーワード NOCYCLE
を使用することです。 シーケンスを作成したが、これによりパフォーマンスが低下する場合。
3)RACシステムを使用している場合、シーケンス番号はステートメントをフェッチする順序を表していません。したがって、最初のステートメントがID INV00000021
を取得する可能性があります。 2番目のステートメントはIDINV00000001
を取得します 2番目のステートメントが最初のステートメントとは異なるインスタンスで実行された場合。これは、インスタンスがキャッシュ内の最初の20シーケンス番号をフェッチし、他のインスタンスがキャッシュ内の次の20シーケンス番号をフェッチしたためです。最初のステートメントは、2番目の20個のシーケンス番号をフェッチしたインスタンスで実行されます。 ORDER
を使用できます これを回避するためのキーワードですが、これもパフォーマンスの低下をもたらします
したがって、パフォーマンスペナルティの代償として2)と3)を回避することはできますが、2)を回避する方法はありません。