本文摘自http://www.cnblogs.com/cy163/archive/2010/11/17/1880280.html

做过DB2数据库应用迁移的工程师,了解IBM MTK工具在迁移过程中所能完成任务,但这个工具并不能帮你完成所有的迁移工作,
还有大量的迁移工作需要我们借助自己的经验和方法来完成,下面是一些在DB2数据库移植过程中常见的问题简单总结。
这里我只是针对Oracle迁移到DB2的常见问题描述。

1 DB2与oracle常用数据类型之间的对应关系

Oracle 数据类型    DB2 UDB 数据类型      注意事项
CHAR(n)            CHAR(n)       nB      1 <= n <= 254,若n>255使用VARCHAR(n)
VARCHAR2(n)        VARCHAR(n)    nB        n <= 32672,若n>32672使用CLOB(n)
 
BLOB               BLOB(n)               若n<=2GB,则使用BLOB(n)
CLOB               CLOB(n)               若n<=2GB,则使用CLOB(n)

NUMBER             FLOAT /               在实际使用中在ORACLE里并不是用于非精确的数据,要根据实际情况参照DECIMAL(p,s),DECIMAL(p)转换
                   REAL /
                   DOUBLE 
 
NUMBER(p)          SMALLINT/     2B     SMALLINT, if 1 <= p <= 4
                   INTEGER/      4B    INTEGER, if 5 <= p <= 9
                   BIGINT/       8B    BIGINT, if 10 <= p <= 18
NUMBER(p,s)        DECIMAL(p,s)  pB

DATE               DATE              如果只使用MM/DD/YYYY,选择DATE
                   TIME              如果只使用HH:MM:SS,选择TIME
                   TIMESTAMP         如果要使用日期和时间,选择时间戳类型
                                     可以使用Oracle中的TO_CHAR()函数来取DATE的字串来分别与DB2的DATE, TIME,TIMESTAMP相匹配

2. ORACLE的隐形转换处理
上表列举了DB2与oracle数据类型之间的对应关系,除了在建立表结构时需要注意这两种数据库之间的类型转换之外,
在程序迁移过程中还需要注意的一点是:
    oracle支持数据类型之间的隐形转化,但DB2是不支持数据这个特性的,因此在使用SQL进行数据查询或更新时必须配置字段的类型。
 例如:在表中employee 字段empno 定义为数字类型
 select * from employee where empno='1010';
 该语句在oracle数据库环境可执行通过,但在DB2下报错SQLCODE: -408, SQLSTATE: 42821。修正为
 select * from employee where empno=1010;
如果在程序中使用变量,可以使用cast关键字进行数据类型转换工作。语法如下:
select * from employee where empno =cast(V_name as bigint)
select * from employee where empno =cast(V_name as varchar(10))

3. 日期时间处理
在oracle中类型DATE代表日期、时间以及日期时间值,在DB2中每中类型的时间都有具体的类型与之对应,如下:
取系统时间:
 Oracle
 SELECT sysdate from dual;
 DB2
 SELECT current timestamp FROM sysibm.sysdummy1;
 SELECT current date FROM sysibm.sysdummy1;
 SELECT current time FROM sysibm.sysdummy1;
转换日期时间到字符类型:
 Oracle
  TO_CHAR(date_expression, 'YYYY-MM-DD')
  TO_CHAR(date_expression, 'HH24:MI:SS')
 DB2
 CHAR(date_expression,ISO)
 CHAR(time_expression,ISO)
转换日期时间字符串到日期时间类型:
 Oracle
  TO_CHAR(date_expression, 'YYYY-MM-DD')
  TO_CHAR(date_expression, 'HH24:MI:SS')
 DB2
 DATE('2005-05-20')
 TIME('18:59:59')
 TIEMSTAMP('2007-2-1', '21:12:12')
 TIEMSTAMP('2007-2-1 21:12:12')

DB2也有TO_CHAR 和 TO_DATE函数,但只能提供固定的转换格式,如下
 TO_CHAR (timestamp_expression,'YYY-MM-DD HH24:MI:SS')
 TO_DATE (string_expression, 'YYY-MM-DD HH24:MI:SS')

4. 空值处理
Oracle空值处理通过 nvl 函数实现,DB2中通过COALESCE函数实现。在DB2 V9.5中已经实现了 NVL 函数。
在Oracle中,对于null数据的处理比较灵活,在与NULL值进行比较和拼接时与DB2的结果完全不同,例如:
SELECT 'abc' || c1 FROM t1 (c1 IS NULL)   ORACLE得到 abc 的结果
在DB2中为null,要想得到 abc 的结果,按照如下语法修改,
SELECT 'abc‘ || COALESCE(c1,'') FROM t1
还有在Oracle中 select * from table where id = null 这种语法是允许的,在DB2中不可。
但需要说明的是在Oracle中虽然select * from table where id = null是可以通过语法检查,
但与select * from table where id is null语句得到结果集是不同的,所以在移植时要考虑真实的业务意义,在翻译成DB2的语法。
另外有些应用有如下用法
SELECT * FROM TABLE WHERE ('' IS NULL OR ID is null) AND ('' IS NULL OR NAME = '')  AND NUM = '0'
在DB2中可翻译为:
SELECT * FROM TABLE WHERE (cast(null as varchar(10)) IS NULL OR ID is null) AND (cast(null as varchar(10)) IS NULL OR NAME is null)  AND NUM = '0'

