實際應用程式開發過程中,大部分業務表是由程式進行增刪改,為避免衝突通常會配置序列表來配置序列生成規則。也部分表由運維人員進行配置,如系統控制參數等配置,程式不直接做增刪改; 如果當前需求需要新增新的控制參數,由開發人員提供腳本,運維執行; 通常在插入數據時,主鍵的生成,通常採用的是max(t.id) ...
實際應用程式開發過程中,大部分業務表是由程式進行增刪改,為避免衝突通常會配置序列表來配置序列生成規則。也部分表由運維人員進行配置,如系統控制參數等配置,程式不直接做增刪改;
如果當前需求需要新增新的控制參數,由開發人員提供腳本,運維執行;
通常在插入數據時,主鍵的生成,通常採用的是max(t.id)+1,可能會出現序列表的值小於數據表值情況,導致實際程式運行獲取序列插入主鍵衝突的情況。
CREATE OR REPLACE FUNCTION F_SEQUENCE(i_busi_serial_name in VARCHAR2, i_num in NUMBER) return number is
V_CURRENT NUMBER(15);
PRAGMA AUTONOMOUS_TRANSACTION;
begin
begin
select A.SEQUENCE INTO V_CURRENT from CAREFX_TABLE_SEQ A WHERE A.TABLE_NAME = i_busi_serial_name for update;
exception
//當序列表(CAREFX_TABLE_SEQ)不存在該表序列數據時,插入序列記錄;
when NO_DATA_FOUND THEN
INSERT INTO CAREFX_TABLE_SEQ(TABLE_NAME,SEQUENCE) values (i_busi_serial_name,1);
--查詢出當前序列值
select A.SEQUENCE INTO V_CURRENT from CAREFX_TABLE_SEQ A WHERE A.TABLE_NAME = i_busi_serial_name for update;
END;
//將當前序列表對應序列值+1;
UPDATE CAREFX_TABLE_SEQ A SET A.SEQUENCE = A.SEQUENCE + DECODE(i_num,NULL,1,i_num) WHERE A.TABLE_NAME = i_busi_serial_name;
COMMIT;
//返回查詢的序列值;
return(V_CURRENT);
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
return NULL;
end F_SEQUENCE_GEN;
CAREFX_TABLE_SEQ:序列表
存在序列表配置的業務表:
使用 select f_sequence_gen('BI',1) FROM DUAL,替換 SELECT max(t.id)+1 FROM bi t;
對於通過業務序列來進行數據手動插入的業務表,使用上述存儲函數來獲取序列值: