create or replace function get_projectcode(p_id number) return varchar2
as
--流程控制用来生成调单的流水号,形如20060112-0001
p_str varchar2(2000);
p_out varchar2(2000);
begin
  select to_char(A_STARTDATE,'yyyy')||to_char(A_STARTDATE,'Q') into p_str from project where projectid = p_id;
  begin
    select to_char(max(to_number(projectcode)+1)) into p_out from project where instr(projectcode,p_str) = 1;
  exception
    when OTHERS then
      p_out := null;
  end;
  if p_out is null then
     p_out := p_str ||'0001';
  end if;
  return p_out;
exception
  when OTHERS then
    return null;
end get_projectcode;
大家看上面的程序,我的本意是想"生成调单的流水号,形如20060112-0001"
可结果老是生成了形如20060112 的,我现在想形成20060112-0001; 后面的####的转换方式我想这样:我在库里面有个季节 workday   这个字段,当先中第一季度时候形成形如20060112-0001,第二季度时候形成形如20060112-0002 依次类推.我不讳写这程序.求大家帮我该下上面的程序  !!! 求你们了 ,我真的急用.

解决方案 »

  1.   

    Case 1:
      begin
        select to_char(max(to_number(projectcode)+1)) into p_out from project where instr(projectcode,p_str) = 1;
      exception
        when OTHERS then
          p_out := null;
          --你看看程序有没有执行到这里来 ...
      end;Case 2:
    把 p_out := p_str ||'0001'; 改成:
    p_out := p_str ||'000'||substr(p_q,-1);如果你取得是程序运行的时间 (sysdate) 的话:
    select to_char(sysdate,'Q') into p_q from dual;
    然后把 p_out := p_str ||'0001'; 改成:
    p_out := p_str ||'000'||substr(p_q,-1);
      

  2.   

    select to_char(max(to_number(projectcode)+1)) into p_out from project where instr 这个注意并发控制 建议建立一个序列
      

  3.   

    SELECT to_char(SYSDATE,'yyyymmdd')||'-'||lpad(to_char(SYSDATE,'Q'),4,'0')  into p_out  FROM project where projectid = p_id;那来这么多的代码,一下搞定
      

  4.   

    SELECT to_char(A_STARTDATE,'yyyymmdd')||'-'||lpad(to_char(A_STARTDATE,'Q'),4,'0')  into p_out  FROM project where projectid = p_id;
      

  5.   

    create or replace function get_projectcode(p_id number) return varchar2
    as
    --流程控制用来生成调单的流水号,形如20060112-0001
    p_str varchar2(2000);
    cnt number;
    v_temp varchar2(10);
    p_out varchar2(2000);
    begin
      select decode(workday,'季节1','1','季节2','2','季节3','3','4') 
      into v_temp from table1;
      
      select to_char(A_STARTDATE,'yyyy')||to_char(A_STARTDATE,'Q') into p_str from project where projectid = p_id;
      
      select count(*) into cnt 
      from project where instr(projectcode,p_str) = 1;
      
      if (cnt<=0) then 
         p_out := p_str ||to_char(v_temp,'fm0000');
      else
        select to_char(max(to_number(projectcode)+1)) into p_out from project where instr(projectcode,p_str) = 1;
      end if;  return p_out;
    exception
      when OTHERS then
        return null;
    end get_projectcode;