码迷,mamicode.com
首页 > 数据库 > 详细

实现oracle数据库对象的一键升级

时间:2015-03-09 10:41:09      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:

引言

    公司内部的项目比较倾向于将业务逻辑放在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数据库对象的一键升级

标签:

原文地址:http://www.cnblogs.com/caizl/p/4322747.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!