思路:
通過一個流水號表,記錄當前最大的流水號,以便下次取用。每次取號時,將流水號表更新成大的。
涉及的表:
流水號表hp_no:
字段 | 類型 |
TYPE_NAME | VARCHAR2(100) |
START_NO | VARCHAR2(100) |
CURRENT_NO | VARCHAR2(100) |
代碼:
1)通過函數得到最大值。 有三個參數,
第一個參數是類型,便于得到不同的流水號。
第二個參數是前綴,用于在流水號前邊放置特別的字符。
第三個參數是生成的流水號長度。
代碼
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
|
CREATE OR REPLACE FUNCTION Hp_Test_GetNo( P_TYPE_NAME IN VARCHAR2 DEFAULT '' , --類型 參數1 P_START_NO IN VARCHAR2, --前綴 參數2 P_LENGTH IN NUMBER --得到流水號長度 參數3 ) RETURN VARCHAR2 --返回類型 IS V_RESULT VARCHAR2 (100) := '' ; --結果 變量1 V_CURRENT_NO VARCHAR2 (100) := '' ; --當前值 變量2 V_NUM NUMBER := 0; --補值 變量3 V_START_NO VARCHAR2(100); --前綴 變量4 V_ROWID VARCHAR2 (100); --要更新行的RowID 變量4 BEGIN V_START_NO :=P_START_NO; --參數值賦給變量 SELECT COUNT (*) INTO V_NUM FROM HP_NO WHERE TYPE_NAME = P_TYPE_NAME AND START_NO = P_START_NO; --得到類型與前綴相同值的數量,主要用于判斷是否產生過流水號 --判斷是否有資料 沒有則產生初始值插入庫中 IF V_NUM = 0 --沒有記錄過時 THEN V_CURRENT_NO := LPAD ( '1' , P_LENGTH, '0' ); --得到P_length長的0001流水號 V_RESULT := V_CURRENT_NO; --將前綴與流水號相連起來 INSERT INTO HP_NO(TYPE_NAME, START_NO, CURRENT_NO) VALUES (P_TYPE_NAME, P_START_NO, V_CURRENT_NO); --將新的最大值記錄下來 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 ; |
使用存儲過程調用函數的方法:
代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
--調用function存儲過程 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 ; |
結果:
調用存儲過程Hp_Pro_GetTestNo('hp',4);
結果為:hp2016060001
其它思考:
一、新增時無須顯示流水號,如得到得到連續流水號
方法:
采用流水號子表,此表用于保存沒有用過的流水號。當用戶取號時,首選判斷子表是否含有流水號,當有時,取出一個,并刪除此個(防止別另外用戶取用);否則調用主表得到新流水號。
當插入失敗則將當前流水號保存到流水號子表中,供下次取用。
當刪除時,將當前流水號保存到流水號子表中,供下次取用。
二、新增時須顯示流水號,如得到得到連續流水號
方法:
采用流水號子表,此表用于保存沒有用過的流水號。當用戶取號時,首選判斷子表是否含有流水號,當有時,取出一個,并刪除此個(防止別另外用戶取用);否則調用 主表得到新流水號。
當用戶不保存或插入失敗則將當前流水號保存到流水號子表中,供下次取用。
當刪除時,將當前流水號保存到流水號子表中,供 下次取用。