前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个用来生成流水号的存储过程

一个用来生成流水号的存储过程

作者头像
源哥
发布2018-08-28 11:14:28
4490
发布2018-08-28 11:14:28
举报

我们经常需要用一个流水号来唯一表示一条数据,我们有时采用队列来自动生成一个唯一的流水号,但是采用队列经常不能满足我们的需求,比如说,这个队列只能设定一个最小值,最大值,然后进行累加,不能将产生这个流水号的日期包括今这个流水号中;一种类型就要新建一个队列等。 下面这个存储过程可以产生一个流水号,它的格式是当前日期(格式YYYYMMDD)+6位的流水号数字,不同的类型只要给出一个不同的类型名称就可以了。在使用这个存储过程前,要先创建一个表来保存不同的类型,表结构如下: create table T_GENID (   CLASS   NUMBER(2) not null,   GENDATE CHAR(8) not null,   ID      VARCHAR2(12) not null ) tablespace SERVICE_MAIN_DAT   pctfree 10   pctused 80   initrans 1   maxtrans 255   storage   (     initial 1M     next 1M     minextents 1     maxextents unlimited     pctincrease 0   ); -- Create/Recreate primary, unique and foreign key constraints alter table T_GENID   add constraint PK_GENID primary key (CLASS,ID)   using index   tablespace SERVICE_MAIN_IDX   pctfree 10   initrans 2   maxtrans 255   storage   (     initial 1M     next 1M     minextents 1     maxextents unlimited     pctincrease 0   );

存储过程如下: CREATE OR REPLACE PROCEDURE p_GetSerialNo (   i_Type                  IN     VARCHAR2,           --流水号的类型   o_SerialNo              OUT    VARCHAR2            --返回流水号 ) IS   v_Dat                          VARCHAR2(10);   v_SerialNum                    NUMBER(7); BEGIN   --取系统日期生成需要的字符串   v_Dat := TO_CHAR(SYSDATE,('YYYYMMDD'));

  --生成产生流水号的序号   BEGIN     SELECT Decode(GENDATE,v_Dat,(ID+1),1)       INTO v_SerialNum       FROM T_GENID WHERE CLASS=i_Type FOR UPDATE;   EXCEPTION     WHEN NO_DATA_FOUND THEN       v_SerialNum:= 1;       INSERT INTO T_GENID(CLASS,GENDATE,ID)         VALUES (i_Type,v_Dat,v_SerialNum);

    WHEN TOO_MANY_ROWS THEN       SELECT NVL(MAX(ID)+1,1)         INTO v_SerialNum         FROM T_GENID WHERE CLASS=i_Type;

      DELETE t_AGT_GENID WHERE CLASS=i_Type;       INSERT INTO T_GENID(CLASS,GENDATE,ID)         VALUES (i_Type,v_Dat,v_SerialNum);   END;

  --修改流水号参数   UPDATE T_GENID      SET GENDATE = v_Dat,          ID = v_SerialNum WHERE CLASS=i_Type;   COMMIT;   --得到需要的流水号   o_SerialNo := v_Dat||Lpad(v_SerialNum,6,'0'); EXCEPTION   WHEN OTHERS THEN     o_SerialNo := NULL; END; /

使用方法很简单,就是在pl/sql中调用这个存储过程,给其设置一个类型就行了,如下: CREATE OR REPLACE PROCEDURE p_Test ( ) IS   v_serId VARCHAR2(14); BEGIN   P_Agt_GetSerialNo ('test',v_serId);   --生成流水号,放到变量v_serId中,第一个参数就是给其设置的类型了   INSERT INT t_test (testid) VALUES(v_serId);--将产生的流水号插入表中   COMMIT; EXCEPTION   WHEN OTHERS THEN     ROLLBACK; END; /

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2005年03月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档