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;
使用存储过程调用函数的方法:
代码
--调用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;