一個用來生成流水號的存儲過程
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
我們經(jīng)常需要用一個流水號來唯一表示一條數(shù)據(jù),我們有時采用隊列來自動生成一個唯一的流水號,但是采用隊列經(jīng)常不能滿足我們的需求,比如說,這個隊列只能設(shè)定一個最小值,最大值,然后進(jìn)行累加,不能將產(chǎn)生這個流水號的日期包括今這個流水號中;一種類型就要新建一個隊列等。 下面這個存儲過程可以產(chǎn)生一個流水號,它的格式是當(dāng)前日期(格式Y(jié)YYYMMDD)+6位的流水號數(shù)字,不同的類型只要給出一個不同的類型名稱就可以了。在使用這個存儲過程前,要先創(chuàng)建一個表來保存不同的類型,表結(jié)構(gòu)如下: 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 --取系統(tǒng)日期生成需要的字符串 v_Dat := TO_CHAR(SYSDATE,('YYYYMMDD')); --生成產(chǎn)生流水號的序號 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; --修改流水號參數(shù) 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中調(diào)用這個存儲過程,給其設(shè)置一個類型就行了,如下:
CREATE OR REPLACE PROCEDURE p_Test ( ) IS v_serId VARCHAR2(14); BEGIN P_Agt_GetSerialNo ('test',v_serId); --生成流水號,放到變量v_serId中,第一個參數(shù)就是給其設(shè)置的類型了 INSERT INT t_test (testid) VALUES(v_serId);--將產(chǎn)生的流水號插入表中 COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; END; / 該文章在 2011/3/3 16:59:00 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |