sql >> データベース >  >> RDS >> Oracle

英数字で始まるOracleシーケンスの作成

    整数値のシーケンスのみを作成できます。

    したがって、ステートメントは次のようになります。

    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)を回避する方法はありません。



    1. FREETEXTTABLE のランクは常に 0 です

    2. MysqlLoadInline-特定の列

    3. Oracleのcharデータ型のクエリ列

    4. SQLでbool値を設定する方法