我有一个表 code字段 是 20080102001  (日期+序号)
当我插入一条记录时 自动生成新的code (20080102002)
我要把sql语句写在程序里  ,请问怎么写呢?
我在sqlserver里 可以 
declare temp varchar(50);
select temp = max(code) form table1 where code like '20080120%';
..........请问在pl/sql怎么写呢 ? 以前一直用sqlserver里的sql 不知pl/sql应该怎样写? 谢谢大家

解决方案 »

  1.   

    其实你一样的可以用一个表保存当天的最大序号
    如:
    create table curMaxid(ldate varchar2(8),curid number)declare tcurid number;
    declare counts number;
    select count(1) into counts from counts where ldate=to_char(sysdate,'yyyymmdd');
    if counts = 1 then 
      select curid into curMaxid  from curMaxid where ldate=to_char(sysdate,'yyyymmdd');
      curMaxid  := curMaxid   + 1
      update curMaxid  set curid = curid  +1 where ldate=to_char(sysdate,'yyyymmdd');
      commit;
    else 
      insert into curMaxid values(to_char(sysdate,'yyyymmdd'),1);
      commit;
    end if;
      

  2.   

    我只能 通过在程序里的sql来操作。 别人要求这么做的 没办法
      

  3.   

    select max(code) from table1 
    where substr(code,1,8)=to_char(sysdate,'YYYYMMDD')
      

  4.   

    PL/SQL里面取最大Code可以使用
    select max(code) into 变量名 from table1  
    where substr(code,1,8)=to_char(sysdate,'YYYYMMDD')
    也可以直接
    insert into tablename(code,字段...) values(select max(code)+1 from table1 where substr(code,1,8)=to_char(sysdate,'YYYYMMDD'),...)
    不过这样就没有办法考虑大于999条记录的情况。
      

  5.   

    这样插最大记录,并发高时容易产生重复记录,oracle里建议用序列
      

  6.   

    获取当天最大序号:SQL> SELECT * FROM TB2;COLA
    --------------------
    20080102001
    20080102002
    20080310001SQL> SELECT TO_CHAR(SYSDATE,'YYYYMMDD')||LPAD(NVL(MAX(SUBSTR(COLA,9)),0)+1,3,'0')
      2  FROM TB2 WHERE COLA LIKE TO_CHAR(SYSDATE,'YYYYMMDD')||'%';TO_CHAR(SYSDATE
    ---------------
    20080310002SQL> 
      

  7.   

    建议使用序列和触发器,你这么写程序表里面可能会有重复记录的.
    先建一个序列,然后在对应表中建一个before insert的行级触发器,使用:new.code=to_char(sysdate,'YYYYMMDD')||rpad(to_char(myseq.nextval),6,'0'),myseq是你建立的序列名,6是我自己设的,你自己看需要多少位流水号。
      

  8.   

    最简单方法:
    说明(我用的oracle817)
    1、前台程序获取当前日期(yyyymmdd);
    2、后台数据库用函数截取colA列,把不含日期(yyyymmdd)以外的部分找出来,然后最大值+1;
    3、前台程序获取当前日期(yyyymmdd)||最大值+1即可;最好不用序列,序列必须是连续的,空间比较浪费而且不好控制