caizl

引言

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

 

分类:

技术点:

相关文章:

  • 2021-12-05
  • 2021-12-05
  • 2021-04-30
  • 2021-12-03
  • 2021-06-29
  • 2021-12-05
  • 2022-12-23
  • 2021-09-12
猜你喜欢
  • 2021-08-10
  • 2022-12-23
  • 2022-12-23
  • 2021-09-28
  • 2021-11-23
  • 2021-12-15
  • 2021-09-08
相关资源
相似解决方案