一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Oracle - Oracle 中生成流水號的方法

Oracle 中生成流水號的方法

2019-12-28 15:22jerrylsxu Oracle

這篇文章主要介紹了Oracle 中生成流水號的方法 的相關(guān)資料,需要的朋友可以參考下

思路:

通過一個(gè)流水號表,記錄當(dāng)前最大的流水號,以便下次取用。每次取號時(shí),將流水號表更新成大的。

涉及的表:

  流水號表hp_no:  

 

字段 類型
TYPE_NAME VARCHAR2(100)
START_NO VARCHAR2(100)
CURRENT_NO VARCHAR2(100)

 

代碼:

1)通過函數(shù)得到最大值。 有三個(gè)參數(shù),

  第一個(gè)參數(shù)是類型,便于得到不同的流水號。

  第二個(gè)參數(shù)是前綴,用于在流水號前邊放置特別的字符。

  第三個(gè)參數(shù)是生成的流水號長度。

代碼

?
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 '', --類型 參數(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) := ''; --當(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)生過流水號
--判斷是否有資料 沒有則產(chǎn)生初始值插入庫中
IF V_NUM = 0 --沒有記錄過時(shí)
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;

使用存儲(chǔ)過程調(diào)用函數(shù)的方法:

代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
--調(diào)用function存儲(chǔ)過程
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ǔ)過程Hp_Pro_GetTestNo('hp',4);

  結(jié)果為:hp2016060001

其它思考:

一、新增時(shí)無須顯示流水號,如得到得到連續(xù)流水號

方法:

  采用流水號子表,此表用于保存沒有用過的流水號。當(dāng)用戶取號時(shí),首選判斷子表是否含有流水號,當(dāng)有時(shí),取出一個(gè),并刪除此個(gè)(防止別另外用戶取用);否則調(diào)用主表得到新流水號。

當(dāng)插入失敗則將當(dāng)前流水號保存到流水號子表中,供下次取用。

當(dāng)刪除時(shí),將當(dāng)前流水號保存到流水號子表中,供下次取用。

二、新增時(shí)須顯示流水號,如得到得到連續(xù)流水號

方法:

  采用流水號子表,此表用于保存沒有用過的流水號。當(dāng)用戶取號時(shí),首選判斷子表是否含有流水號,當(dāng)有時(shí),取出一個(gè),并刪除此個(gè)(防止別另外用戶取用);否則調(diào)用 主表得到新流水號。

當(dāng)用戶不保存或插入失敗則將當(dāng)前流水號保存到流水號子表中,供下次取用。

當(dāng)刪除時(shí),將當(dāng)前流水號保存到流水號子表中,供 下次取用。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产精品久久网午夜 | 国语精彩对白2021 | 皇上撞着太子妃的秘密小说 | 亚洲精品第一国产综合高清 | 精品国产区一区二区三区在线观看 | 被巨大黑人的翻白眼 | 高清视频在线播放 | 美女视频在线观看视频 | 本站只有精品 | 92国产福利久久青青草原 | 色戒真做gif动图 | free性丰满hd性欧美厨房 | 欧美特级特黄a大片免费 | 国产精品密播放国产免费看 | 欧洲vodafone精品性 | 玩乳h文奶水和尚 | 糖心视频在线观看 | 日韩欧美推理片免费在线播放 | 短篇小说肉 | 色哟约| 骚虎最新网址 | 好涨好大我快受不了了视频网 | 欧美综合色网 | 日韩一级片在线播放 | 免费高清资源黄网站在线观看 | 3d蒂法精品啪啪一区二区免费 | 99视频全部看免费观 | 国产精品永久免费视频 | 国产精品久久久久久久久99热 | 5g影院天天 | 7777色鬼xxxx欧美色夫 | 国产在线98福利播放视频免费 | 精品AV无码一二三区视频 | 爱情岛永久成人免费网站 | 美女脱了内裤让男生玩屁股 | 国产一级毛片国语版 | 国产主播精品在线 | 欧美日韩一二三区免费视频观看 | 国产精品视频1区 | 青草久久精品亚洲综合专区 | 驯服有夫之妇HD中字日本 |