根据格式字符串自动生成单据号(ORACLE版)(一)

2014-11-24 12:57:34 · 作者: · 浏览: 0
根据格式字符串自动生成单据号(ORACLE版)
本代码为通过特定关键字的字符串自动生成单据号;解决 编程
频繁编写代码自动生成单据号。
www.2cto.com
@SJ ---为格式字符串(以下是关键字含义)
"%Y"表示完整年 如:2012
"%y"表示简写年 如:12
"%M"表示两位月份 如:01
"%m"表示简写月份 如:1
"%D"表示天 如:08
"%d"表示简写天 如:8
"%W" 或者 "%w"表示周(全年52周) 如:05(全年第五周)
"%H"表示完整小时 如:08
"%h"表示简写小时 如:8
"%N"表示完整分钟 如:08
"%n"表示简写分钟 如:8
"%S"表示完整秒 如:08
"%s"表示简写秒 如:8
"%K"表示完整毫秒 如:008
"%04X"表示生成单据号的流水号 www.2cto.com
04表示4为数字 如:流水号0005
% X 表示通配符
其他非特定关键字可以任意组合
@TableName ---为单据号的 数据库
@ColName ----为数据表的单据号列
@Remove -----为剔除自动生成单据号的数组 如:格式为"1,2,3,4,5,"
@Mantissa ----为控制是否剔除包含还是匹配;"1"表示包含剔除的数据;"0"表示剔除完全匹配的单据号
@Where ---为自动生成单据号的查询条件
@ZD_date ---为单据号生成的单据日期
@SSN ----为生产的单据号
例子:
格式字符串:投诉单%Y%M%06XAAAsdsA
自动生成的单据号:投诉单201206000001AAAsdsA
代码1:判断是否数值型字符串 www.2cto.com
代码2:自动生成序列号的函数
CREATE OR REPLACE FUNCTION SN_ISNUMBER(MyStr VARCHAR2) RETURN NUMBER
IS
STR VARCHAR2(400);
ISNUM NUMBER;
NUM NUMBER;
BEGIN
--返回0,不是数字。1,是数字
ISNUM:=0;
STR:=TRIM(MyStr);
--如果输入值为空,就返回不是数字。
IF TRIM(STR) IS NOT NULL THEN
BEGIN
NUM:=TO_NUMBER(STR);
ISNUM:=1;
EXCEPTION
WHEN INVALID_NUMBER THEN
NULL;
WHEN OTHERS THEN
NULL;
END;
END IF;
RETURN ISNUM;
END;
CREATE OR REPLACE FUNCTION SN_PROCESSAUTOSN(SJ VARCHAR2,
TABLENAME VARCHAR2,
COLNAME VARCHAR2,
REMOVE VARCHAR2,
MANTISSA INT,
WHERES VARCHAR2,
ZZD_DATE DATE) RETURN VARCHAR2 IS
--自动生成单据号
--SJ 流水号格式字符串
--TableName 表名
--ColName 列名
--存储过程参数
ZD_DATE DATE;
SN VARCHAR2(500);
YEARS VARCHAR2(4);
MINYEAR VARCHAR2(2);
MONTHS VARCHAR2(2);
DAYS VARCHAR2(2);
HOUR VARCHAR2(2);
SSN VARCHAR2(1000);
Q VARCHAR2(2);
MINUTE VARCHAR2(2);
WEEK VARCHAR2(2);
SECONDS VARCHAR2(2);
MSECONDS VARCHAR2(10);
SL VARCHAR2(500);
ZERO VARCHAR2(500);
XZERO VARCHAR2(500);
XCOUNT INT;
LSQL VARCHAR2(4000);
LMAX VARCHAR2(500);
LSTART INT;
LEND INT;
LLENGTH INT;
IMAX VARCHAR2(500);
LMAX INT;
MSTART INT;
STAT INT;
RES VARCHAR2(500);
RMOVE VARCHAR2(5000);
BEGIN
/* TABLENAME := 'OI_CONTRACT_HEADER';
COLNAME := 'OCH_CONTRACT_ID'; --投诉单1009001
SJ := '%y%M%046';
ZD_DATE:=to_date('2009-01-01','yyyy-MM-dd');*/
IF (ZZD_DATE IS NULL) THEN
ZD_DATE := SYSDATE;
ELSE
ZD_DATE := ZZD_DATE;
END IF;
SN := SJ;
YEARS := TO_CHAR(ZD_DATE, 'yyyy');
MINYEAR := SUBSTR(YEARS, 3, 2);
MONTHS := TO_CHAR(ZD_DATE, 'MM');
DAYS := TO_CHAR(ZD_DATE, 'dd');
WEEK := TO_CHAR(ZD_DATE, 'WW');
HOUR := TO_CHAR(ZD_DATE, 'HH24');
MINUTE := TO_CHAR(ZD_DATE, 'MI');
Q := TO_CHAR(ZD_DATE, 'Q');
SECONDS := TO_CHAR(ZD_DATE, 'SS');
SN := REPLACE(SN, '%Y', YEARS);
SN := REPLACE(SN, '%y', MINYEAR);
SN := REPLACE(SN, '%M',
SUBSTR('00' || TO_CHAR(MONTHS),
LENGTH('00' || TO_CHAR(MONTHS)) - 1, 2));
SN := REPLACE(SN, '%D',
SUBSTR('00' || TO_CHAR(DAYS),