各位用户为了找寻关于ORACLE实现自定义序列号生成的方法的资料费劲了很多周折。这里教程网为您整理了关于ORACLE实现自定义序列号生成的方法的相关资料,仅供查阅,以下为您介绍关于ORACLE实现自定义序列号生成的方法的详细内容
实际工作中,难免会遇到序列号生成问题,下面就是一个简单的序列号生成函数
(1)创建自定义序列号配置表如下:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23--自定义序列
create
table
S_AUTOCODE
(
pk1 VARCHAR2(32)
primary
key
,
atype VARCHAR2(20)
not
null
,
owner VARCHAR2(10)
not
null
,
initcycle
CHAR
(1)
not
null
,
cur_sernum VARCHAR2(50)
not
null
,
zero_flg
VARCHAR
(2)
not
null
,
sequencestyle VARCHAR2(50),
memo VARCHAR2(60)
);
-- Add comments to the columns
comment
on
column
S_AUTOCODE.pk1
is
'主键'
;
comment
on
column
S_AUTOCODE.atype
is
'序列号类型'
;
comment
on
column
S_AUTOCODE.owner
is
'序列号所有者'
;
comment
on
column
S_AUTOCODE.initcycle
is
'序列号递增'
;
comment
on
column
S_AUTOCODE.cur_sernum
is
'序列号'
;
comment
on
column
S_AUTOCODE.zero_flg
is
'序列号长度'
;
comment
on
column
S_AUTOCODE.sequencestyle
is
'序列号样式'
;
comment
on
column
S_AUTOCODE.memo
is
'备注'
;
-- Create/Recreate indexes
create
index
PK_S_AUTOCODE
on
S_AUTOCODE (ATYPE, OWNER);
(2)初始化配置表,例如:
代码如下: insert into s_autocode (PK1, ATYPE, OWNER, INITCYCLE, CUR_SERNUM, ZERO_FLG, SEQUENCESTYLE, MEMO) values ('0A772AEDFBED4FEEA46442003CE1C6A6', 'ZDBCONTCN', '012805', '1', '200000', '7', '$YEAR$年$ORGAPP$质字第$SER$号', '质押合同中文编号');
(3)自定义序列号生成函数:
创建函数:SF_SYS_GEN_AUTOCODE
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
CREATE
OR
REPLACE
FUNCTION
SF_SYS_GEN_AUTOCODE(
I_ATYPE
IN
VARCHAR2, /*序列类别*/
I_OWNER
IN
VARCHAR2 /*序列所有者*/
)
RETURN
VARCHAR2
IS
/**************************************************************************************************/
/*
PROCEDURE
NAME
: SF_SYS_GEN_AUTOCODE */
/* DEVELOPED
BY
: WANGXF */
/* DESCRIPTION : 主要用来生成自定义的序列号 */
/* DEVELOPED
DATE
: 2016-10-08 */
/* CHECKED
BY
: */
/*
LOAD
METHOD : F1-
DELETE
INSERT
*/
/**************************************************************************************************/
O_AUTOCODE VARCHAR2(100); /*输出的序列号*/
V_INITCYCLE S_AUTOCODE.INITCYCLE%TYPE; /*序列号递增*/
V_CUR_SERNUM S_AUTOCODE.CUR_SERNUM%TYPE; /*序列号*/
V_ZERO_FLAG S_AUTOCODE.ZERO_FLG%TYPE; /*序列号长度*/
V_SEQUENCESTYLE S_AUTOCODE.SEQUENCESTYLE%TYPE;/*序列号样式*/
V_SEQ_NUM VARCHAR2(100); /*本次序列号*/
V_DATE_YEAR
CHAR
(4); /*年份,如2016*/
V_DATE_YEAR_MONTH
CHAR
(6); /*年份月份,如201610*/
V_DATE_DATE
CHAR
(8); /*年份月份日,如20161008*/
V_DATE_DATE_ALL
CHAR
(14); /*完整年份序列,如20161008155732*/
/*
支持的参数序列:
$
YEAR
$
--> 年份
$YEAR_MONTH$
--> 年份+月份,不含汉子
$
DATE
$
--> 年份+月份+日期,不含汉子
$DATE_ALL$
--> 完整日期,不含汉子
$ORGAPP$
--> 所有者
$SER$
--> 当前序列号
*/
--解决查询事务无法执行DML的问题
Pragma Autonomous_Transaction;
BEGIN
-- 查询复核条件的序列号配置
SELECT
T.INITCYCLE,
T.CUR_SERNUM,
T.ZERO_FLG,
T.SEQUENCESTYLE
INTO
V_INITCYCLE,V_CUR_SERNUM,V_ZERO_FLAG,V_SEQUENCESTYLE
FROM
S_AUTOCODE T
WHERE
T.ATYPE=I_ATYPE
AND
T.OWNER=I_OWNER ;
--格式化当前日期
SELECT
TO_CHAR(SYSDATE,
'yyyy'
),
TO_CHAR(SYSDATE,
'yyyyMM'
),
TO_CHAR(SYSDATE,
'yyyyMMdd'
),
TO_CHAR(SYSDATE,
'yyyyMMddHH24MISS'
)
INTO
V_DATE_YEAR,V_DATE_YEAR_MONTH,V_DATE_DATE,V_DATE_DATE_ALL
FROM
DUAL;
-- 日期处理
O_AUTOCODE :=
REPLACE
(V_SEQUENCESTYLE,
'$YEAR$'
,V_DATE_YEAR);
O_AUTOCODE :=
REPLACE
(O_AUTOCODE,
'$YEAR_MONTH$'
,V_DATE_YEAR_MONTH);
O_AUTOCODE :=
REPLACE
(O_AUTOCODE,
'$DATE$'
,V_DATE_DATE);
O_AUTOCODE :=
REPLACE
(O_AUTOCODE,
'$DATE_ALL$'
,V_DATE_DATE_ALL);
--所有者处理
O_AUTOCODE :=
REPLACE
(O_AUTOCODE,
'$ORGAPP$'
,I_OWNER);
--序号处理
V_SEQ_NUM := TO_CHAR(TO_NUMBER(V_CUR_SERNUM)+TO_NUMBER(V_INITCYCLE));
--反写当前序列号,确保每次都是递增
UPDATE
S_AUTOCODE T
SET
T.CUR_SERNUM=V_SEQ_NUM
WHERE
T.ATYPE=I_ATYPE
AND
T.OWNER=I_OWNER ;
--不满足长度的前面补0
IF LENGTH(V_SEQ_NUM) < TO_NUMBER(V_ZERO_FLAG)
THEN
/*
LOOP
V_SEQ_NUM :=
'0'
||V_SEQ_NUM;
EXIT
WHEN
LENGTH(V_SEQ_NUM) = TO_NUMBER(V_ZERO_FLAG);
END
LOOP;
*/
V_SEQ_NUM := LPAD(V_SEQ_NUM,TO_NUMBER(V_ZERO_FLAG),
'0'
);
END
IF;
O_AUTOCODE :=
REPLACE
(O_AUTOCODE,
'$SER$'
,V_SEQ_NUM);
COMMIT
;
RETURN
O_AUTOCODE;
EXCEPTION
--如果没有对应的配置项,则返回ERROR值
WHEN
NO_DATA_FOUND
THEN
ROLLBACK
;
DBMS_OUTPUT.put_line(
'there is no config as you need...'
);
RETURN
'ERROR'
;
END
SF_SYS_GEN_AUTOCODE;
(4)测试:
配置项:$YEAR$年$ORGAPP$质字第$SER$号
代码如下: SELECT SF_SYS_GEN_AUTOCODE('ZDBCONTCN','012805') FROM DUAL;
(5) 结果
2016年012805质字第0200001号
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。