Oracle儲存過程 自定義型別,集合讀取

2021-10-24 22:42:28 字數 3459 閱讀 9951

在實際應用場景中,需要通過儲存過程解決批量錄入,資料處理,批量返回的操作,且業務是實時的,即一次批量資料是一次性的。

針對這個場景,考慮過以下方法:使用臨時快取表,將資料處理後存入,需要使用時讀取並刪除;從其他業務上環節批量錄入或批量返回的壓力

而後確定批量一次資料量在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...