oraclelongraw字段处理方法.doc_第1页
oraclelongraw字段处理方法.doc_第2页
oraclelongraw字段处理方法.doc_第3页
oraclelongraw字段处理方法.doc_第4页
oraclelongraw字段处理方法.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DB Team 内部文件:输入文件名和版本号Oracle long raw字段处理方法作者:耿雷雨时间:2015.11.3第 6 页 共 7 页目 录&文件版本说明2&参考资料2&手册目的2&声明2&名词定义和缩略语说明21问题描述32解决办法32.1SQL方式32.2Kettle方式3& 文件版本说明表 1 版本说明版本发布时间修订章节作者12015.114初稿耿雷雨& 参考资料无& 手册目的记录日常工作中的问题,互相交流学习。& 声明无& 名词定义和缩略语说明表 2 名词定义及缩略语说明序号缩写说明121 问题描述Long raw类型是oracle数据库的一个老的数据类型,属于不推荐使用的类型,这种类型的数据很难使用SQL进行操作。在ETL过程中通过如果源库中存在long raw字段,通过一般存储过程或者抽取工具无法处理这种数据。2 解决办法针对long raw类型,一种方法可以在源库将这个字段转换成blob字段,这个需要我们能操作源库,一般没有这个权限。另一种方法可以通过java脚本查询出数据后,将数据存储到blob字段中,这种方式一般的代码是单条处理,效率比较慢,而且独立于ETL工具和脚本。可以将代码嵌入到ETL流程中,利用工具本身多线程并行特性加快执行效率。2.1 SQL方式新建一张表列为blob类型,使用to_lob函数进行数据转换。Insert into table2(id,zp) select id,to_lob(zp) from table1;2.2 Kettle方式一般情况下,只有源库查询权限。通过dblink无法查询lob字段,第一种方式无法实现。通过写java脚本结合kettle工具可以解决这个问题。整体处理流程如下:表输入正常查询源表数据,预览数据时发现long raw字段列为一个很长的16进制字符串。(最初时不清楚该字符串是什么编码,也不知如何将该字符串转成照片。想到kettle是java编写的,通过编写简单java类模拟表输入查询,确定了kettle内部使用的是哪个方法转换的long raw字段。后续结合百度的内容,多次尝试确定字符串为一个16进制的数据。)将该字符串转换成二进制即可将数据存储为照片。16进制转换二进制就由后面的java代码块来处理。代码块代码如下:/*此处代码为kettle java代码块组件的模版生成,点击code snippits-common use-main会自动生成代码框架,在此框架上增加自己业务代码即可。*/import java.io.*;String zpStreamField;/在此定义全局变量public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleExceptionObject r = getRow();if (r = null) setOutputDone(); return false;if (first) /* zpStreamField为java代码块参数设置的参数 */zpStreamField = getParameter(zpStreamField);first=false;/ It is always safest to call createOutputRow() to ensure that your output rows Object is large / enough to handle any new fields you are creating in this step./ Object outputRow = createOutputRow(r, data.outputRowMeta.size();/获取输入的照片字段的值,存入zpstr变量中String zpstr = get(Fields.In, ZP).getString(r);/ Set the value in the output field/调用函数将16进制转换为二进制的bytebyte zpStream = hexStringToBytes(zpstr);/将zpStream添加到输出流中get(Fields.Out, zpStreamField).setValue(outputRow, zpStream); / putRow will send the row on to the default output hop./ putRow(data.outputRowMeta, outputRow);return true;private byte charToByte(char c) return (byte) 0123456789ABCDEF.indexOf(c); /进制转换方法public byte hexStringToBytes(String hexString) if (hexString = null | hexString.equals() return null; int length = hexString.length() / 2; char hexChars = hexString.toCharArray(); byte d = new bytelength; for (int i = 0; i length; i+) int pos = i * 2; di = (byte) (charToByte(hex

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论