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

發表迴響