今天要说的一个是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
符合要求,要考虑的问题是如何防止并发情况的发生。