zoukankan      html  css  js  c++  java
  • DB2、ORACLE SQL写法的主要区别

    DB2、ORACLE SQL写法的主要区别
     

    说实话,ORACLE把国内的程序员惯坏了,代码中的SQL充斥着大量ORACLE特性,几乎没人知道ANSI的标准SQL是什么样子,导致程序脱离了ORACLE根本无法运行,还好随着hibernate的流行,情况有了很大改观

    DB2作为众多国际大客户的选择(据说世界500强80%用DB2,前100强更是全部采 用DB2),在国内真的很不流行,属于小众数据库,但是没办法,现在的项目要用DB2,所以不得不面对熟悉ORACLE的开发同事们写出的“ORACLE 版代码”,众多的兼容性问题搞得很是头大,遂整理了一份经常遇到的兼容性问题列表供大家参考,貌似最近问题少了些,但愿这个势头能继续下去

    1、数据类型转换函数

     

    整型转字符型

    字符串转整形

    字符串转浮点型

    浮点型转字符串

    字符串转日期

    字符串转时间戳

    日期转字符串

    ORACLE

    to_char(1)

    to_number('1')

    to_number('1.1')

    to_char(1.1)

    to_date('2007-04-26','yyyy-mm-dd')

    to_date('2007-04-26 08:08:08','YYYY-MM-DD HH24:MI:SS')

    to_char(to_date('2007-04-29','yyyy-mm-dd'),'yyyy-mm-dd')

    DB2

    char(1)

    int('1')

    double('1.1')

    char(1.1)

    date('2007-04-26')

    to_date('2007-04-26 08:08:08','YYYY-MM-DD HH24:MI:SS')

    char(date('2007-04-29'))

    兼容写法

    cast(1 as char)

    cast('1' as int)

    兼容

    2、Where条件弱类型判断
    oracle: where 字符型字段 in (整形) 是允许,DB2不允许
    select 'abc' from dual where '1' in (1) 在oracle下可通过
    select 'abc' from sysibm.sysdummy1 where '1' in (1) 在DB2下报错

    oracle:where 字符型字段=数字型字段 允许,DB2不允许

    select 'abc' from dual where '1'=1 在oracle下可通过
    select 'abc' from sysibm.sysdummy1 whre '1'=1 在DB2下报错


    3、replace关键字
    oracle支持,DB2不支持 create or replace语句在DB2下是非法的


    4、子查询别名
    ORACLE 支持select * from(select 1 from dual) 或者 select * from(select 1 from dual) t

    DB2 支持select * from(select 1 from sysibm.sysdummy1) t 或者 select * from(select 1 from sysibm.sysdummy1) as t

    固兼容的写法是select * from(子查询) t


    5、DATE数据类型的区别
    ORACLE中DATE型也是带有时分秒的,但DB2下DATE只是年月日,如'2007-04-28',且可作为字符串直接操作,DB2中要记录时分秒必须采用TIMESTAMP型

    一个采用hibernate后常见的兼容问题是:

    如果在映射文件中定义了某个字段为Date型

    <property name="createTime" type="java.util.Date" >

             <column name="CREATE_TIME" length="7" />

    </property>

    则在DB2下,此字段必须定义为timestamp,而不能定义成DATE,不然会报出字符串右截断的错误


    对于DB2来说,在查询条件中可以直接用字符串指定日期或时间戳类型字段的值,例如 where create_date = '2007-04-26' 、where create_timestamp = '2007-04-26 08:08:08' ,无须使用字符串转日期函数


    6、分页的处理
    如果采用JDBC分页的话,注意rownum在DB2中不受支持,比如从masa_area表中取得area_id最小的10条记录,语句分别如下,注意这里的别名t书写方法

    ORACLE: select t.* from (select rownum as r1 ,masa_area.* from masa_area order by area_id) t where t.r1<=10

    DB2: select t.* from (select rownumber() over() as r1 ,masa_area.* from masa_area order by area_id) t where t.r1<=10


    7、decode函数
    decode函数在DB2不被支持,兼容的写法是采用case when


    8、NVL函数
    nvl写法在DB2不被支持,兼容的写法是采用coalesce

    ORACLE: select NVL(f_areaid,'空') from masa_user 等同于 select coalesce(f_areaid,'空',f_areaid) from masa_user

    DB2: select coalesce(f_areaid,'空',f_areaid) from masa_user


    9、substr的不同
    DB2 substr举例如下:

    masa_group表的f_groupCode字段定义成VARCHAR(100),所以下面这个语句不会出错,如果是substr(f_groupCode,1,101)就出错了

    select * from masa_group where substr(f_groupCode,1,50) = '001006' order by f_groupcode

    在DB2下无错,但是

    select * from masa_group where substr('001006', 1, 50) = '001006' order by f_groupcode

    就报错,说第三个参数超限

    这是因为'001006'已经定义为一个长度为6的charater了


    这点和ORACLE有很大不同,请大家注意


    如果是要从第一位取到最后一位,稳妥的办法是不要加第三个参数

    ORACLE:select substr('123456',1) from dual

    DB2:select substr('123456',1) from sysibm.sysdummy1

    都没有问题


    10、获取操作系统当前日期

    ORACLE Sysdate

    DB2           CURRENT DATE

  • 相关阅读:
    Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
    用foreach遍历 datagridView 指定列所有的内容
    treeView1.SelectedNode.Level
    YES NO 上一个 下一个
    正则 单词全字匹配查找 reg 边界查找 精确匹配 只匹配字符 不含连续的字符
    抓取2个字符串中间的字符串
    sqlite 60000行 插入到数据库只用不到2秒
    将多行文本以单行的格式保存起来 读和写 ini
    将秒转换成时间格式
    richtextbox Ctrl+V只粘贴纯文本格式
  • 原文地址:https://www.cnblogs.com/wuxl360/p/5563019.html
Copyright © 2011-2022 走看看