【Oracle】实现Oracle数据库对象的一键升级

引言

    公司内部的项目比较倾向于将业务逻辑放在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的用法。如果您有更好的建议,请评论留言,感激不尽!

 

posted @ 2015-03-09 10:19  Caizl  阅读(356)  评论(0编辑  收藏  举报