目1 引言
本文档的编写是为了解决在集成过程中经常遇到的Clob类型的集成问题。这里是通过编写Jython代码,将代码嵌入到KM中,实现Clob类型数据的抽取。
缩写、术语
|
解 释
|
Clob
|
Character Large Object,字符型大对象,主要用于存储内容较长的文本。
|
|
|
|
|
与Blob的类似,在LKM sql to sql (Jython)中并未指定对Clob的处理方法。所以,我们同样需要将对Clob的处理方式加入到Jython代码中。
同样,与Blob的处理方式类似,对Clob同样需要先转化为流——字符流。在java中,Clob是这样进行处理的:
getCharacterStream(int columnIndex)
setCharacterStream(int parameterIndex,Reader reader,Int length)
总的处理思路还是与Blob类似:
1. 将Clob数据以字符流的形式读出。
2. 判断读出的Clob是否为空,如果为空,则直接以setCharacterStream输出,length指定为0。如果非空,则将字节流读入到一个缓冲数组,再将缓冲数组读入到一个输出流中,获取输出流的长度(转为字符数组可得到长度),然后就可以通过set方法将输出流写入临时区域的Clob字段。
虽然处理的思路相同,但引用的方法却不同,这点将在接下来介绍。
另外,Clob和Blob一样,都不能进行“==”比较和在minus、distinct、group by等子句中出现,所以同样要用到IKM Oracle Incremental Update Lob,这个KM中是删除了minus操作的。
我们先在ODI中打开LKM sql to sql(Jython),双击打开步骤Load data (JYTHON),
同样,加入一段elif代码,如图:
加入的代码如下:
elif colType == sql.Types.CLOB: #Code 2001
resline=rqteSrc.getCharacterStream(nb+1)
if resline:
ary = jarray.zeros(1024,'c')
r = resline.read(ary)
out = CharArrayWriter()
while (r >= 0) :
out.write(ary,0,r)
r = resline.read(ary)
try:
instream = CharArrayReader(out.toCharArray())
length = len(out.toCharArray())
psmt.setCharacterStream(nb+1,instream,length)
except java.lang.Exception,e:
print e.getLocalizedMessage().encode("utf-8")
elif not resline:
psmt.setCharacterStream(nb+1,resline,0)
现在来分析这段代码,
1. resline=rqteSrc.getCharacterStream(nb+1),这是对字符流的处理方式,与字节流不同。
2. ary = jarray.zeros(1024,'c'),这里是‘c’,不是Blob用的‘b’。
3. out = CharArrayWriter(),这是生成字符输出流的方式,有别于Blob的out = ByteArrayOutputStream()
4. instream = CharArrayReader(out.toCharArray()),生成字符输入流。
5. out.toCharArray()生成字符数组,Blob中是out.toByteArray()。
这段代码可对照Blob的处理代码来看,也可对照文档《Blob类型的集成》来看。
引用的包有:
from java.io import CharArrayWriter
from java.io import CharArrayReader
最后,将LKM保存并重命名为LKM sql to sql Clob(Jython)。
我们先在ODI中打开LKM sql to sql(Jython),双击打开步骤Load data (JYTHON),
打开它的表达式编辑器,查看它的代码,可以看到一些诸如如下代码的语句
elif colType == sql.Types.CHAR:
resline=rqteSrc.getString(nb+1)
psmt.setString(nb+1,resline)
这些语句的功能是对针对不同的数据类型采取不一样的类型判断。因此,我们在改写这个KM时,只需要将处理Blob类型的语句加入其中就可以实现对Blob的读取了。
因此,在这些elif语句中,加入了一行新的elif,如图:
加入的代码如下:
elif colType == sql.Types.BLOB: #Code 2000
resline=rqteSrc.getBinaryStream(nb+1)
if resline:
buffer = jarray.zeros(1024,'b')
r = resline.read(buffer)
out = ByteArrayOutputStream()
while (r >= 0) :
out.write(buffer,0,r)
r = resline.read(buffer)
try:
instream = ByteArrayInputStream(out.toByteArray())
length = len(out.toByteArray())
psmt.setBinaryStream(nb+1,instream,length)
except java.lang.Exception,e:
print e.getLocalizedMessage().encode("utf-8")
elif not resline:
psmt.setBinaryStream(nb+1,resline,0)
这里的语法采用的是Jython的语法,Jython语言与其它语言有些不同,它不以分号来标识一行代码的结束,只用换行就可以,另外,Jython使用空格缩进,来识别程序的分组和级别,例如上面的代码中,第三行的if和倒数第二行的elif,他们的起始符都是用了6个空格缩进,这样Jython才能识别这个if和elif属于同一分组,这点非常重要。
现在来分析这段代码,
1. elif colType == sql.Types.BLOB,判断字段类型是否为Blob;
2. resline=rqteSrc.getBinaryStream(nb+1),将数据以字节流的方式读出,代码最后的psmt.setBinaryStream(nb+1,instream,length)表示将instream写入目标。
3. if resline表示判断resline是否为空,buffer = jarray.zeros(1024,'b')表示创建一个buffer数组,‘b’代表存储的是字节型,1024是数组长度(1KB)。
4. r = resline.read(buffer)将resline写入buffer数组,r表示读入的字节数。
5. out = ByteArrayOutputStream()
while (r >= 0) :
out.write(buffer,0,r)
r = resline.read(buffer)
这段生成一个out输出流。实际上,将resline读入out中,每次都是读1KB,直至读完为止,while语句的功能就是如此,当r为null时,停止循环。
6. instream = ByteArrayOutputStream (out.toByteArray())表示将out生成一个输入流。
7. length = len(out.toByteArray())表示获取输出流out的长度,也就是Blob字段的大小。
8. elif not resline表示当resline为null时怎么处理。判断resline是否为null一定要加入代码,不然,一味用ByteArrayOutputStream和ByteArrayOutputStream的方法处理,会导致在执行r = resline.read(buffer)时报错。
因为在这段Jython代码中引用了一些java的方法,因此在代码最开始的部分,要将这些包import进来。所以最开始要加入如下代码:
import jarray
from java.io import ByteArrayOutputStream
from java.io import ByteArrayInputStream
此IKM与Blob集成所用的IKM一样,都是采用的IKM Oracle Incremental Update Lob(删除了minus操作)。做实施时,可以将此KM导入即可。
创建接口INT_CLOB_ORA_TO_ORA,实现Clob数据从Oracle到Oracle的集成。
在“流”标签页中选择编辑好的KM:
“确定”,完成接口的创建。
执行接口,在Operator中查看,
LKM sql to sql Clob(Jython)用于处理Oracle的Clob字段。如果是其他数据库的字符型大对象字段,例如SQL Server的text、ntext类型,可以采用相同的处理思想来实现数据的加载——即转为字符流来判断字段长度,并将数据读出。
IKM Oracle Incremental Update Lob也仅适用于Oracle的Lob集成,其他数据库的集成时所需的IKM还需要重新编辑。
LKM sql to sql Clob(Jython)和IKM Oracle Incremental Update Lob都已放置在配置库中,在实施中可直接导入ODI中使用。
本文转自:http://dangdj.spaces.live.com/?_c11_BlogPart_pagedir=Next&_c11_BlogPart_handle=cns!EDE097CEA39ABC75!204&_c11_BlogPart_BlogPart=blogview&_c=BlogPart
分享到:
相关推荐
在给定的压缩包文件中,我们有两个与LOB(Large Object)类型相关的Knowledge Modules(KM),它们是KM_IKM Oracle Incremental UpdateLOB.xml和KM_LKM SQL to SQL LOB (JYTHON).xml。 首先,让我们详细了解一下LOB...
在这个名为"ODI LOB知识模块"的压缩包中,重点是关于处理CLOB(Character Large Object)类型数据的知识。CLOB是一种数据库对象,用于存储大量文本数据,如XML文档、长篇报告或任何其他非结构化字符数据。 LKM...
### ORACLE ODI安装文档详解 #### 一、概述与前提条件 本文档旨在提供详细的Oracle Data Integrator (ODI) 安装指南,适用于希望部署ODI进行数据集成项目的组织和个人。ODI是一款强大的企业级数据集成工具,用于...
Oracle ODI(Oracle Data Integrator)是一款由Oracle公司推出的高效数据集成工具,它是基于Sunopsis公司Active Integration Platform的产品,自2006年10月被Oracle收购后,整合进了Oracle Fusion Middleware产品线...
### Oracle Data Integrator (ODI) 11g 开发手册 #### ODI 11g 下载与安装 - **ODI 安装程序下载**: - ODI 11g 可以从 Oracle 官方网站下载:...
### Oracle Data Integrator (ODI): 企业级数据整合的核心技术 #### 执行概览 在当今数字化时代,数据已成为企业最宝贵的资产之一。而数据整合则是支撑企业信息系统的重要基石。选择不合适的数据整合技术可能会对...
Oracle ODI 11g(Oracle Data Integrator 11g)是Oracle公司提供的一款强大的数据集成工具,用于处理各种数据整合任务,如数据加载、转换和验证。本官方教程旨在帮助用户熟悉如何创建和连接Oracle ODI的主仓库...
- **完整的数据集成平台**:ODI能够处理所有类型的数据集成需求,包括数据仓库、数据迁移、数据服务等。 - **架构设计**:ODI采用纯Java设计,支持跨平台运行,具有瘦客户端元数据浏览器,以及可扩展的组件化元数据...
- **强大的数据处理能力**:支持多种数据源类型,能够高效处理大规模数据集。 - **灵活的工作流设计**:通过图形化的界面让用户轻松设计复杂的ETL流程。 - **丰富的数据质量工具**:内置数据质量检查工具,帮助确保...
ODI 通过 LogMiner 从 Oracle 数据库中抽取增量数据 本文主要介绍了使用 ODI 通过 LogMiner 技术从 Oracle 数据库中抽取增量数据的方法。ODI 提供了三种知识模块来抽取数据库中的增量数据:Simple、Consistent 和 ...
除了 Oracle 数据库之外,ODI 还支持连接其他类型的数据源,如 Microsoft SQL Server 2005。这需要通过相应的 Knowledge Module 来实现。 **3.2 Open and Closed Issues for this Deliverable** 在文档的末尾,作者还...