`
eminem
  • 浏览: 138313 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle SQL到DB2 SQL移植解决方案(引)

阅读更多
Oracle SQL到DB2 SQL移植解决方案

1、Oracel中的decode
DB2解决方案:用case条件表达式完成。

case两种语法模式:

(1)CASE

WHEN 条件 THEN 结果1

ELSE 结果2

END

(2)CASE 表达式1

WHEN 表达式2 THEN 结果1

ELSE 结果2

END

上面的WHEN可以重复多次,就像C中的SWITCH ..CASE的表达.

例如:

SELECT ORDNO,CUSNO,

CASE MONTH(SHIPDATE)

WHEN ''01'' THEN ''Jan''

WHEN ''02'' THEN ''Feb''

WHEN ''03'' THEN ''Mar''

WHEN ''04'' THEN ''Apr''

WHEN ''05'' THEN ''May''

WHEN ''06'' THEN ''Jun''

WHEN ''07'' THEN ''Jul''

WHEN ''08'' THEN ''Aug''

WHEN ''09'' THEN ''Sep''

WHEN ''10'' THEN ''Oct''

WHEN ''11'' THEN ''Nov''

WHEN ''12'' THEN ''Dec''

END

FROM FILE

应用实例:

Oracle SQL:

-------------------------

select decode(t.organtypecode, ''D'', t.parent, ''S'', t.parent, t.id)

from A_ORGAN t

where t.parent = 35

DB2 SQL:

-------------------------

select case x.organtypecode

when ''D'' then

x.parent

when ''S'' then

x.parent

else

x.id

end

from a_Organ x

where x.parent = 35;

2、Oracle中的Start with...Connect By递归查询

DB2解决方案:用with公共递归表达式来解决。

DB2解决方案:用case条件表达式完成。

Oracle SQL:

-------------------

select t.id

from a_organ t

start with t.id in (select decode(t.organtypecode,

''D'',

t.parent,

''S'',

t.parent,

t.id)

from A_ORGAN

where t.id = 35)

connect by t.parent = prior t.id

DB2 SQL:

-------------------------

WITH FKK(id) as

(select o.id from a_organ o

where o.id=35

UNION ALL

select case x.organtypecode

when ''D'' then x.parent

when ''S'' then x.parent

else x.id

end

from FKK fk, a_organ x

where fk.id=x.parent)

select distinct id from FKK;

3、Oracle中的dual表对应DB2中的SYSIBM.SYSDUMMY1表

DB2解决方案:对应于DB2中的 SYSIBM.SYSDUMMY1表

Oracle SQL:

-------------------------

select 15 as ttt from dual

结果:

ttt

-------

15



DB2 SQL:

-------------------------

select 15 as ttt from SYSIBM.SYSDUMMY1

结果:

ttt

-------

15

4、日期转换问题

DB2解决方案:有相应的函数

Oracle SQL:

-------------------------

select m.*

from dj_mcdj m

where m.mcqc || '' '' like ''%$P%''

and m.xzqhdm || '' '' like ''%$P%''

and m.hylbdm || '' '' like ''%$P%''

and m.blqsrq >= to_date(''$P'', ''yyyy-mm-dd'')

and m.blqsrq < to_date(''$P'', ''yyyy-mm-dd'')+1

DB2 SQL:

---------------------

--------------------

--名称:名称库查询

--作者:雷智民

--日期:2006-10-27

--FOR :DB2

--------------------

select m.*

from dj_mcdj m

where m.mcqc || '' '' like ''%%''

and m.xzqhdm || '' '' like ''%%%''

and m.hylbdm || '' '' like ''%%%''

and date(m.blqsrq) >= date(''1900-01-01'')

and date(m.blqsrq) < date(''2050-01-01'')+1 day

5、nvl 问题
DB2解决方案:利用coalesce(,) 或 value(,)方法。
oracle中的nvl对应db2中的value ,只是oracle中的语法更有宽松一些,在db2中,value要求两个参数必须是同一种类型的,nvl要求则不是很严格,nvl(A,‘’),如果A是数字类型或者日期类型的这个表达式也没有 问题,但是在db2中,若是也这么写的话, value(A,''),那肯定就有问题了,总的来说,基本上是一致的。

6、左右外连接问题
db2的左右外连接的语法和标准sql语法一样,只是没有oracle中的(+)这个简单符号来标记左右外连接,left (right) outer join  on
1).内连接INNER JOIN的Oracle和DB2的写法

  Oracle可以这样实现? Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no; DB2 可以这样实现? Select * from db2admin.bsempms inner join db2admin.bsdptms on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no;

2).外连接的Oracle和DB2的写法(右外连接,左外连接,完全外连接,组合外连接)

  Oracle可以这样实现?
  Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no(+);
  Select a.* from bsempms a,bsdptms b wherea.dpt_no(+)=b.dpt_no;
  DB2 可以这样实现?
  Select * from db2admin.bsempms right outer join db2admin.bsdptms
  on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no;

  Select * from db2admin.bsempms left outer join db2admin.bsdptms
  on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no;

  Select * from db2admin.bsempms full outer join db2admin.bsdptms
  on db2admin.bsempms.dpt_no=db2admin.bsdptms.dpt_no;

7、LIKE问题

db2中谓词LIKE后边的表达式不支持字段。只支持一下类型:
A constant
A special register
A host variable
A scalar function whose operands are any of the above
An expression concatenating any of the above

(附DB2文档:
使用格式: match-expression LIKE pattern-expression
match-expression
An expression that specifies the string that is to be examined to see if it conforms to a certain pattern of characters.
The expression can be specified by:

A constant
A special register
A host variable (including a locator variable or a file reference variable)
A scalar function
A large object locator
A column name
An expression concatenating any of the above

pattern-expression
An expression that specifies the string that is to be matched.
The expression can be specified by:

A constant
A special register
A host variable
A scalar function whose operands are any of the above
An expression concatenating any of the above
with the following restrictions:

No element in the expression can be of type LONG VARCHAR, CLOB, LONG VARGRAPHIC, or DBCLOB. In addition it cannot be a BLOB file reference variable.
The actual length of pattern-expression cannot be more than 32 672 bytes.


DB2中几个隔离级别select..for update with ** 的行锁

看了很多介绍DB2中隔离级别和锁的各种用法和机制,动手做了一个比较详尽的试验,
对于有些结果我还真没想明白。。


在 db2 9 中我做了以下的试验,
Create table RRTest (pkID VARCHAR(20) NOT NULL ,unID1 varchar(20) Not NULL,UnID2 varchar(20) ,"CUSTOMER_ID" VARCHAR(6) ,
                  "ORDER_TYPE" DECIMAL(2,0) ,
                  "EXECUTION_TYPE" DECIMAL(2,0) ,
                  "ORDER_DATE" VARCHAR(8) ,
                  "ORDER_TIME" VARCHAR(6) ,
                  "ORDER_DATETIME" TIMESTAMP ,
                  "SIDE" DECIMAL(1,0) ,
                  "TRADE_TYPE" DECIMAL(1,0) ,
                  "ORDER_AMOUNT" DECIMAL(15,2) ,
                  "ORDER_PRICE" DECIMAL(8,4),
                   TSID varchar(20) )

insert into RRTest
SELECT Order_ID, Order_ID, Order_ID, CUSTOMER_ID, ORDER_TYPE, EXECUTION_TYPE, ORDER_DATE, ORDER_TIME, ORDER_DATETIME, SIDE, TRADE_TYPE, ORDER_AMOUNT, ORDER_PRICE ,ORDER_ID
    FROM DB2INST1.Fx_Order where ORDER_DATE >'20070401'
GO
select count(*) From RRTEST
72239

ALTER TABLE "DB2INST1".RRTest
        ADD PRIMARY KEY
                (pkID);

CREATE UNIQUE INDEX UNIQINDX ON RRTest(unID1)
CREATE INDEX INDX002 ON RRTest(unID2)
db2 "RUNSTATS ON TABLE DB2INST1.RRTest ON ALL COLUMNS AND INDEXES ALL ALLOW WRITE ACCESS"


db2 connect to db2TT
db2 +c

select * From RRTEST where TSID='20070223ORD01267732' for update with RR
select * From RRTEST where TSID='20070222ORD01266302' for update with RR

select * From RRTEST where TSID='20070223ORD01267732' for update with RS
select * From RRTEST where TSID='20070222ORD01266302' for update with RS

select * From RRTEST where unID1='20070223ORD01267732' for update with RR
select * From RRTEST where unID1='20070222ORD01266302' for update with RR
select * From RRTEST where unID1='20070223ORD01267732' for update with RS
select * From RRTEST where unID1='20070222ORD01266302' for update with RS

select * From RRTEST where unID2='20070223ORD01267732' for update with RR
select * From RRTEST where unID2='20070222ORD01266302' for update with RR
select * From RRTEST where unID2='20070223ORD01267732' for update with RS
select * From RRTEST where unID2='20070222ORD01266302' for update with RS

select * From RRTEST where pkID='20070223ORD01267732' for update with RR
select * From RRTEST where pkID='20070222ORD01266302' for update with RR
select * From RRTEST where pkID='20070223ORD01267732' for update with RS
select * From RRTEST where pkID='20070222ORD01266302' for update with RS



按照以上字段 pkID 是主键,unID1 是唯一健索引,unID2 是普通健索引,TSID 是普通字段,没有在上建立索引。

试验结论:

      
  PK_INDEX    UNIQ_INDEX   NormalINDEX   NO_INDEX
WITH  RR     锁行,不锁表  锁行,不锁表  不锁行,不锁表(1)  锁行,锁表
WITH  RS     锁行,不锁表  锁行,不锁表  锁行,不锁表  锁行,锁表(2)
         


锁行是指在一个事务中用某种方式读取并更改了改行数据并显示得指明要修改后,这个事务将锁住改行,直到它提交或者回滚了事务后,才释放该锁。

锁表是指在用以上各种SQL在读取并更改一行的同时锁住了整个表。

对以上红字部分(1)可能有不能理解的是:为什么对普通索引和主键或者唯一健索引的不同结论? 

 对 PK和UNIQ的解释是因为RR 是可重复的读的级别,对这次检索扫描到的有可能成为自己的潜在检索对象的内容都会锁住,而因为是主键或者唯一健,别的行不可能成为这次这个检索的潜在读的范围,就是对别的数据此事务根本就没有必要锁,任何情况的更改都不可能出现幻读的情况(此表上的约束限制),所以只锁这一行。这么理解对PK,UNIQ没有问题。

但是NormalINDEX 我认为应该是锁住这个表而不是不锁。这点一直没想明白。留待以后再加强理解。

对 RS隔离级别是“锁定检索到的数据行”,是通过SQL检索到的结果进行锁定, PK,UNIQ,INDEX的结论完全都可以理解。 对 tableScan的检索而出现的锁表有些象RR隔离级别的所为。

嗯,想了一圈没想明白,故把详细过程贴出来给自己留个纪念,以供以后遇到此类并发控制程序中注意一下,select * From TTT where ****= ? for update with RR(RS),这里的 *** 可不是随便定义的。

隔离级别分为RR/RS/CS/UR这四个级别。 下面让我们来逐一论述:

1. RR隔离级别: 在此隔离级别下, DB2会锁住所有相关的纪录。 在一个SQL语句执行期间, 所有执行此语句扫描过的纪录都会被加上相应的锁。 具体的锁的类型还是由操作的类型来决定, 如果是读取,则加共享锁; 如果是更新, 则加独占锁。 由于会锁定所有为获得SQL语句的结果而扫描的纪录, 所以锁的数量可能会很庞大, 这个时候, 索引的增加可能会对SQL语句的执行有很大的影响,因为索引会影响SQL语句扫描的纪录数量。

2. RS隔离级别: 此隔离级别的要求比RR隔离级别稍弱,此隔离级别下会锁定所有符合条件的纪录。 不论是读取, 还是更新, 如果SQL语句中包含查询条件, 则会对所有符合条件的纪录加相应的锁。 如果没有条件语句, 也就是对表中的所有记录进行处理,则会对所有的纪录加锁。

3. CS隔离级别: 此隔离级别仅锁住当前处理的纪录。

4. UR隔离级别:此隔离级别下,如果是读取操作,不会出现任何的行级锁。对于非只读的操作,它的锁处理和CS相同。


DB2默认的隔离级别是 CS。即 游标稳定性。

DB2分页查询
SELECT * FROM (Select 字段1,字段2,字段3,rownumber() over(ORDER BY 排序用的列名 ASC) AS rn from 表名) AS a1 WHERE a1.rn BETWEEN 10 AND 20
SELECT * FROM (Select T.*,rownumber() over(ORDER BY T.ID ASC) AS rn from ADMINISTRATOR.TEST_BY_HUFENG T) AS a1 WHERE a1.rn BETWEEN 1 AND 3
分享到:
评论

相关推荐

    ORACLE到DB2应用移植方法探讨.pdf

    在一些企业系统应用集成时,往往需原先建立的基于 ORACLE 数据库系统移植到 DB2 数据库系统上,这是一项复杂的工程。本文就此展开讨论。 二、移植方案研究 应用系统都是由处理对象和处理规则组成,而基于数据库的...

    ORACLE移植DB2注意事项

    在进行Oracle到DB2数据库移植的过程中,需要注意多个方面的差异,以确保移植后的应用能够正常运行。以下将详细介绍几个关键点: #### 1. 字符串与数字的区别处理 在Oracle中,如果在SQL查询中使用了数字作为字符串...

    常见数据库db2,sqlserver,Oracle比较

    ### 常见数据库db2,sqlserver,Oracle比较 #### 开放性 - **SQL Server**:只能在Windows平台上运行,这意味着对于操作系统的选择极为有限。由于Windows平台本身的设计更偏向于桌面应用,如Windows 9X系列,它们...

    四大数据库的比较(SQL_Server、Oracle、Sybase和DB2)

    ### 四大数据库的比较(SQL Server、Oracle、Sybase和DB2) #### 开放性 **SQL Server:** 仅限于Windows操作系统上运行,缺乏跨平台能力。这对于那些希望在不同操作系统之间灵活迁移的企业来说可能是一个限制因素...

    轻松迁移 Oracle 数据库到 DB2

    通过从Oracle和Microsoft SQL Server等多数据库环境迁移到单一的IBM DB2平台,Agrofert实现了成本的有效控制,估计总体成本降低了20%。 - **启示**:统一数据库平台可以简化管理流程,减少不必要的许可费用和技术...

    数据库移植注意事项(SQLSERVER,ORACLE,DB2).txt

    ### 数据库移植注意事项(SQLSERVER, ORACLE, DB2) 在进行数据库移植时,尤其是在不同的数据库管理系统之间迁移数据和逻辑时,有许多重要的注意事项和技术差异需要特别关注。本文将根据提供的文件内容,详细介绍在...

    利用数据转换器移植数据,提供从db2导入到oracle

    数据移植是IT行业中常见的任务,尤其在数据库管理系统之间,如从DB2到Oracle的迁移。这个过程涉及到数据的完整性和一致性,确保业务连续性不受影响。以下是对标题和描述中所述知识点的详细说明: 1. **数据转换器**...

    Oracle与DB2的对应关系

    在使用工具进行移植时,系统将 Oracle 的 Date 对应到 timestamp。例如,在 Oracle 中可以使用 To_char(dTime,’yyyy-mm-dd hi24:mi:ss’) 将日期型数据转化为字符型,而在 DB2 中可以使用 To_char(dTime,’yyyy-mm-...

    java数据库驱动包(oracle,db2,sql2005,sql2000)

    其中,Thin驱动是最常用的,它是一个纯Java实现,不需要中间层,可以直接连接到数据库,提高了性能和可移植性。 2. DB2 JDBC驱动: DB2是由IBM开发的高性能数据库管理系统,适用于大型企业和云环境。DB2也提供了...

    oracle、db2、informix数据库的jdbc包

    总的来说,这个"oracle、db2、informix数据库的jdbc包"为Java开发者提供了一站式的数据库连接解决方案,简化了跨数据库系统的开发工作,提升了项目的可移植性和灵活性。了解并熟练掌握这些JDBC驱动的使用,对于Java...

    DB2到ORACLE的数据转移工具程序

    - 导出:可以从DB2使用内置的命令行工具如db2export或第三方工具如SQL*Loader、Toad等导出数据到CSV或其他可读格式。 - 导入:在Oracle端,可以使用SQL*Loader、Data Pump或PL/SQL程序将数据导入新创建的表中。 5...

    将 CONNECT BY 移植到 DB2

    #### 示例:将 Oracle 的 CONNECT BY 移植到 DB2 ##### 示例环境准备 为了演示这一转换过程,我们需要创建一个包含员工和他们上级的简单表。假设表结构如下: ```sql CREATE TABLE emp ( empid INTEGER NOT NULL ...

    db2数据库移植和转换工具

    在DB2中,移植可能涉及到不同版本之间的升级,或是从其他数据库系统如Oracle、MySQL等向DB2的迁移。关键步骤包括数据库结构分析、数据转换、应用代码调整和测试验证。 2. **数据库转换**:转换更侧重于数据的格式、...

    db2与oracle差别.pdf

    SQL PL 和 PL/SQL 差异巨大,这也是从 Oracle 到 DB2 转型最大的工作量所在。 六、置包 Oracle 数据库提供了很多置包:DBMS_OUTPUT、DBMS_SQL、DBMS_ALERT、DBMS_PIPE、DBMS_JOB、DBMS_LOB、DBMS_UTILITY、UTL_...

    SQLAPI++ vs2017 dll

    SQLAPI++ 2017 64位 可用dll,SQLAPI ++是一个C ++库,用于访问多个SQL数据库(Oracle,SQL Server,DB2,Sybase,Informix,InterBase,SQLBase,MySQL,PostgreSQL,SQLite,SQL Anywhere和ODBC)。它使用目标DBMS...

    DB2、ORACLE

    DB2和Oracle是两种广泛应用的关系型数据库管理系统,它们在SQL语法上存在一些显著的差异,这使得在跨数据库系统开发时需要特别注意兼容性问题。以下是一些主要的区别点: 1. **数据类型转换函数**: - Oracle允许...

    oracle数据迁移到db2数据库的实现方法(分享)

    Oracle 数据迁移到 DB2 数据库是一项常见的任务,特别是在企业级应用中,可能因为各种原因需要进行数据平台的更换。下面将详细介绍如何实现这个过程,主要包括表结构迁移和表数据迁移两个主要步骤。 **1. 表结构...

    sqlj oracle db2

    - **可移植性**:SQLJ支持多种数据库系统,如Oracle、DB2等。 - **代码简洁**:通过SQLJ,可以在Java中直接使用SQL语句,无需繁琐的数据处理代码。 - **性能优化**:编译器能够优化SQL语句的执行计划,提高查询效率...

    SQLAPI for_BCB

    在C++ Builder(BCB)环境中,SQLAPI for BCB 提供了集成的解决方案,使得开发人员可以利用BCB强大的可视化组件和IDE,同时享受到SQLAPI的数据库抽象层带来的便利。使用这个库,开发者可以避免编写大量的低级数据库...

    使用 IBM DB2 Migration Toolkit 迁移数据

    对于那些已经成功将应用程序移植到 DB2 但仍有部分客户希望将生产环境中的 Oracle 或 SQL Server 数据迁移到 DB2 的用户来说,本文提供了详细的解决方案。 #### 前提条件 - 已经下载并安装了 IBM DB2 Migration ...

Global site tag (gtag.js) - Google Analytics