场景:客户现在使用我们开发的退货终端退货,退货完成后我们需要将新系统的中的几个数据库表导入原老系统中去。这个过程将持续一定时间,直到我们的新系统稳定后,停止这个数据导入过程
需求:现在将新系统库的数据库表,如A表(字段1,字段2,字段3,字段4,状态位),将A表数据库导入原系统数据库A1中,A表中导入完成后需要对A表中的状态位字段置一个值为1,表示下次再导数据的时候不在考虑这样的数据。请问如何才能实现在这样的需求(要求纯SQL脚本),注:新系统数据库oracle10g,老系统数据库为SQLServer2000
需求:现在将新系统库的数据库表,如A表(字段1,字段2,字段3,字段4,状态位),将A表数据库导入原系统数据库A1中,A表中导入完成后需要对A表中的状态位字段置一个值为1,表示下次再导数据的时候不在考虑这样的数据。请问如何才能实现在这样的需求(要求纯SQL脚本),注:新系统数据库oracle10g,老系统数据库为SQLServer2000
具体配置方法可以参考本站文章:客户端连服务器的注意事项
2、在WIN2000或者win2003服务器->管理工具->数据源(ODBC)->系统DSN(本机器上NT域用户都可以用)->添加->ORACLE ODBC Driver->完成->data source name 可以自定义,我一般填ORACLE数据库的sid标志,description里可以填ORACLE数据库详细描述,也可以不填->data source service name 填第1步定义的ORACLE数据库别名->OK。
(用户DSN和文件DSN也可以类似配置,但使用的时候有一些限制)
3、SQL Server的导入和导出数据工具里->选数据源-> 数据源(其它(ODBC数据源))->选第2步在ODBC里定义的系统DSN source name,用户名密码处填写ORACLE系统的用户名和密码->下一步->选择目的,选SQL Server数据库(跟上面第二点讲的一致,就不重复了)。
能保证绝大部分数据导入到oracle中,但是预先你必须在oracle建立user和相应的tablespace。以为sql7中有一些特殊datatype,
如:text,image等。当一个table中有多于一个text和image的字段时,将出现错误,不能执行。这时你需要做出选择,
或者把后者text镜像为varchar2(4000),或者镜像为long datatype。但long datatype一个table里只能有一个,而且还有可能遇到字符集的问题。2、使用oracle的sql*load,虽然麻烦些,但是是最有效的办法。可以使用各种方法把数据源导到一个外部文件中(a、我用的java输出txt
文档 或者 b、MS SQL带的BCP工具)。然后使用SQL*load(load的使用方法你可以去查一下,比较简单。)把这些数据导入到oracle中。
程序语言:java
数据库连接sql server:jdbc-odbc桥
数据库连接oracle :jdbc代码如下:
import java.lang.*;
import java.sql.*;
public class SqlToOracle {
public static void main(String[] args) throws SQLException,ClassNotFoundException{
/*jdbc的oracle连接*/
//String sDBDriver = "oracle.jdbc.driver.OracleDriver";
/*odbc的连接*/
String oralce_sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
String oralce_sConnStr = "jdbc:oracle:thin:@IP:1521:数据库实例名";
/*jdbc的SQL server连接*/
//jdbc.url=jdbc:sqlserver://IP;instanceName=ProductDB;databaseName=product_index;selectMethod=cursor
String sqlServer_sDBDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String sqlServer_sConnStr = "Jdbc:Odbc:数据库名称";
//客户端游标
//String sConnStr = "jdbc:sqlserver://localhost:1433; DatabaseName=mahanso";//;selectMethod=cursor
//服务器端游标
//String sConnStrServerCursor = "jdbc:sqlserver://localhost:1433;DatabaseName=mahanso;selectMethod=cursor";
String sqlServer_UserName = "";
String sqlServer_PassWord = "";
String oralce_UserName = "";
String oralce_PassWord = "";
//登记驱动
Class.forName(oralce_sDBDriver);
Class.forName(sqlServer_sDBDriver);
//连接到数据库
Connection cn_oracle = DriverManager.getConnection(oralce_sConnStr,oralce_UserName,oralce_PassWord);
Connection cn_sqlserver = DriverManager.getConnection(sqlServer_sConnStr,sqlServer_UserName,sqlServer_PassWord);
Statement s_oracle = cn_oracle.createStatement();
Statement s_sqlserver = cn_sqlserver.createStatement();
ResultSet rs = s_sqlserver.executeQuery("select * from A表 where id between 1 and 20000");
//字段1
String ziduan1 = new String("1");
//字段2
String ziduan2 = new String("1");
//字段3
String ziduan3 = new String("1");
//向oracle数据库插入数据
while(rs.next()){
ziduan1 = rs.getString("ziduan1");
ziduan2 = rs.getString("ziduan2");
ziduan3 = rs.getString("ziduan3");
s_oracle.execute("insert into A表 values(\\"+ziduan1+"\\,\\"+ziduan2+"\\,\\"+ziduan3+")");
}
}
}
创建一个dll(unix系统对应的是.so),dllexport一些函数,功能是连接Sqlserver,并操作数据库
在oracle中定义外部程序包,调用这些DLL中的函数。
在oracle的表中定义触发器,调用包函数,具体内容可以参考一些中间件的做法
或者SQL SERVER的官方迁移工具试试....