`

亲自体验oracle转mysql

阅读更多

在下小小程序员,现在正在做oracle转向mysql,就是把oracle数据库上的所有表结构,视图,存储过程,函数,包等等等都转到mysql中,现在留下一点点记录,不对之处希望各位能够指出,也很希望一起分享你的经验:

 

 

表之间的转换,如果暂不说其中调用的函数,还是没什么问题的,因为使用的非常规类型很少

 

视图之间的转换出了不少问题:

oracle 支持的子表,例如:

 

select * from dept, (select * from emp where emp.sal>8000) where dept.id = emp.deptid

 

 mysql不支持子表,所以较为简单的转换方法为左连表

 

select * from dept left emp on emp.sal>8000 where dept.id = emp.deptid

 

 

oracle 最常用的左连表 emp.deptid = emp.id(+) 的 (+)

 

select * from emp, (select * from dept where dept.no = 10) where emp.deptid = emp(+)

 

mysql当然没有这个(+),所以都要改为left join

但是mysql支持这种写法:

 

 

select * from emp left join (dept , company, province) on (emp.deptid = dept.id and emp.companyid = company.id and emp.provinceid = province.id) -- 可以简化left join写法,但是感觉上没有(+)写的方便

 

--------------------------------------------------------------

 

上边的知识虽然看似无华,单支持了mysql最大的弱点,就是试图机制不完善;不同于oracle的视图概念-优化的sql语句,mysql的查询sql语句有时是不能写在视图中的。我知识抛砖引玉,优秀的程序员应该不止单单会看懂代码滴。我是sb,这只是我的一点sb的解释。

 

--------------------------------------------------------------

 

ok,废话少说

 

 

oracle 还有一强大之处就是其分析函数,相比用过oracle的个人新老用户们,多多少少都接触过。

 

oracle有如下代码:

select *
  from (select pt.xmid,pt.xmmc,mast.dmnr,ct.KHQC ,pt.jhks ,pt.jhjs ,pt.xmzje,
               rank() over(partition by pt.xmid order by pt.xmbbh desc) rn
          from T_LPROMIS_XMGL_GBBXMXX pt,T_LPROMIS_YXGL_KHXX ct,t_lpromis_base_mast mast 
         where pt.xmid in (select ct.xmid from T_LPROMIS_YXGL_HTXX ct)
           and mast.DMBH = pt.CWLX 
           and mast.dmlb = '0114'
           and pt.khid = ct.id
           and extract(year from pt.xmjhjssj) > extract(year from sysdate)) t
 where t.rn = 1

 这样就可以取符合条件中每个项目(pt.xmid)中版本(pt.xmbbh)最大的一条记录

 

而mysql中,没有如rank() dense_rank() row_number()等等这些可以带over([partition by xx][order by xx])分析函数. 但是可以用它伟而大的用户变量解决

 

SELECT
	t.xmid,
	t.ssbmid,
	t.xmmc,
	t.dmnr,
	t.KHQC,
	t.XMJHKSSJ,
	t.XMJHJSSJ,
	t.xmzje
FROM
	(
		SELECT
			t1.xmid,
			t1.ssbmid,
			t1.xmmc,
			mast.dmnr,
			ct.KHQC,
			t1.XMJHKSSJ,
			t1.XMJHJSSJ, 
			t1.xmzje ,
		IF (
			@pro_id = t1.xmid ,@rk := @rk + 1 ,@rk := 1
		) AS rank,
		@pro_id := t1.xmid -- rank() over(partition by pt.xmid order by pt.xmbbh desc) rn
	FROM
t_lpromis_base_mast mast,
	(
		SELECT
			@rownum := 0 ,@pro_id := NULL,
			@rk := 0
	) init,
		(
			SELECT
				*
			FROM
				T_LPROMIS_XMGL_GBBXMXX pt
			ORDER BY
				pt.xmid,
				pt.xmbbh
		) t1
	LEFT JOIN T_LPROMIS_YXGL_KHXX ct ON t1.khid = ct.ID
	
WHERE
	t1.xmid IN (
		SELECT
			ct.xmid
		FROM
			T_LPROMIS_YXGL_HTXX ct
	)
AND mast.DMBH = t1.CWLX 
AND mast.dmlb = '0114' 
and extract(year from t1.xmjhjssj) =
extract(year from now()) + 1
	) t 
where t.rank = 1
 

 

-----------------------------------------------------------------------------------

 

这里再给出一些小小的tip,看之无害,也可能没用

 

做分页mysql 有 limited; oracle 用 rownum

 

时间类型mysql 有 date datetime stamptime time 等等, 而且可以直接比较; oracle 则要用 to_data取比较

 

oracle的函数可以返回record; mysql还没有找到可以返回对应的方法;

 

oracle的函数可以使用管道,返回table, 代码如下; mysql还没有找到对应方法

 

create type human_record_type is object(compyname nvarchar2(40),deptname nvarchar2(40));
 create type human_table_type is table of human_record_type;   
 create or replace function get_human_resource return human_table_type pipelined as
 hr human_record_type;
 begin
   for myrow in (select * from t_lpromis_hr_bm) loop -- loop record of data to pipe row information
     hr := human_record_type(myrow.comy,myrow.dept)
     pipe row(hr);
   end loop;
   return ;
 end;     

 

简易调用:

select * from table(get_human_resource)

 

 

----------------------------------------------------------------------------------------------------

 

未完

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

未完

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    通用数据库转换工具(礼光-新德利-欧凯).rar

    《通用数据库转换工具:礼光、新德利与欧凯的智慧结晶》 在信息化高度发展的今天,数据已经成为企业...通过安装并使用通用数据库转换工具(礼光-新德利-欧凯).exe文件,用户可以亲自体验这一强大工具带来的便利和高效。

    java代码自动生成工具

    这一款绿色版的自动生成工具(解压打开Java代码生成工具2.0.exe即可), 可以自动读取数据库表,勾选程序中需要操作的的表,自动生成一个struts1+spring...支持oracle、mysql、db2、sqlserver 操作简单遍历,大家可亲自体验。

    TMS Component Pack 8.3.4.0 D7-RAD10.2 Tokyo BAT安装版+亲自安装测试

    - **数据库组件**:包括数据库连接组件、数据访问组件,支持多种数据库系统,如SQL Server、Oracle、MySQL等,使得数据库操作更加简便。 - **Web和移动开发组件**:针对现代跨平台开发需求,TMS提供了HTML5控件、...

    fast report

    通过"fr_studio_demo.exe"这个文件,用户可以下载并安装Fast Report的演示版,亲自体验其强大的报表设计和开发能力。在实际使用过程中,用户可以根据需求选择是否购买完整版本,以获取更多专业特性和服务支持。 总...

    DbVisualizer.v6.5.1数据库管理工具

    具体更新内容需参考官方发布说明或通过安装该版本后亲自体验。 总而言之,DbVisualizer作为一款多平台、多功能的数据库管理工具,无论对于数据库管理员还是开发人员来说,都是日常工作中不可或缺的利器。通过其强大...

    网上订餐系统(本人亲自做的,非常好)

    - 数据库管理:MySQL或Oracle等关系型数据库存储用户信息、菜品数据和订单记录。 - Servlet:作为JSP和服务器之间的桥梁,处理HTTP请求,调用后台服务。 - JavaScript和AJAX:增强前端交互,如异步加载数据,无需...

    FastReport2017

    FastReport是一款强大的报表设计和开发工具,主要用于.NET Framework环境下的应用程序。...通过"FRNetDemo2017.2.msi"安装文件,用户可以亲自体验和学习FastReport的强大功能,进一步提高开发效率。

    Myeclipse2014 汉化

    MyEclipse除了基本的Java开发功能外,还支持其他技术,如Spring、Hibernate、Struts等,以及对Oracle、MySQL等数据库的集成。因此,这个汉化包的应用不仅限于基础的编码工作,也覆盖了整个开发流程。 至于压缩包子...

    数据库下载

    标题中的“数据库下载”指的是获取并安装用于存储和管理数据的软件系统,常见的数据库系统有MySQL、Oracle、SQL Server等。这些数据库系统是信息化建设的重要组成部分,帮助企业或组织存储、检索、更新和管理大量...

    批量导入数据,大数据导入

    通过解压并运行这些文件,你可以亲自体验和比较不同导入方法的速度差异,例如百万条数据在一秒钟内完成导入。 总之,批量导入数据和大数据导入是IT领域的核心技能,掌握这些技术可以帮助我们有效地管理和分析海量...

    dbfound演示环境(很多人可能还不知道dbfound是啥,部署看看,dbfound就是这么神奇,大大的提高我们的开发效率,开发原来可以如此美好)

    **dbfound演示环境详解** dbfound,一个在IT行业中逐渐崭露头角的神器,尤其在数据库管理和开发领域,它以其独特的功能和高效...如果你还没有尝试过dbfound,那么不妨下载这个演示环境,亲自体验一下它带来的改变吧!

    数据库课程设计

    这些程序可能是用于数据查询、存储过程、触发器或者事务管理的示例,它们让你能亲自体验数据库的运行机制。同时,"包含范文"可能是指提供了一些参考案例或模板,帮助你在设计数据库时有明确的方向和指导。 在文件...

    旅游在线报名

    可能是使用MySQL、Oracle或SQL Server等关系型数据库管理系统(RDBMS),通过Java Database Connectivity(JDBC)API与数据库进行通信。 4. **MVC设计模式**:Model-View-Controller(模型-视图-控制器)是Web应用...

    学通Java_web

    - **预备知识**:第一章涵盖Tomcat服务器的安装与使用、WebLogic的应用、MySQL和Oracle数据库的操作,以及JCreator集成开发环境的使用,为后续项目开发奠定坚实的基础。 - **飞达商贸有限公司POS系统案例**:第二...

    Java精品项目源码第102期嘟嘟校园一卡通系统.zip

    2. 数据库:MySQL或Oracle,用于存储用户信息、消费记录等数据。 3. 前端界面:HTML/CSS/JavaScript为基础,可能结合Bootstrap或Vue.js等前端框架,提升用户体验。 4. 服务器:如Tomcat或Jetty,作为Java Web应用的...

    aaa.rar_酒店源码

    2. **数据库管理**:可能使用MySQL、Oracle或SQL Server等数据库管理系统存储酒店的各项数据,如客户信息、房间状态、订单记录等。 3. **前端UI**:采用HTML5、CSS3和JavaScript(可能结合React、Vue或Angular等...

    毕业设计论文-IT计算机-JSP网上考试系统-源码.zip

    3. **数据库设计**:网上考试系统需要存储题目、选项、考生信息、成绩等大量数据,因此会涉及到数据库设计,如MySQL或Oracle。可能包括用户表、试题表、答案表、考试记录表等多个数据库表的创建和管理。 4. **...

    电大报名系统

    3. **数据库管理**:系统需存储学生的个人信息、报考课程、缴费情况等数据,因此需要一个可靠的数据库管理系统,如MySQL、Oracle或SQL Server,用于存储、检索和更新数据。 4. **安全性**:考虑到涉及个人信息,...

    Java精品项目源码第96期宠物预约挂号系统.zip

    通常会使用MySQL或Oracle等关系型数据库管理系统来存储用户信息、宠物信息以及预约记录等数据。数据库设计包括实体关系模型(ER模型)的建立,表结构的设计,以及SQL查询语句的编写。这些都直接影响到系统的性能和...

Global site tag (gtag.js) - Google Analytics