在實際應用場景中,需要通過儲存過程解決批量錄入,資料處理,批量返回的操作,且業務是實時的,即一次批量資料是一次性的。
針對這個場景,考慮過以下方法:使用臨時快取表,將資料處理後存入,需要使用時讀取並刪除;從其他業務上環節批量錄入或批量返回的壓力
而後確定批量一次資料量在200條內,此儲存的呼叫比較頻繁,存在被多處呼叫的情況。
考慮實際,如果使用臨時表頻繁讀寫刪資料,可能會出現鎖資料的情況;在業務上通過其他環節來找補也是下策。
最後確定了使用自定義資料型別和型別集合快取處理好的資料,整體方案:將錄入的格式約定成字串,資料處理後快取在集合,最後游標遍歷集合返回資料。
自定義資料格式型別
-- 定義需要的資料型別,類似程式設計中的類
create
orreplace
type check_record
is object(p_id number,v_code varchar2(2)
,v_message nvarchar2(50)
)-- 定義型別的集合,類似程式設計中的列表
create
orreplace
type prescriptioncheck_table
istable
of prescriptioncheck_record
使用自定義型別,並通過游標返回型別列表資訊
create
orreplace
procedure p_check_refund_state (
in_str varchar2,
--輸入字串,格式:型別,id;型別,id...
scur out sys_refcursor -- 返回值)is
--臨時變數
v_tempstr varchar
(1000);
-- 快取解析字串
v_temp_in_str varchar
(1000);
-- 快取輸入字串
v_count_begin int
;-- 臨時計數
v_count_end int
;-- 臨時計數
v_type number;
--型別 檢查申請 = 5,病理申請 = 6, **申請 =7, 檢驗申請 = 8,手術申請 =9,用血申請 = 10,其他 = 99
v_id number;
--id
v_code varchar(2
);-- 返回值臨時快取
v_message varchar
(255);
-- 返回資訊臨時快取
datatab check_table := check_table();
-- 自定義型別的返回集合
begin
if(in_str is
notnull
and length(in_str)
>0)
then
v_temp_in_str := in_str;
loop
--迴圈解析字串
datatab.extend;
-- 擴充一條
datatab(datatab.count) := check_record(-1
,0,'傳入第'
|| datatab.count ||
'條資料有誤!');
--判斷『;』有無,若無取全部字串,反之前取到第乙個分號前位置。
if(instr(v_temp_in_str,
';',1,
1)!=0
)then
v_tempstr := substr(v_temp_in_str,
0,instr(v_temp_in_str,
';',1,
1));
else
v_tempstr := v_temp_in_str;
endif
; v_count_end := length(v_tempstr)
;--解析目標字串
--判斷','進行型別與id的分取,
if(instr(v_tempstr,
',',1,
1)!=0
)then
v_count_begin := instr(v_tempstr,
',',1,
1); v_type := to_number(substr(v_tempstr,
0,v_count_begin-1)
);if(instr(v_tempstr,
';',1,
1)!=0
)then
v_id := to_number(substr(v_tempstr,v_count_begin+
1,v_count_end-v_count_begin-1)
);else
v_id := to_number(substr(v_tempstr,v_count_begin+
1,v_count_end));
endif
;-- 單條業務資料處理
p_check_one_state(v_type,v_id,v_code,v_message)
;-- 將處理後資料放入自定義集合
datatab(datatab.count) := check_record(v_id,v_code,v_message)
;endif;
v_count_begin := length(v_temp_in_str)
;--丟棄解析過的字串
if(v_count_begin != v_count_end)
then
v_temp_in_str := substr(v_temp_in_str,v_count_end+
1,v_count_begin)
;else
v_temp_in_str :='';
endif
;exit
when v_temp_in_str is
null
or length(v_temp_in_str)=0
;end
loop
;endif;
-- 遍歷集合,資料返回
open scur for
select
*from
table
(datatab)
;-- 異常處理
exception
when others then
open scur for
select
*from
table
(datatab)
;end
;
ORACLE 自定義分頁儲存過程
一 建立包 create orreplace package pkg jk lab basic istype cursor type is ref cursor procedure sp get pagination pi tablename invarchar2,表名 pi where in va...
oracle儲存過程和自定義函式
學習中遇到的相關問題plsql是什麼?資料庫的物件 表 檢視 索引 序列 同義詞 儲存過程 儲存函式。儲存過程和儲存函式 指儲存在資料庫中供所有使用者程式呼叫的子程式叫儲存過程 儲存函式。相同點 完成特定功能的程式。區別 是否用return語句返回值。儲存函式可以通過return返回值,而儲存過程不...
oracle自定義型別
1 定義乙個型別 sql create or replace type propertyvalue as object number value number,string value varchar2 2000 date value date,member function getnumberva...