引言

    公司内部的项目比较倾向于将业务逻辑放在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. 关于服务器jdk版本和代码编译调试兼容问题

    首先代码是基于哪个版本编写和调试,有没有用到新版本jdk新的特性,类啊接口啊啥的,用到了的话,就不行了 其他都共有的是向下兼容的 最好开发环境的jdk版本和部署环境的jdk版本匹配.

  2. bootstrap-select 使用笔记 设置选中值及手动刷新

    直接笔记: 1.页面刚加载完填充select选项数据时,需要手动刷新一下组件,否则没有选项值.(组件初始化时,li 与 option 分离的,需要刷新一下(据说)) $.post('/cpms/tod ...

  3. myql命令

    ALTER TABLE 表名 DROP COLUMN 列名#删除某一列

  4. select + range + insertNode+offset

    self. cmd.range.selectNodeContents(p[0])   建立选区 self.cmd.select()   选中选区 self.cmd.selection([forceRe ...

  5. loadrunder之脚本篇——接口传参为本地文件

    导言 前几天需要对公司一个专门很重要的接口进行压测,这个还不是重点,重点是传参为本地的图片!刚刚开始通过web_custom_request()函数来解决,可是脚本并不能通过!后面又百度不到答案,通过 ...

  6. Safari通过JavaScript获取系统语言

      IE6 IE7 IE8 Firefox Chrome Safari Opera navigator.language undefined zh-CN zh-CN navigator.userLan ...

  7. linux 网卡buffer大小

    参考截取一部分:https://blog.csdn.net/ysu108/article/details/7764461 在linux下可以修改协议栈改变tcp缓冲相关参数: 修改系统套接字缓冲区 e ...

  8. 【Head First Servlets and JSP】笔记6:什么是响应首部 & 快速搭建一个简单的测试环境

    搭建简单的测试环境 什么是响应首部 最简单的响应首部——Content-Type 设置响应首部 请求重定向与响应首部 在浏览器中查看Response Headers 1.先快速搭建一个简单的测试环境, ...

  9. Shell编程之Linux信号及信号跟踪

    一.Linux信号 1.什么是信号? Linux信号是由一个整数构成的异步消息,它可以由某个进程发给其他进程,也可以在用户按下特定键发生某种异常事件时,由系统发给某个进程. 2.信号列表 [root@ ...

  10. 登陆weblogic后页面控制台卡主

    输入http://localhost:7001/console进入控制页面,能登陆进去,但是登陆进去后页面就马上卡死,可以看到页面头部,其余都显示不出来. 重启后启动访问,能够正常进入,关闭weblo ...