没有问题啊SQL> CREATE OR REPLACE TRIGGER testname
  2  before insert 
  3  on tb for each row
  4  DECLARE   
  5      nfolderno   number(8);   
  6      newfolderno   varchar2(10);   
  7  BEGIN
  8  SELECT nvl(MAX(id),0) into newfolderno FROM tb;
  9  nfolderno:= TO_NUMBER(newfolderno);    
 10  nfolderno:=nfolderno+1;
 11  newfolderno:=TO_CHAR(nfolderno,'00000000');
 12  :new.id:=newfolderno;   
 13  END;
 14  /触发器已创建
SQL> insert into tb values(10);已创建 1 行。SQL> insert into tb values(10);已创建 1 行。SQL> select * from tb;ID
--------------------
 00000001
 00000002SQL> insert into tb values(10);已创建 1 行。SQL> insert into tb values(10);已创建 1 行。SQL> select * from tb;ID
--------------------
 00000001
 00000002
 00000003
 00000004SQL> 
估计是你的数据有问题,
你执行SELECT MAX(folder_no) FROM test; 看看是数字吗?

解决方案 »

  1.   

    我folder_no这个是字符型的 客户要求
      

  2.   

    新插入的folder_no前面好像多了一个空格 奇怪
      

  3.   

    你的问题我刚刚测试了,问题的主要原因是函数to_char在按照指定格式输出时在字符串前加了个空格字符,因此得到的字符就是_00100009(这里用_来代表空格字符),而这样的数无论如何比较,他都不可能大于00100008的,我们可以用函数length(to_char(nfolderno,'00000000'))来查,看他的长度是8还是9。因此,要想取得真实的结果就要去掉前面的空格字符,可以用ltrim函数来实现,前面的语句newfolderno:=TO_CHAR(nfolderno,'00000000');就应该改为
    newfolderno:=LTRIM(TO_CHAR(nfolderno,'00000000'));