oracle sql语句数字递增问题

来源:百度知道 编辑:UC知道 时间:2024/06/28 02:34:35
select to_char(to_number(nvl(max(ltrim(rtrim(sortid))),'0')) + 1,'FM90')
into :ls_sortid
from table1;

上面是写在PB代码中的一段数据库语句,用来取顺序号,sortid在表中定义是char(2),前面从1取到10是正常的,但后面递增不下去,全是10!

本来以为是多空格的问题,所以加了rtrim和ltrim函数,后面to_char函数的参数'FM90'中'FM'也是去空格的,'90'表示个位数没数字就显示为0,十位数表示没数字就不显示。但是这样还是不行!不知有哪位大侠可否告之这是什么原因?

因为怕没人回答得上来,所以先设50分,如果有谁能帮我解决问题,我人格保证再提高悬赏50分和再另送50分,不信可以看本人的提问记录,我不是那种吝惜分数的人。
补充问题次数有限,我还是简单说清楚比较好。

表table1是以流水号oid、插入日期odate和顺序号sortid为主键的,每产生一笔交易就往表中插入几条记录,这些记录的流水号和插入日期是一样的,所以要以sortid区分

简单一点就是:
select nvl(max(sortid),'0')+'1' into :ls_sortid from table1 where oid=* and odate=*;
insert into table1() values(oid,odate,sortid);

nvl功能学过oracle的应该知道,插入第一条记录前取到的sortid是空的,所以转为0再加1
---------------------
回二楼的,是没必要那么复杂,但取不到11以上的所以才这样写,纯粹是为了找原因
---------------------
回三楼的,不用序列是因为一个表中有重复的顺序号,一笔交易有多条记录,这个是同一笔交易内区分记录的顺序号
我也试了在sqlplus里面可以,甚

这个是因为你的字符型号不对.MAX(值) 里面的值 最好是数字 转换成整形 .然后再加1 .你 的 MAX() 里面比较的是字符串.所以会出现不可控的 状况.自己在max里面改下就可以了.... 字符串的比较方法和 int 的比较方法不同. 去查一下比较原理就知道了. 多余的我不多说了...自己写下转换 就可以搞定了...ok

没用过 oracle,我是用sql server的,不过感觉应该差不多。
但是没太看懂你的问题意思,
觉得你用char不保险,为什么不用varchar呢?

你可以把需求说的清楚点吗?我能写出sql server的,相信会对你有帮助

没有看懂到底想干什么,如果只是取序号,有必要这么复杂吗?

为什么这样可以

SQL> select to_char(to_number(nvl(max(ltrim(rtrim('10'))),'0')) + 1) from dual;

TO_CHAR(TO_NUMBER(NVL(MAX(LTRI
----------------------------------------
11

SQL> select to_char(to_number(nvl(max(ltrim(rtrim('11'))),'0')) + 1) from dual;

TO_CHAR(TO_NUMBER(NVL(MAX(LTRI
----------------------------------------
12

我觉得应该是你这句话没取到值
to_number(nvl(max(ltrim(rtrim(sortid)))的值一直为空
原因我没看出来
所以到十以后就一直输出10

其实可以找我!因为你描述的太乱了!这个东西 完全可以用JAVA程序来处理(多线程处理),就一个序号!线程处理太简单了!