oracle 中產生流水號 方法

來源:互聯網
上載者:User

思路:

 通過一個流水號表,記錄當前最大的流水號,以便下次取用。每次取號時,將流水號表更新成大的。

涉及的表:

   流水號表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 '',  --類型 參數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;

結果:

   調用預存程序Hp_Pro_GetTestNo('hp',4);

  結果為:hp2010020001

 

其它思考

一、新增時無須顯示流水號,如得到得到連續流水號

 方法:

  採用流水號子表,此表用於儲存沒有用過的流水號。當使用者取號時,首選判斷子表是否含有流水號,當有時,取出一個,並刪除此個(防止別另外使用者取用);否則調用主表得到新流水號。

當插入失敗則將當前流水號儲存到流水號子表中,供下次取用。

當刪除時,將當前流水號儲存到流水號子表中,供下次取用。

二、新增時須顯示流水號,如得到得到連續流水號

方法:

  採用流水號子表,此表用於儲存沒有用過的流水號。當使用者取號時,首選判斷子表是否含有流水號,當有時,取出一個,並刪除此個(防止別另外使用者取用);否則調用 主表得到新流水號。

當使用者不儲存或插入失敗則將當前流水號儲存到流水號子表中,供下次取用。

當刪除時,將當前流水號儲存到流水號子表中,供 下次取用。

 

其它思考的代碼我沒有寫,有興趣的朋友可以自己寫。

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.