关于oracle生成项目编号的函数

   今天要说的一个是oracle的一个函数,项目需求ID必须是按照TYPE+YYYYMMDD+001这样的格式来生成,想了一下,因为很多的的ID都是需要这样生成,其不同的地方只在于type不同,以及所选取的表,以及表列不一样。因此,想用一个函数来返回值,以其简单化。

   问题的难点在001如何增加到002一直到999,起初想用一个sequences来实现,但是由于需要递增,如果表中已经有001的代码的话,那么使用序列无法控制下一个序列是002,所以就直接pass掉这了个想法。

   想到最后,问题就在简单成了1-2-3,前面补0不就得了。问题迎刃而解。贴上代码,与大家共享

create or replace function fn_no_make(
                                      v_type varchar2,
                                      V_number_col VARCHAR2,
                                      V_Table_Name VARCHAR2)
return varchar2
IS
/*****************************************************************************
*                                                                            *
*   PROGRAM-ID : fn_no_make                                                 *
*                                                                            *
*   DESCRIPTION : make asset,purchase no                                     *
*                                                                            *
*                                                                            *
*   PARAMETER                                                                *
*                                                                            *
*       INPUT   : NULL                                                       *
*                                                                            *
*       OUTPUT : NULL                                                       *
*                                                                            *
*       LOG     : NULL                                                       *
******************************************************************************
*                                                                            *
*                                                                            *
******************************************************************************/
V_Maked_No           varchar2(50);   
v_sql                VARCHAR2(4000);                                                
begin
   v_sql := 'select no_init ||max_no ';
   v_sql := v_sql || 'from (select '''|| v_type ||''' || substr(TO_CHAR(SYSDATE,''yyyymmdd''), 1, 8) no_init, ';
   v_sql := v_sql || 'case when SUBSTR(MAX('||V_number_col||'),3,8) <> substr(TO_CHAR(SYSDATE,''yyyymmdd''), 1, 8) then ''001'' ';
   v_sql := v_sql || 'ELSE lpad((to_number(SUBSTR(max('||V_number_col||'), 11, 3))+1),3,0) end max_no from '||V_Table_Name||') A'
          ;
    execute immediate v_sql INTO V_Maked_No;
return(V_Maked_No);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
end fn_no_make;

 

调用 SELECT fn_no_make('AT','ASM_ASSET_NO','TB_ASSET_MASTER') FROM DUAL;

结果如下: AT20090318002

符合要求,要考虑的问题是如何防止并发情况的发生。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值