2011-07-17 29 views
2

私はシーケンス番号に使用される列を持っています。 列の値は 'WT0000004568'のようになります数値以外の列の値を増やす方法は?

新しい値を作成するには、最大値を見つけてカウンタの値を1だけ増やす必要があります。 この例では、結果値は 'WT0000004569'になります。

どうすればよいですか?

+3

ような何かを行うことができ、古い値を検索し、1ずつ増加する場合、並行性の問題について注意してください。列にユニークなインデックスがありますか?また、これらの値を生成するためにOracleシーケンスを使用することも検討してください。 – Thilo

+0

Oracle SQLを使用すると、Javaでユーザー定義関数を記述できますが、純粋なSQLで実行することができます。しかし、Thiloが尋ねたものの上に少し明確化されています。新しい列が挿入されたときにのみ、新しいシーケンス「番号」を割り当てることが提案されていますか? – hardmath

+0

同時実行性の問題があることを認識していますが、現時点では心配していません。これは既存のデータベースであり、設計を変更できないため、Oracleの順序はオプションではありません。私は物事を一点まで働かせることができましたが、問題に遭遇しました。 – Burferd

答えて

5

Thilioが指摘したように、これは一般に、パフォーマンスと同時実行性の問題の両方から悪い設計です。私たちはあなたがシングルユーザーシステムを持っており、パフォーマンスについて特に懸念していないと仮定した場合、あなたは

SQL> ed 
Wrote file afiedt.buf 

    1 select 'WT' || 
    2   to_char(
    3   to_number(substr('WT0000004568',3)) + 1, 
    4   'fm0000000000') 
    5* from dual 
SQL>/

'WT'||TO_CHAR 
------------- 
WT0000004569 
+1

コメント内で質問された質問を明確にするために、ジャスティンの答えで答えました。暗黙的な数値から文字列への変換マスクが正の数の前にスペースを追加するため、元のポスターは文字列と数字を連結したときにスペースを見ていました。それらを負の数とうまく合わせる。これを抑止するには、書式文字列の先頭に "fm"を使用して、数値を文字列に明示的に変換する必要があります。 – Allan

関連する問題