實現oracle資料庫物件的一鍵升級

來源:互聯網
上載者:User

標籤:

引言

    公司內部的項目比較傾向於將商務邏輯放在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資料庫物件的一鍵升級

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.