引言

    公司内部的项目比较倾向于将业务逻辑放在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;

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;

3.编写程序实现一键升级

客户端的代码逻辑主要是调用开发库中的p_SYSTEM_UPDATECONTENT_sel得到对象的升级内容,再调用测试库或正式库的p_SYSTEM_UPDATECONTENT_ins执行sql实现升级 ,我是用.net的wpf来实现,逻辑比较简单,就不多说了,最终界面如下:

小结

    上文大致的给出了程序的实现逻辑,主要是利用oracle的dbms_metadata包获取对象的执行sql。其他对象如表,索引,序列等的升级也是类似的实现,相关资料可以查询dbms_metadata的用法。如果您有更好的建议,请评论留言,感激不尽!

【Oracle】实现Oracle数据库对象的一键升级的更多相关文章

  1. oracle学习笔记(十四) 数据库对象 索引 视图 序列 同义词

    数据库对象 用户模式:指数据库用户所创建和存储数据对象的统称.在访问其它用户模式的数据库对象时需加上用户模式. 如:scott.emp, scott.dept等. 数据库对象包括:表.视图.索引.序列 ...

  2. oracle学习笔记(十四) 数据库对象 索引 视图 序列 同义词

    数据库对象 用户模式:指数据库用户所创建和存储数据对象的统称.在访问其它用户模式的数据库对象时需加上用户模式. 如:scott.emp, scott.dept等. 数据库对象包括:表.视图.索引.序列 ...

  3. Oracle学习笔记九 数据库对象

    Oracle 数据库对象又称模式对象,数据库对象是逻辑结构的集合,最基本的数据库对象是表. 其他数据库对象包括:  

  4. oracle 备份数据库对象(存储过程PROCEDURE,FUNCTION,VIEW,TRIGGER...)

    开发过程中,需要不停的备份数据库对象, 特别是存储过程, 每次手动备份不免很低能啊 历经几次修改终于, 完美了,O(∩_∩)O哈哈~      (当然,你也可以再改简便一点~~~) select db ...

  5. 【Java EE 学习 28 上】【oracle学习第二天】【子查询】【集合运算】【几种数据库对象】

    一.子查询 1.为什么要使用子查询:问题不能一步求解或者一个查询不能通过一步查询得到. 2.分类:单行子查询和多行子查询. 3.子查询的本质:一个查询中包含了另外一个或者多个查询. 4.使用子查询的规 ...

  6. Oracle 数据库对象

    数据库对象是数据库的组成部分,常常用CREATE命令进行创建,可以使用ALTER命令修改,用DROP执行删除操作.前面已经接触过的数据库对象有表.用户等. 今天将学习更多的Oracle数据库对象: 同 ...

  7. Oracle数据库对象_同义词

    同义词是一种数据库对象,它是为一个数据库对象定义的别名,使用同义词的主要目的是为了简化SQL语句的书写. 同义词的概念和类型 利用同义词可以为用户的一个对象,或者其他用户的一个对象定义别名,从而简化命 ...

  8. Oracle组函数、多表查询、集合运算、数据库对象(序列、视图、约束、索引、同义词)等

    count组函数:(过滤掉空的字段) select count(address),count(*) from b_user max() avg() min(),sum() select sum(age ...

  9. 关于ORACLE通过file_id与block_id定位数据库对象遇到的问题的一点思考

    在ORACLE中,我们可以通过file_id(file#)与block_id(block#)去定位一个数据库对象(object).例如,我们在10046生成的trace文件中file#=4 block ...

随机推荐

  1. Linux下简单的多线程编程--线程池的实现

    /* 写在前面的话: 今天刚“开原”,选择了一篇关于线程池的文件与大家分享,希望能对您学习有所帮助,也希望能与大家共同学习! 选择在这个特殊的时候注册并发文章也是有一些我个人特殊的意义的,看我的id( ...

  2. Js前台页面搜索

    $("#filter").on("keyup",function(){$(".aimed_list").hide().filter(&quo ...

  3. re模块(Python中的正则表达式)

    re模块 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎 ...

  4. 2.1 使用ARDUINO控制MC20打电话

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  5. SQLServer数据库基本操作,导入Excel数据

    打开SQLServer客户端,连上服务端 先建立数据库,点击新建查询 基本操作如下 创建表 create table mytest ( id int primary key identity(1,1) ...

  6. 20160419 while练习,复习

    10 一.while和if题目练习 . 二.知识拓展 1. C#中的委托是什么?事件是不是一种委托? 答 :    委托可以把一个方法作为参数代入另一个方法.委托可以理解为指向一个函数的引用.     ...

  7. flex 实现图片播放 方案二 把临时3张图片预加载放入内存

    该方案,是预加载:前一张,当前,下一张图片,一共3张图片放入内存中.这样对内存的消耗可以非常小,加载之后的图片就释放内存. 下面示例一个是类ImagePlayers,一个是index.mxml pac ...

  8. JAVA中的Token 基于Token的身份验证

    最近在做项目开始,涉及到服务器与安卓之间的接口开发,在此开发过程中发现了安卓与一般浏览器不同,安卓在每次发送请求的时候并不会带上上一次请求的SessionId,导致服务器每次接收安卓发送的请求访问时都 ...

  9. vue 项目结构说明

    eslink:规范es6的代码风格检测工具. npm install node-sass -g :全局安装,即使安装之后可以全局使用dode-sass,不用进到工具目录. .babel:把es6转换成 ...

  10. python中编写带参数decorator

    考察上一节的 @log 装饰器: def log(f): def fn(x): print 'call ' + f.__name__ + '()...' return f(x) return fn 发 ...