通過儲存函式獲取序列

2022-05-08 02:48:09 字數 1382 閱讀 8556

實際應用程式開發過程中,大部分業務表是由程式進行增刪改,為避免衝突通常會配置序列表來配置序列生成規則。也部分表由運維人員進行配置,如系統控制引數等配置,程式不直接做增刪改;

如果當前需求需要新增新的控制引數,由開發人員提供指令碼,運維執行;

通常在插入資料時,主鍵的生成,通常採用的是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;

對於通過業務序列來進行資料手動插入的業務表,使用上述儲存函式來獲取序列值:

通過perf event函式獲取ipc

其實這個問題困擾了蠻久,主要還是不太會用.最後參考git上乙個 搞定了,還是很開心的。直接上 吧 include include include include include include include include include include include include inclu...

通過函式棧空間獲取當前呼叫函式

關於stacktrace的基礎可以參見 stacktrace 頑強的灰太狼 我們在設計日誌模組時通常會記錄兩種資訊 1 軟體執行的業務資料 2 軟體執行的技術引數 如當前呼叫的函式堆疊 一下通過一下方法可以獲取當前呼叫的函式 獲取呼叫函式 1private static string getcall...

如何通過函式名獲取虛函式的位址?

測試環境 win8 vs2012 include include using namespace std class cbase virtual void f virtual void g virtual void h private int x typedef void fun typedef v...