字段 | 類型 |
TYPE_NAME | VARCHAR2(100) |
START_NO | VARCHAR2(100) |
CURRENT_NO | VARCHAR2(100) |
代碼:
1)通過(guò)函數(shù)得到最大值。 有三個(gè)參數(shù),
第一個(gè)參數(shù)是類型,便于得到不同的流水號(hào)。
第二個(gè)參數(shù)是前綴,用于在流水號(hào)前邊放置特別的字符。
第三個(gè)參數(shù)是生成的流水號(hào)長(zhǎng)度。
代碼
CREATE OR REPLACE FUNCTION Hp_Test_GetNo( P_TYPE_NAME IN VARCHAR2 DEFAULT '', --類型 參數(shù)1 P_START_NO IN VARCHAR2, --前綴 參數(shù)2 P_LENGTH IN NUMBER --得到流水號(hào)長(zhǎng)度 參數(shù)3 ) RETURN VARCHAR2 --返回類型 IS V_RESULT VARCHAR2 (100) := ''; --結(jié)果 變量1 V_CURRENT_NO VARCHAR2 (100) := ''; --當(dāng)前值 變量2 V_NUM NUMBER := 0; --補(bǔ)值 變量3 V_START_NO VARCHAR2(100); --前綴 變量4 V_ROWID VARCHAR2 (100); --要更新行的RowID 變量4 BEGIN V_START_NO :=P_START_NO; --參數(shù)值賦給變量 SELECT COUNT (*) INTO V_NUM FROM HP_NO WHERE TYPE_NAME = P_TYPE_NAME AND START_NO = P_START_NO; --得到類型與前綴相同值的數(shù)量,主要用于判斷是否產(chǎn)生過(guò)流水號(hào) --判斷是否有資料 沒(méi)有則產(chǎn)生初始值插入庫(kù)中 IF V_NUM = 0 --沒(méi)有記錄過(guò)時(shí) THEN V_CURRENT_NO := LPAD ('1', P_LENGTH, '0'); --得到P_length長(zhǎng)的0001流水號(hào) V_RESULT := V_CURRENT_NO; --將前綴與流水號(hào)相連起來(lái) INSERT INTO HP_NO(TYPE_NAME, START_NO, CURRENT_NO) VALUES (P_TYPE_NAME, P_START_NO, V_CURRENT_NO); --將新的最大值記錄下來(lái) ELSE SELECT ROWID, CURRENT_NO + 1 INTO V_ROWID, V_CURRENT_NO FROM HP_NO WHERE TYPE_NAME = P_TYPE_NAME AND START_NO = P_START_NO; --得到最大值加1 V_CURRENT_NO := LPAD (V_CURRENT_NO, P_LENGTH, '0'); UPDATE HP_NO SET CURRENT_NO = V_CURRENT_NO WHERE ROWID = V_ROWID; --更新最大值 END IF; IF V_START_NO IS NULL OR V_START_NO='' THEN V_RESULT := V_CURRENT_NO; ELSE V_RESULT :=V_START_NO || V_CURRENT_NO; END IF; RETURN V_RESULT; END;
使用存儲(chǔ)過(guò)程調(diào)用函數(shù)的方法:
代碼
--調(diào)用function存儲(chǔ)過(guò)程 CREATE OR REPLACE PROCEDURE Hp_Pro_GetTestNo ( v_FirstLetter in varchar2, v_Result out varchar2 ) IS v_FirstValue varchar2(30); v_SystDate varchar2(30); BEGIN select to_char(sysdate,'yyyymm') into v_SystDate from dual; v_FirstValue:=(v_FirstLetter || v_SystDate); v_Result:=hp_test_getno('HpTest' ,v_FirstValue,4); END;
結(jié)果:
調(diào)用存儲(chǔ)過(guò)程Hp_Pro_GetTestNo('hp',4);
結(jié)果為:hp2016060001
其它思考:
一、新增時(shí)無(wú)須顯示流水號(hào),如得到得到連續(xù)流水號(hào)
方法:
采用流水號(hào)子表,此表用于保存沒(méi)有用過(guò)的流水號(hào)。當(dāng)用戶取號(hào)時(shí),首選判斷子表是否含有流水號(hào),當(dāng)有時(shí),取出一個(gè),并刪除此個(gè)(防止別另外用戶取用);否則調(diào)用主表得到新流水號(hào)。
當(dāng)插入失敗則將當(dāng)前流水號(hào)保存到流水號(hào)子表中,供下次取用。
當(dāng)刪除時(shí),將當(dāng)前流水號(hào)保存到流水號(hào)子表中,供下次取用。
二、新增時(shí)須顯示流水號(hào),如得到得到連續(xù)流水號(hào)
方法:
采用流水號(hào)子表,此表用于保存沒(méi)有用過(guò)的流水號(hào)。當(dāng)用戶取號(hào)時(shí),首選判斷子表是否含有流水號(hào),當(dāng)有時(shí),取出一個(gè),并刪除此個(gè)(防止別另外用戶取用);否則調(diào)用 主表得到新流水號(hào)。
當(dāng)用戶不保存或插入失敗則將當(dāng)前流水號(hào)保存到流水號(hào)子表中,供下次取用。
當(dāng)刪除時(shí),將當(dāng)前流水號(hào)保存到流水號(hào)子表中,供 下次取用。
標(biāo)簽:周口 甘肅 青島 承德 和田 武漢 固原 開(kāi)封
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Oracle 中生成流水號(hào)的方法》,本文關(guān)鍵詞 Oracle,中,生成,流水,號(hào)的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。