MySQL转数据到Oracle(一)

2014-11-24 18:15:54 · 作者: · 浏览: 0

1. 自动增长的数据类型处理


CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;


INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL


2. 单引号的处理


MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。当然你如果使用 Convert Mysql to Oracle 工具就不用考虑这个问题


3.长字符串的处理


在ORACLE中,INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。


4. 翻页的SQL语句的处理


MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数。ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不能用ROWNUM>80。


以下是经过分析后较好的两种ORACLE翻页SQL语句( ID是唯一关键字的字段名 ):


语句一:SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;


语句二:SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (select [FIELD_NAME,...] FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;


5. 日期字段的处理


MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为SYSDATE, 精确到秒。


日期字段的数学运算公式有很大的不同。MYSQL找到离当前时间7天用 DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE - 7;


6. 字符串的模糊比较


MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但这种方法不能使用索引, 速度不快,用字符串比较函数 instr(字段名,'字符串')>0 会得到更精确的查找结果。


7. 空字符的处理


MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。


以上內容我作為參考。


二.工具的使用


網上好多朋友介紹使用Convert Mysql to Oracle這個工具,當然能用工具解決的問題我們就用工具,關鍵是看工具能不能解決問題。通过工具会出现好多问题,最终还是要自己写程式解决。后来发现工具导数据还是可以的,数据表的创建和修改只有自己写程式解决了。但是导数据也有问题,如下:


導入數據遇到的問題


1、text到blob的時候,這個是影響很大的,不是我們希望看到的,就不要做多說明。


2、在Mysql中如果是Varchar或char中字符大小為2,意味著它可以輸入“12、中國、1中”等2個長度的數據,而在Oracle中是針對字節的,它只允許輸入英文字符2個或一個中文漢字,所以這變在導數據的時候要注意欄位的大小。


3、導入的過程中字符集必須要設置正確,否則會出現亂碼的數據。


4、index是不可以導進來的,要注意table是否有Index;是否允許NULL值也要注意。


5、Mysql中id自動增長的table要做處理,在oracle中設置相關的sequence和trigger。


6、comment在oracle中是關鍵字,不能當做列來處理。


7、當數據量大的時候做特別處理。


三.自己写程式解决问题


//获得所有table的名字


SELECT
`TABLES`.`TABLE_SCHEMA`, `TABLES`.`TABLE_NAME`
FROM
`information_schema`.`TABLES`
WHERE
`TABLES`.`TABLE_TYPE` = 'base table'
and `TABLES`.`TABLE_SCHEMA` ='netoffice';


//获得某table所有列的信息


SELECT * FROM
`information_schema`.`COLUMNS`


where `TABLE_SCHEMA`='netoffice'


and `TABLE_NAME`='drmcertification' order by `ORDINAL_POSITION`;


//java程式:


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Vector;


public class TestMysql {
public static Connection conn;
public static Statement statement;
public Hashtable>> hashtable = new Hashtable>>();
public static final String filepathCreateTable = "D://CreateTable.txt";
public static final String filepathCreateSequence = "D://CreateSequence.txt";
public static final String filepathCreateTrigger = "D://CreateTrigger.txt";
public static final String filepathCreatePrimarykey = "D://CreatePrimarykey.txt";
public static final String filepathCreateIndex = "D://CreateIndex.txt";

//只要修改主機名,數據庫名字和user、password
public static final String D