`
miman2008
  • 浏览: 38163 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

蛋疼的数据库移植,艰难中进行。

阅读更多

    上周项目经理告诉我,客户想把数据库从oracle换成sqlsever 2005,然后要我搞定。说实话,我很讨厌这个差事,因为涉及到很多细节问题的解决,好在我比较闲,到现在为止,基本上解决问题,换了数据库后系统运行正常。以下是我解决问题的步骤,同时包括实现中的很多细节。因为对sql server 2005并不熟,一并把设计到的比较典型的sql 语句贴上来。

  •      首先是修改映射文件,增加SqlServerDriver

映射oracle的格式:

 <property name="dialect">
			org.hibernate.dialect.Oracle10gDialect
		</property>
		<property name="myeclipse.connection.profile">oracle</property>
		<property name="show_sql">true</property>
		<property name="connection.url">
			jdbc:oracle:thin:@192.168.1.201:1521:orcl
		</property>
		<property name="connection.username">wdrd</property>
		<property name="connection.password">wdrd</property>
		<property name="connection.driver_class">
			oracle.jdbc.driver.OracleDriver
		</property>

 

换成sql server后,将其映射文件修改成如下格式:

 <property name="dialect">
		org.hibernate.dialect.SQLServerDialect
	</property>
	<property name="myeclipse.connection.profile">
		com.microsoft.sqlserver.jdbc.SQLServerDriver
	</property>
	<property name="show_sql">true</property>
	<property name="connection.url">
           jdbc:sqlserver://192.168.1.201:1533;databaseName=wdrd
	</property>
	<property name="connection.username">sa</property>
	<property     
                    name="connection.password">ultratech</property>
	<property name="connection.driver_class">
		com.microsoft.sqlserver.jdbc.SQLServerDriver
	</property>

 

  • 映射文件修改完毕后,测试连接成功后,就要修改mapping文件了。

连接oracle数据库时,如果我们的id是手动赋值的,那比较简单,也无需变化,采用“assigned”即可,但是对于自增的id,oracle要用到sequence,在oracle中,sequence是独立于table的,它们通常用来自增计数。废话 少说,我直接列出两张表的部分mapping文件为例。

表一:Fnd_Dept部门表,id是指定的

 <class name="com.ultratech.omis.fnd.bo.FndDept" table="FND_DEPT">
        <id name="deptId" type="java.lang.Long">
            <column name="DEPT_ID" precision="10" scale="0" />
            <generator class="assigned" >
  
            </generator>
        </id>

 

这种table的mapping不需要改变,Sql Server中直接copy就行。

 

表二:Fnd_Code系统字段表,id是自增的

 <class name="com.ultratech.omis.fnd.bo.FndCode" table="FND_CODE">
    	<cache usage="read-write"/>
        <id name="codeId" type="java.lang.Long">
            <column name="CODE_ID" precision="10" scale="0" />
            <generator class="sequence" >
            	<param name="sequence">FND_CODE_SEQ</param>
            </generator>
        </id>

 FND_CODE_SEQ是另外在oracle中建立的。

 

这种类型的表在sql server 2005的mapping文件如下所示:

 <id name="codeId" type="java.lang.Long">
            <column name="CODE_ID" precision="10" scale="0" />
            <generator class="identity" >
            	
            </generator>
        </id>
  •  需要注意的是,两个数据库建表的时候也有差异。

在sql server 指定Id自增时,需要采用以下模式:

  CODE_ID decimal(10,0)  identity(1,1)

oracle就很简单了,此处从略。

  • 递归查询

两者的递归查询差异比较大,下面是两个最典型的例子。

现有表dept,为方便理解,贴出建表语句

create table FND_DEPT
(
  DEPT_ID     NUMBER(10) not null,
  DEPT_PID    NUMBER(10) not null,
  DEPT_NAME   VARCHAR2(128) not null,
  BRANCH_ID   VARCHAR2(3),
  SEQ         NUMBER(4),
  CREATE_DATE DATE
)
;
alter table FND_DEPT
  add primary key (DEPT_ID);
  1.   查询某一部门下面的字部门,包括自己

oracle中的代码:

select dept.*  from FND_DEPT dept 
     start with dept.dept_id = 100
     connect by prior dept.dept_id = dept.dept_pid 
     order siblings by dept.SEQ asc;

 

sql server中的代码:

WITH deptCte (dept_id,dept_pid, dept_name,branch_id, seq,create_date)
AS
(
    SELECT *
    FROM fnd_dept AS e
    WHERE dept_id=100   /*定位点成员*/
    UNION ALL
    SELECT e.*
    FROM fnd_dept AS e
    INNER JOIN deptCte AS l  /*此处的l就是递归成员*/
        ON e.dept_pid = l.dept_id
)
SELECT *
FROM deptCte 
order by seq

    

 

     2.    查询某一部门的父部门(严格说是路径).

oracle中的代码为:

select dept.*  from FND_DEPT dept 
     start with dept.dept_id = 104
     connect by prior dept.dept_pid = dept.dept_id 
     order siblings by dept.SEQ asc;

 

sql server中的代码:

 

WITH deptCte (dept_id,dept_pid, dept_name,branch_id, seq,create_date,leavl)
AS
(
    SELECT *,0 as leavl /*此处添加leavl方便后面排序,oracle不一样,oracle中的leavl是关键字*/
    FROM fnd_dept AS e
    WHERE dept_id=101
    UNION ALL
    SELECT e.*,leavl+1
    FROM fnd_dept AS e
    INNER JOIN deptCte AS l
        ON e.dept_id = l.dept_pid
)
SELECT dept_id,dept_pid, dept_name,branch_id, seq,create_date
FROM deptCte 
order by leavl desc
  •  函数移植

oracle中的函数代码如下:

create or replace function WAIT_BEFORE(rep_id in number, rep_type in varchar2) return number is
  Result number;
begin
  select COUNT(gr_w.report_id) into Result
  from gua_report gr_w, gua_report gr
 where gr.report_id = rep_id
   and gr_w.report_type = rep_type
   and gr_w.status = 'NO'
   and gr_w.report_date < gr.report_date;
  return(Result);
end WAIT_BEFORE;

 

转换到sql server 2005中的代码为:

USE [wdrd]
GO
/****** Object:  UserDefinedFunction [dbo].[WAIT_BEFORE]    Script Date: 12/10/2010 15:02:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[WAIT_BEFORE](@rep_id decimal(10),@rep_type varchar(32))
returns int--设置返回值,记住是returns 而不是return
AS
BEGIN
 DECLARE @result int
 set @result =(select count(*)
  from gua_report gr_w, gua_report gr
 where gr.report_id = @rep_id
   and gr_w.report_type = @rep_type
   and gr_w.status = 'NO'
   and gr_w.report_date < gr.report_date)

return @result 
END

 

以上便是此次移植遇到的主要问题,当然还有其他细节问题,限于篇幅,此处从略。

1
0
分享到:
评论

相关推荐

    用Oracle导入导出工具实现Oracle数据库移植

    为了确保数据库移植的顺利进行,我们需要按照以下步骤来进行操作: 1. **环境准备**: - 确保源数据库和目标数据库版本兼容。 - 检查源数据库和目标数据库的操作系统环境是否一致或兼容。 - 准备足够的磁盘空间...

    oracle数据库移植文件

    特别是对于Oracle这样的大型关系型数据库管理系统而言,如何高效地进行数据库的备份与移植更是至关重要。本文将详细介绍如何进行Oracle数据库的备份与移植,包括创建表空间、用户权限分配以及数据导出导入等关键步骤...

    将 Microsoft Access 数据库移植到 Oracle

    将 Microsoft Access 数据库移植到 Oracle 将 Microsoft Access 数据库移植到 Oracle

    mysql数据库移植

    MySQL数据库移植是一个涉及多个步骤和文件类型的过程,确保在迁移过程中数据完整性和功能不受到影响。在MySQL中,`.frm`、`.myd`和`.myi`文件分别扮演着不同的角色: 1. `.frm`文件:这个文件包含了数据库表的结构...

    将您的 Access 数据库移植到 Oracle

    将您的 Access 数据库移植到 Oracle.mht 将您的 Access 数据库移植到 Oracle.mht

    oracle数据库移植手册

    - 在整个移植过程中,必须确保源数据库的稳定性和数据的一致性,避免在数据库活跃期间进行操作。 - 网络配置是移植过程中的关键环节,任何错误都可能导致数据库无法正常访问,因此需要仔细检查和测试。 - 控制文件的...

    Oracle数据库移植方案.pdf

    然而,随着业务需求的变化和技术的进步,不可避免地需要对现有的Oracle数据库进行移植,以适应新的环境或者进行必要的升级。本文将详细介绍一种适用于软件维护场景下的Oracle数据库移植方案。 #### 二、Oracle...

    db2数据库移植和转换工具

    DB2数据库移植和转换工具是IT领域中一个关键的话题,特别是在企业级系统迁移或升级的过程中。DB2,由IBM开发,是一款广泛使用的的关系型数据库管理系统(RDBMS),支持多种操作系统平台,包括Windows、Linux、Unix和...

    用于软件维护的Oracle数据库移植工具.pdf

    在软件维护过程中,数据库移植是一项关键任务,因为它确保了应用程序的测试环境得以建立。数据库移植不仅涉及到数据的迁移,还包括数据库结构、权限、存储过程、触发器等组件的转换。在软件维护阶段,对特定表进行...

    mysql数据库移植问题

    在进行系统迁移或服务器升级的过程中,经常会遇到数据库移植的问题。对于SQL Server等数据库来说,只要版本一致,通常可以直接进行数据库文件的附加操作来实现迁移。但对于MySQL数据库,情况则有所不同,可能会遇到...

    Oracle数据库移植技术探索.pdf

    数据库移植是数据库管理系统维护的关键环节,尤其在Oracle数据库环境中,随着技术更新和系统升级,从旧版本向新版本迁移成为常态。Oracle数据库移植不仅仅是简单的数据导出和导入,而是涉及到一系列复杂的操作,包括...

    ORCALE、SQLSERVER数据库移植工具

    数据库移植和迁移是IT行业中常见的任务,特别是在企业级系统中,由于业务需求或技术更新,可能需要将数据从一个数据库管理系统(DBMS)迁移到另一个。"ORACLE、SQLSERVER数据库移植工具" 提供了解决这个问题的一个...

    sqlserver2005数据库移植到oracle9i

    需要注意的是,数据库移植过程中可能会遇到数据类型不兼容、特定功能缺失等问题,需要根据具体情况进行调整。此外,SQL Server和Oracle对数据类型、事务处理、并发控制等方面存在差异,因此在移植过程中要特别关注...

    Oracle数据库移植.doc

    - 在进行数据库移植前,务必对原数据库进行完整备份。 - 确保新服务器上的硬件环境、操作系统版本以及Oracle版本与原数据库兼容。 - 在新服务器上创建实例时,需要确保实例参数文件(如`init.ora`文件)中的设置与原...

    如何使用MTK工具进行数据库移植

    以下将详细介绍MTK工具在数据库移植中的关键步骤和应用。 1. **指定源(Specify Source)**: 这是MTK的第一步,你需要在这里定义你要迁移的源数据库。这涉及到配置数据源,确保MTK能够连接到源数据库。这通常需要...

    SQL Server 2000数据库移植实战技术.pdf

    然后,在企业管理器中右击“数据库”并选择“所有任务&gt;附加数据库”,在弹出的窗口中选择sa用户进行附加操作。如果选择了非sa用户,可能会导致数据库无法连接的问题。 除此之外,还需要新建登录用户来确保新服务器...

    pageoffice数据库移植.zip

    在IT行业中,数据库移植是一项常见的任务,特别是在企业级应用中,由于业务需求的变化或性能优化,可能需要将数据从一个数据库系统迁移到另一个。在这个场景中,"pageoffice数据库移植.zip" 文件似乎提供了关于如何...

Global site tag (gtag.js) - Google Analytics