Kettle将Oracle Blob字段导出为文件

最近由于需要做数据迁移,用到了kettle这个工具,由于api不多,开发过程非常艰难,最终也算是做出来了,以下贴上代码

具体流程很短,如上图所示,将数据库中数据查出来后使用java脚本将blob转换成文件流输出,java脚本代码如下

import javax.imageio.ImageIO;
import java.io.*;
import java.sql.Blob;
import java.sql.SQLException;
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
  Object[] r = getRow();
  if (r == null) {
    setOutputDone();
    return false;
  }
	try {
			String stationid = get(Fields.In, "STATIONID").getString(r);
			output(getBytes(r,"STATIONPHOTO"),"sp"+stationid,"jpg");
			output(getBytes(r,"STATIONREPORT"),"sr"+stationid,"doc");
			output(getBytes(r,"STATIONPNTMAP"),"sm"+stationid,"jpg");
        } catch (Exception e) {
            e.printStackTrace();
        }
  return true;
}

public byte[] getBytes(Object[] r,String name) t
<think>嗯,用户现在问的是如何将MariaDB的数据导出Oracle兼容的格式。之前的历史对话是关于TD SQL存储过程的,但当前问题转向了数据库迁移。用户提供的引用材料主要涉及MariaDB和MySQL的兼容性、安装配置等,但用户的核心需求是数据格式转换。 用户可能正在做数据库迁移项目,需要把MariaDB的数据迁移到Oracle环境。考虑到Oracle和MariaDB的语法差异较大,特别是数据类型、函数和DDL语句方面,直接导出导入肯定会遇到兼容性问题。 从技术角度看,这个需求需要分三步解决:首先是数据类型映射,比如MariaDB的INT要转成Oracle的NUMBER(10),VARCHAR要转成VARCHAR2;其次是SQL语句转换,包括去除MariaDB特有的AUTO_INCREMENT属性,替换为Oracle的序列+触发器方案;最后是特殊字符处理,比如Oracle的保留字需要加引号。 用户提供的引用[3]特别提到CHECKSUM TABLE的差异,这提示我们要注意函数和计算逻辑的不同。不过更关键的是基础数据结构的转换。比如MariaDB的DATETIME精度是6位小数,而Oracle的TIMESTAMP支持9位,迁移时需要显式指定精度。 在实现路径上,建议用户优先使用SQLines这样的专业迁移工具,可以自动处理80%以上的语法转换。如果数据量不大,用CSV中转+手动调整DDL也是可行的,但要注意CLOB/BLOB等二进制数据的特殊处理。 用户可能没意识到Oracle的schema命名规则比MariaDB严格,比如表名长度限制和大小写敏感问题,这些在迁移脚本中都需要预处理。另外测试环节很重要,建议用户在Oracle环境先跑几个典型查询验证数据一致性。</think>将 MariaDB 数据导出Oracle 兼容格式需解决**数据类型差异**、**SQL语法区别**和**字符集兼容性**问题。以下是详细步骤: --- ### 一、核心步骤 #### 1. **导出数据为中性格式(CSV/SQL)** ```bash # 导出CSV(适合纯数据) mysql -u user -p -e "SELECT * FROM db.table" \ | sed 's/\\N/NULL/g' > data.csv # 将\N转为Oracle的NULL # 导出SQL(含DDL) mysqldump -u user -p --compatible=oracle --no-create-info db > data.sql ``` > **关键参数**: > - `--compatible=oracle`:尝试生成Oracle兼容语法[^2] > - `--no-create-info`:跳过建表语句(需单独处理DDL) #### 2. **DDL转换(重点解决差异)** | MariaDB 类型 | Oracle 兼容类型 | 转换示例 | |---------------------|------------------------|------------------------------| | `INT AUTO_INCREMENT`| `NUMBER(10) + SEQUENCE`| 需创建序列和触发器 | | `DATETIME` | `TIMESTAMP` | 保留6位小数精度 | | `VARCHAR(255)` | `VARCHAR2(255 CHAR)` | 显式指定`CHAR`避免字节长度问题 | | `TEXT` | `CLOB` | 大文本处理 | **示例转换**: ```sql -- MariaDB原表 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), reg_date DATETIME ); -- Oracle兼容版 CREATE SEQUENCE users_seq; -- 替代自增 CREATE TABLE users ( id NUMBER(10) PRIMARY KEY, name VARCHAR2(50 CHAR), reg_date TIMESTAMP ); CREATE TRIGGER users_trigger BEFORE INSERT ON users FOR EACH ROW BEGIN SELECT users_seq.NEXTVAL INTO :new.id FROM DUAL; END; ``` #### 3. **数据导入Oracle** ```sql -- SQL*Loader控制文件(load.ctl) OPTIONS (SKIP=1) -- 跳过CSV标题行 LOAD DATA INFILE 'data.csv' INTO TABLE users FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' (id, name, reg_date TIMESTAMP "YYYY-MM-DD HH24:MI:SS") ``` 执行导入: ```bash sqlldr user/password@orcl control=load.ctl ``` --- ### 二、关键兼容性问题处理 | 问题类型 | 解决方案 | |--------------------|--------------------------------------------------------------------------| | **字符集差异** | 导出前统一为UTF-8:`SET NAMES utf8mb4` | | **函数差异** | 替换`NOW()`→`SYSDATE`,`CONCAT()`→`||` | | **空值表示** | 将`\N`替换为`NULL` | | **保留字冲突** | Oracle保留字(如ORDER,LEVEL)需加双引号:`"ORDER"` | | **分页语法** | 替换`LIMIT 10`→`WHERE ROWNUM <= 10` | --- ### 三、推荐工具简化流程 1. **[SQLines](https://www.sqlines.com/online)** 在线转换DDL和SQL语法(支持批量处理) ```sql -- 自动转换示例 /* MYSQL */ SELECT * FROM tbl LIMIT 10; /* ORACLE */ SELECT * FROM tbl WHERE ROWNUM <= 10; ``` 2. **Oracle SQL Developer** 内置迁移工具:`工具 > 数据库移植 > 第三方数据库迁移` 3. **[Pentaho Kettle](https://sourceforge.net/projects/pentaho/)** 可视化ETL工具,支持字段级映射 --- ### 四、验证数据一致性 ```sql -- 检查行数 SELECT 'MariaDB' AS src, COUNT(*) FROM mariadb.table UNION ALL SELECT 'Oracle', COUNT(*) FROM oracle.table; -- 抽样校验 SELECT * FROM ( SELECT id, name FROM mariadb.table ORDER BY RAND() LIMIT 100 ) m FULL OUTER JOIN oracle.table o ON m.id = o.id WHERE m.name <> o.name OR o.id IS NULL; ``` > ⚠️ **注意**: > 若导出`BLOB`数据,需用`HEX()`函数转为十六进制字符串,Oracle侧用`UTL_RAW.CAST_TO_RAW()`转换[^3]。 --- **迁移流程图**: ```mermaid graph LR A[MariaDB] --> B[导出CSV/SQL] B --> C{转换DDL} C --> D[修正数据类型/序列] D --> E[处理函数差异] E --> F[Oracle导入] F --> G[数据验证] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值