實際應用程式開發過程中,大部分業務表是由程式進行增刪改,為避免衝突通常會配置序列表來配置序列生成規則。也部分表由運維人員進行配置,如系統控制引數等配置,程式不直接做增刪改;
如果當前需求需要新增新的控制引數,由開發人員提供指令碼,運維執行;
通常在插入資料時,主鍵的生成,通常採用的是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...