DB2与oracle类型对比的更多相关文章

  1. db2和oracle字段类型对比

    在网上找到一片关于oracle与DB2数据类型的比较,特记下来. Oracle DB2/400 Oracle数据类型 注意事项 DB2 UDB数据类型 注意事项 DATE DATETIMETIMEST ...

  2. DB2和Oracle区别

    转 http://blog.chinaunix.net/uid-7374279-id-2057574.html 写在前面:今天客户来访(日本人),问我DB2和Oracle区别.因为不是DBA(勉强的理 ...

  3. Db2与Oracle的区别

    这个部分是自己随便整理下. 在工作上需要,公司需要DB2兼容Oracle. 不懂DB2与Oracle的细节,这里努力整理,以后精通了再回来重新修改. https://www.2cto.com/data ...

  4. [转载]DB2与ORACLE、MYSQL比较2

    原文地址:DB2与ORACLE.MYSQL比较2作者:欣颖 4.2 Oracle9i  Oracle的产品战略是每12到18个月发布一个主要版本.主要发行版本所遵循的命名战略在PC领域中更为常见,它不 ...

  5. (转)DB2和 Oracle的并发控制(锁)比较

    DB2和 Oracle的并发控制(锁)比较 牛 新庄2005 年 12 月 26 日发布 原文:https://www.ibm.com/developerworks/cn/data/library/t ...

  6. DB2、ORACLE SQL写法的主要区别

    DB2.ORACLE SQL写法的主要区别   说实话,ORACLE把国内的程序员惯坏了,代码中的SQL充斥着大量ORACLE特性,几乎没人知道ANSI的标准SQL是什么样子,导致程序脱离了ORACL ...

  7. MySql - JdbcType - Oracle类型映射

    MySql - JdbcType - Oracle类型映射   MySQL数据类型 JDBC TYPE Oracle数据类型 BIGINT BIGINT NUMBER(20) TINYINT TINY ...

  8. db2 mysql oracle 邮件 tomcat ssh telnet ftp samba 账号密码

    db2 mysql oracle 邮件 tomcat ssh telnet ftp samba 账号密码 检测

  9. Oracle类型number与PG类型numeric对比和转换策略

    Oracle 11g number 任意精度数字类型 http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT3 ...

随机推荐

  1. Distill详述「可微图像参数化」:神经网络可视化和风格迁移利器!

    近日,期刊平台 Distill 发布了谷歌研究人员的一篇文章,介绍一个适用于神经网络可视化和风格迁移的强大工具:可微图像参数化.这篇文章从多个方面介绍了该工具. 图像分类神经网络拥有卓越的图像生成能力 ...

  2. lambda,sorted(),filter(),map(),递归,二分法

    1. lambda 匿名函数 语法: lambda 参数:返回值 不能完成复杂的操作例 # li=['21','asdd','weqeqw','wqf']# # it=iter(li)# # prin ...

  3. linux操作系统5 shell编程

    知识内容: 1.shell编程预备知识 2.shell变量 3.表达式与运算符 4.分支循环语句 5.函数 一.shell编程预备知识 1.什么是shell编程 shell是与linux交互的基本工具 ...

  4. java基础:关于java流与文件操作

    1.描述:流是字节数据或字符数据序列.Java采用输入流对象和输出流对象来支持程序对数据的输入和输出.输入流对象提供了数据从源点流向程序的管道,程序可以从输入流对象读取数据:输出流对象提供了数据从程序 ...

  5. django返回状态码的页面,指定p地址访问

    只有DEBUG = False 才能展示自定义的错误页面,否则djnago会报错,给出提示信息.  ps:django  DEBUG=FALSE, 会导致不能加载静态文件 ALLOWED_HOSTS ...

  6. linux 基本。。

    一. 将磁盘分区挂载为只读 这一步很重要,并且在误删除文件后应尽快将磁盘挂载为只读.越早进行,恢复的成功机率就越大. 1.  查看被删除文件位于哪个分区 [root@localhost  ~]# mo ...

  7. JDK1.7之后switch支持string

    转自:https://blog.csdn.net/tjcyjd/article/details/9666035 在Java7之前,switch只能支持 byte.short.char.int或者其对应 ...

  8. 1.mysql ERROR 1045 (28000): 错误解决办法

    转自:https://www.cnblogs.com/jpwz/p/6061214.html ERROR 1045 (28000): Access denied for user 'ODBC'@'lo ...

  9. 机器学习入门-主成分分析(PCA)

    主成分分析: 用途:降维中最常用的一种方法 目标:提取有用的信息(基于方差的大小) 存在的问题:降维后的数据将失去原本的数据意义 向量的内积:A*B = |A|*|B|*cos(a) 如果|B| = ...

  10. eclipse 乱码

    svn乱码: 教你解决Eclipse中SVN比较乱码问题 workspace->utf-8设置后成功! console乱码: 项目右键 :  run as configuration 设置com ...