標籤:
引言
公司內部的項目比較傾向於將商務邏輯放在oracle預存程序中實現,所以每次項目升級都涉及到很多的oracle表,預存程序等資料庫物件的升級。然而採取的升級方式是比較"原始"的,每一個對象都是從開發庫拷貝內容,再到測試庫,正式庫中黏貼,執行。這樣的方式,工作量大而繁瑣,容易出錯出漏。為此,我編寫了一個小程式,實現oracle對象的一鍵升級。下面給出主要實現邏輯。
1.擷取對象的執行sql語句
利用oracle的dbms_metadata包來擷取相關對象的執行語句,用oracle預存程序來實現。對象名作為輸入參數,返回參數為包含執行sql的遊標,主要代碼如下:
create or replace procedure p_SYSTEM_UPDATECONTENT_sel(in_vc_name in varchar2,RETURNMSG OUT Varchar2, retcursor out Sys_Refcursor )is retcon clob; vc_name varchar2(1000); RETTYPE varchar2(1000):=‘‘; begin RETURNMSG:=‘‘; vc_name:=upper(in_vc_name); begin select dbms_metadata.get_ddl(‘PROCEDURE‘,vc_name) INTO retcon FROM DUAL; RETTYPE:=‘預存程序‘; Exception When Others Then null; end; if RETTYPE is not null then open retcursor for select retcon as retcontent,in_vc_name as prcname,RETTYPE as RETURNTYPE from dual ; else RETURNMSG:=‘不存在此名稱相關內容!‘; open retcursor for select ‘‘ as retcontent ,in_vc_name as prcname, ‘‘ as RETURNTYPE from dual; end if ; Exception When Others Then open retcursor for select ‘‘ as retcontent ,in_vc_name as prcname, ‘‘ as RETURNTYPE from dual; RETURNMSG:=f_Get_Errormsg;end p_SYSTEM_UPDATECONTENT_sel;
View Code
2.執行對象sql語句
在預存程序中利用execute immediate直接執行sql語句,實現對象的升級,主要代碼如下:
create or replace procedure p_SYSTEM_UPDATECONTENT_ins(in_VC_CONTENT in clob, --提交內容RETURNMSG OUT Varchar2 ) is vc_oldstr clob:=‘select 1 from dual‘; v_name varchar2(100); n_issuc number(1):=1; vc_ret varchar2(1000);begin v_name:=upper(in_vc_name); begin execute immediate in_VC_CONTENT; Exception When Others Then select ‘編譯出錯:‘||wm_concat(‘在‘||t.line||‘行,‘||t.text||‘ ‘) into vc_ret from DBA_ERRORS t where t.name =v_name; -- dbms_output.put_line(vc_ret); n_issuc:=0; execute immediate vc_oldstr; else vc_ret:=‘編譯出錯:‘||f_Get_Errormsg; n_issuc:=0; end; commit; RETURNMSG:=replace(replace(replace(replace(vc_ret,‘<‘,‘‘),‘>‘,‘‘),‘&‘,‘‘),‘"‘,‘‘); Exception When Others Then rollback; RETURNMSG:=f_Get_Errormsg; end p_SYSTEM_UPDATECONTENT_ins;
View Code
3.編寫程式實現一鍵升級
用戶端的代碼邏輯主要是調用開發庫中的p_SYSTEM_UPDATECONTENT_sel得到對象的升級內容,再調用測試庫或正式庫的p_SYSTEM_UPDATECONTENT_ins執行sql實現升級 ,我是用.net的wpf來實現,邏輯比較簡單,就不多說了,最終介面如下:
小結
上文大致的給出了程式的實現邏輯,主要是利用oracle的dbms_metadata包擷取對象的執行sql。其他對象如表,索引,序列等的升級也是類似的實現,相關資料可以查詢dbms_metadata的用法。如果您有更好的建議,請評論留言,感激不盡!
實現oracle資料庫物件的一鍵升級