Oracle儲存過程之merge into 函式(一)
阿新 • • 發佈:2019-02-06
繼上一篇部落格:Oracle儲存過程遊標使用的merge into 函式的使用。
http://blog.csdn.net/z1729734271/article/details/52351700
本人之前也沒有接觸過Oracle的儲存過程,這些只是最近專案經理讓我參考寫的一些總結,有什麼不好的,不對的希望大家可以提出來。
create or replace package body PG_HOSPITAL_WT_TO_JSQY is
--這個package包裡可以放多個儲存過程
procedure GETHOSPITAL is
begin
merge into T_JSQY_HOSPITAL a --儲存過程的目標表
using (select t.*
from (select v.*,
row_number() over(partition by v.id order by v.lastupdate_ desc nulls last) rnum
from WT_DEPT v where substr(v.dept_class,1,2) not in ('D1','D3','D4','D5') and substr(v.dept_class,1 ,1) not in ('L','K') and v.jgbd in ('211','112') and v.todate_ > '20160701' and v.enabled='1' and v.ZFRQ is null) t
where rnum = 1) e --將查詢出的資訊當做表e
on (a.ORGANCODE = e.id) --限定條件
when matched then --當符合這些條件時 更新
update
set a.organname = e.caption,
a .gbcode = e.dept_adrresscode,
a.address = e.tx_dz,
a.streetcode = substr(e.DEPT_XZJDCODE, 0, 6),
a.genrecode = e.dept_class,
a.managecode = e.dept_code,
a.membershipcode = e.lsgx,
a.WHOUPDATEID = '儲存過程更新',
a.UPDATEDDATE = sysdate,
a.removed = '0'
when not matched then --不符合條件時,插入
insert
(id,
organcode,
organname,
gbcode,
address,
streetcode,
genrecode,
managecode,
membershipcode,
WHOCREATEID,
CREATEDDATE,
REMOVED)
values
(SEQ_ORGID1606.Nextval,
e.id,
e.caption,
e.dept_adrresscode,
e.tx_dz,
substr(e.DEPT_XZJDCODE, 0, 6),
e.dept_class,
e.dept_code,
e.lsgx,
'儲存過程插入',
sysdate,
'0');
exception --異常資訊處理
when others then
dbms_output.put_line('>>>>>>>>>>>>>>>>>>'||sqlerrm);--這個請看下面,具體的我詳細查了一下
commit;
end;
dbms_output.put('a'); --寫入buffer但不輸出
dbms_output.put('b'); --寫入buffer但不輸出
dbms_output.new_line; --回車(換行),輸出
dbms_output.put_line('hello world!'); --輸出並換行
dbms_output.put('d'); --寫入buffer但不輸出
Oracle內建函式SQLCODE和SQLERRM是特別用在OTHERS處理器中,分別用來返回Oracle的錯誤程式碼和錯誤訊息。
OTHERS處理器應該是異常處理塊中的最後的異常處理器,因為它是用來捕獲除了別的異常處理器處理以外的所有的Oracle異常,所以在程式的最外層使用一個OTHERS處理器的話,將可以確保所有的錯誤都會被檢測到。
在一個內在的異常中,SQLCODE返回Oracle錯誤的序號,而SQLERRM返回的是相應的錯誤訊息,錯誤訊息首先顯示的是錯誤程式碼。SQLCODE返回的是負數,除非Oracle的錯誤為“ORA-01403:NO DATA FOUND”(譯:ORA-01403:未找到資料),當Oracle錯誤為“ORA-01403:NO DATA FOUND”時,其對應的SQLCODE為+100。對於使用者自定義的異常,SQLCODE返回的是+1,而SQLERRM返回的是User-Defined Exception。
一個Oracle的錯誤訊息最多隻能包含512個位元組的錯誤程式碼。
如果沒有異常被觸發,則SQLCODE返回0,SQLERRM返回“ORA-0000:normal, successful completion”。
例項
Exception
when osi_general_error then
when OTHERS THEN
out_ErrorMsg := SUBSTR(SQLERRM,1,100);
out_ErrorNbr := ABS(SQLCODE);
此段內容解釋參考部落格:
http://blog.csdn.net/azkaser/article/details/4925084
最近對儲存過程的操作,在我理解,儲存過程是一個SQL語句的集合來完成系統內某些特定的需求,這些需求可以是一個sql搞定的,也可以是多個sql組合完成的。因為最近操作都是十幾萬,幾十萬的資料,運用儲存過程可以大大減少SQL呼叫從而提高我們的執行效率。這些只是我最近接觸的兩種,儲存過程裡面還可以有好多判斷if else之類的,這些判斷都可以大大減少我們的執行SQL的語句,以後再做補充。