自動取號AutoEnCode-Oracle Stored Procedures

Oracle裡並沒有像MySql那樣子有自動編號的功能,

如果需要產生不重覆的編號,這時就需要自己動手來做了,

大概的方法有二,不過概念基本上是相同的,

想法,利用一個Table存放編號資料,例如檔頭碼長取號的來源(那一個Table)

每次需要取號時則跟此Table要資訊,並把碼長+1存放回去,順便回傳碼長+1

可以利用程式來編寫或是直接在Oracle上寫Sotre Procedures或function

比較建議在Oracle上直接撰寫sp,這樣子不管是其它的SP或是Server上的程式二者均可使用,

不需要另外再行撰寫

底下是一個Sotre Procedures的範例

輸入執為(取號的來源),輸出執為編號

存放的Table為AUTOENCODE 其中

CODE_COUNT 為碼號

CODE_HEAD 檔頭

CODE_MAX 最大長度(碼號的長度)

create or replace 
PROCEDURE          "AUTOCODE" ( C_TYPE IN VARCHAR2, C_COUNT OUT VARCHAR2) 
IS 
  --rowTYPE AUTOENCODE%TYPE; 
  data_RAW NUMBER; 
  data_HEAD VARCHAR2(2); 
  data_MAX NUMBER ; 
  str_ZERO VARCHAR2(10); 
  str_TEMP VARCHAR2(20); 
  
  cursor cursor_AUTO IS 
      select *  from AUTOENCODE where CODE_TYPE = C_TYPE; 
  rec_AUTO AUTOENCODE%ROWTYPE; 
  
  
  
  def_DATE DATE; 
  exp_error EXCEPTION; 
BEGIN 
    C_COUNT := -1; 
    def_DATE := sysdate; 
    data_RAW := -1; 
    str_ZERO := '0000000000'; 
    
    
    open cursor_AUTO; 
    loop 
        fetch cursor_AUTO into rec_AUTO; 
        exit when cursor_AUTO%NOTFOUND; 
        data_RAW := rec_AUTO.CODE_COUNT + 1; 
        data_HEAD := rec_AUTO.CODE_HEAD ; 
        data_MAX := rec_AUTO.CODE_MAX ; 
    end loop;  
    close cursor_AUTO; 
    
    update AUTOENCODE SET CODE_COUNT = data_RAW, 
                          CODE_DATE = def_DATE 
                          where CODE_TYPE = C_TYPE; 
    str_TEMP := (str_ZERO || TO_CHAR(data_RAW));          
    C_COUNT := SUBSTR(str_TEMP,- data_MAX,data_MAX );   
    
    IF data_HEAD IS NOT NULL THEN 
      C_COUNT := data_HEAD || C_COUNT; 
    END IF; 
    
    commit; 
    EXCEPTION 
     when Others then 
      rollback; 
      raise_application_error(-20000, 'autoencode Error'); 
    commit; 
END ;

Oracle call sp的方式如下:

Call AUTOCODE(“MyType”, outText);

One thought to “自動取號AutoEnCode-Oracle Stored Procedures”

發表迴響