CREATE OR REPLACE
FUNCTION createUniqueKey(str_begin in VARCHAR2,str_date in VARCHAR2,date_date in date
,str_date_format in VARCHAR2,bool_is_timestamp in char,int_random_length in int)
RETURN VARCHAR2
AS
--str_begin 开始字符
--str_date 字符串类型日期,使用时忽略日期类型date_date及其格式化str_date_format参数
--date_date 日期类型日期
--str_date_format 日期类型日期格式化format
--bool_is_timestamp 是否使用时间戳
--int_random_length 随机数长度,请不要超过35位
--生成规则:开始字符+格式化日期(或者时间戳)+随机数
--createUniqueKey('L','',sysdate,'','0',5) 使用默认日期格式结果:L2017090501131231524
--createUniqueKey('L','',null,'yymmdd-','0',5) 使用当前时间自定义日期格式结果:L170905-73080
--createUniqueKey('L','',sysdate,'yymmdd-','1',5) 使用时间戳结果:L150454530538674643
--createUniqueKey('L','2017/9/8',sysdate,'yymmdd-','0',5) 使用字符串日期结果:L2017/9/890691
return_str varchar2(4000);
str_my_date_format varchar2(40);
date_my_str varchar2(40);
date_my_date DATE;
str_random varchar2(4000);
BEGIN
return_str := str_begin;
if str_date = '' or str_date is null then--字符串类型的日期不存在时,使用日期类型的日期
if date_date is null then
date_my_date := sysdate;
else
date_my_date := date_date;
end if;
if bool_is_timestamp = '0' then
--不使用时间戳,根据format格式得到字符串类型日期
if str_date_format = '' or str_date_format is null then
str_my_date_format := 'yyyymmddhh24miss';
else
str_my_date_format := str_date_format;
end if;
date_my_str := to_char(date_my_date,str_my_date_format);
end if;
else--字符串类型的日期格式存在时,直接利用此字符串日期
if bool_is_timestamp = '0' then
date_my_str := str_date;
else
--使用时间戳,需要将字符串类型转换程日期类型来计算时间戳
date_my_date := to_date(str_date,'yyyy-mm-dd hh24:mi:ss');
end if;
end if;
--使用时间戳,计算得出
if bool_is_timestamp = '1' then
date_my_str := to_char((date_my_date - TO_DATE('1970-1-1 8', 'YYYY-MM-DD HH24')) * 86400000
+ TO_NUMBER(TO_CHAR(SYSTIMESTAMP, 'FF3')));
end if;
return_str := return_str || date_my_str;
--生成随机数
if int_random_length > 0 then
str_random := substr(to_char(dbms_random.value),2,int_random_length);
return_str := return_str || str_random;
end if;
return(return_str);
END;