如果需要產生不重覆的編號,這時就需要自己動手來做了,
大概的方法有二,不過概念基本上是相同的,
想法,利用一個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”