| 字段 | 類型 |
| TYPE_NAME | VARCHAR2(100) |
| START_NO | VARCHAR2(100) |
| CURRENT_NO | VARCHAR2(100) |
代碼:
1)通過函數(shù)得到最大值。 有三個參數(shù),
第一個參數(shù)是類型,便于得到不同的流水號。
第二個參數(shù)是前綴,用于在流水號前邊放置特別的字符。
第三個參數(shù)是生成的流水號長度。
代碼
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 --得到流水號長度 參數(shù)3
)
RETURN VARCHAR2 --返回類型
IS
V_RESULT VARCHAR2 (100) := ''; --結(jié)果 變量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; --參數(shù)值賦給變量
SELECT COUNT (*)
INTO V_NUM
FROM HP_NO
WHERE TYPE_NAME = P_TYPE_NAME AND START_NO = P_START_NO; --得到類型與前綴相同值的數(shù)量,主要用于判斷是否產(chǎn)生過流水號
--判斷是否有資料 沒有則產(chǎn)生初始值插入庫中
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;
使用存儲過程調(diào)用函數(shù)的方法:
代碼
--調(diào)用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;
結(jié)果:
調(diào)用存儲過程Hp_Pro_GetTestNo('hp',4);
結(jié)果為:hp2016060001
其它思考:
一、新增時無須顯示流水號,如得到得到連續(xù)流水號
方法:
采用流水號子表,此表用于保存沒有用過的流水號。當用戶取號時,首選判斷子表是否含有流水號,當有時,取出一個,并刪除此個(防止別另外用戶取用);否則調(diào)用主表得到新流水號。
當插入失敗則將當前流水號保存到流水號子表中,供下次取用。
當刪除時,將當前流水號保存到流水號子表中,供下次取用。
二、新增時須顯示流水號,如得到得到連續(xù)流水號
方法:
采用流水號子表,此表用于保存沒有用過的流水號。當用戶取號時,首選判斷子表是否含有流水號,當有時,取出一個,并刪除此個(防止別另外用戶取用);否則調(diào)用 主表得到新流水號。
當用戶不保存或插入失敗則將當前流水號保存到流水號子表中,供下次取用。
當刪除時,將當前流水號保存到流水號子表中,供 下次取用。