2011-07-17 37 views
2

我有一个用于序列号的列。 列中的值看起来像'WT0000004568'如何增加非数字列值?

我需要找到最大值并将计数器部分递增1以创建新的序列号。 对于这个例子,结果值是'WT0000004569'。

我该怎么做?

+3

仰视的时候,老值,并通过一个递增小心并发问题。列上有唯一的索引吗?还要考虑使用Oracle序列来产生这些值。 – Thilo

+0

Oracle SQL允许您使用Java编写用户定义的函数,但我认为您可以在纯SQL中完成。然而,有一点需要澄清,除了Thilo上面提到的问题之外:是否有人建议只在插入新行时分配一个新的序列“number”? – 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

澄清在评论中提出的一个问题,并由Justin的回答解决:原始海报在串联一个字符串和一个数字时看到一个空格,因为隐式的数字到字符串转换掩码会在正数前面添加一个空格使它们与负数很好地对齐。为了抑制这一点,你需要明确地将数字转换为一个字符串,在格式字符串的开头使用“fm”。 – Allan