1. 程式人生 > >Oracle儲存過程之merge into 函式(一)

Oracle儲存過程之merge into 函式(一)

繼上一篇部落格: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的語句,以後再做補充。