自動取號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);

0 comments on “自動取號AutoEnCode-Oracle Stored Procedures

    1 Pings/Trackbacks 於 "自動取號AutoEnCode-Oracle Stored Procedures"

    發表迴響