思路:
通過一個流水號表,記錄當前最大的流水號,以便下次取用。每次取號時,將流水號表更新成大的。
涉及的表:
流水號表hp_no:
| 欄位 |
類型 |
| TYPE_NAME |
VARCHAR2(100) |
| START_NO |
VARCHAR2(100) |
| CURRENT_NO |
VARCHAR2(100) |
代碼:
1)通過函數得到最大值。 有三個參數,
第一個參數是類型,便於得到不同的流水號。
第二個參數是首碼,用於在流水號前邊放置特別的字元。
第三個參數是產生的流水號長度。
代碼
CREATE OR REPLACE FUNCTION Hp_Test_GetNo(P_TYPE_NAME IN VARCHAR2 DEFAULT '', --類型 參數1P_START_NO IN VARCHAR2, --首碼 參數2P_LENGTH IN NUMBER --得到流水號長度 參數3)RETURN VARCHAR2 --傳回型別ISV_RESULT VARCHAR2 (100) := ''; --結果 變數1V_CURRENT_NO VARCHAR2 (100) := ''; --當前值 變數2V_NUM NUMBER := 0; --補值 變數3V_START_NO VARCHAR2(100); --首碼 變數4V_ROWID VARCHAR2 (100); --要更新行的RowID 變數4BEGINV_START_NO :=P_START_NO; --參數值賦給變數SELECT COUNT (*)INTO V_NUMFROM HP_NOWHERE TYPE_NAME = P_TYPE_NAME AND START_NO = P_START_NO; --得到類型與首碼相同值的數量,主要用於判斷是否產生過流水號--判斷是否有資料 沒有則產生初始值插入庫中IF V_NUM = 0 --沒有記錄過時THENV_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 + 1INTO V_ROWID, V_CURRENT_NOFROM HP_NOWHERE TYPE_NAME = P_TYPE_NAME AND START_NO = P_START_NO; --得到最大值加1V_CURRENT_NO := LPAD (V_CURRENT_NO, P_LENGTH, '0'); UPDATE HP_NOSET CURRENT_NO = V_CURRENT_NOWHERE ROWID = V_ROWID; --更新最大值END IF; IF V_START_NO IS NULL OR V_START_NO='' THENV_RESULT := V_CURRENT_NO;ELSEV_RESULT :=V_START_NO || V_CURRENT_NO;END IF;RETURN V_RESULT;END;
使用預存程序調用函數的方法:
代碼
--調用function預存程序CREATE OR REPLACE PROCEDURE Hp_Pro_GetTestNo(v_FirstLetter in varchar2,v_Result out varchar2)ISv_FirstValue varchar2(30);v_SystDate varchar2(30);BEGINselect 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
其它思考:
一、新增時無須顯示流水號,如得到得到連續流水號
方法:
採用流水號子表,此表用於儲存沒有用過的流水號。當使用者取號時,首選判斷子表是否含有流水號,當有時,取出一個,並刪除此個(防止別另外使用者取用);否則調用主表得到新流水號。
當插入失敗則將當前流水號儲存到流水號子表中,供下次取用。
當刪除時,將當前流水號儲存到流水號子表中,供下次取用。
二、新增時須顯示流水號,如得到得到連續流水號
方法:
採用流水號子表,此表用於儲存沒有用過的流水號。當使用者取號時,首選判斷子表是否含有流水號,當有時,取出一個,並刪除此個(防止別另外使用者取用);否則調用 主表得到新流水號。
當使用者不儲存或插入失敗則將當前流水號儲存到流水號子表中,供下次取用。
當刪除時,將當前流水號儲存到流水號子表中,供 下次取用。