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