1. 为什么从CSV到Oracle,我选了Kettle而不是一把梭
任务本身一句话就能说清:把一批csv文件导入到Oracle,也就是很多人挂在嘴边的“导入到pl/sql”。但这句话背后的麻烦,真正跑过一遍数据的人才有体会——编码不统一、日期格式参差、几十万行文件跑到一半报主键冲突,而且不能轻轻松松点了重来。如果只是用PL/SQL Developer自带的文本导入器点几下,文件小、格式干净的时候确实快;可文件一大、列一多、数据类型还乱七八糟,点完基本就开始后悔了。
1.1 这不是“导入不导入”的问题,而是数据到库之前要不要“过一遍”
PL/SQL Developer里有个“文本导入器”(Text Importer),用来导入csv看起来很方便:选择文件、预览、选择目标表、字段映射、点导入。数据量在几千行、字段都是简单字符、也没有复杂日期处理需求的时候,这条路是可行的,我早期也这么干过。但实际生产场景中,csv往往是从别的系统导出的,字段类型、长度、格式根本不是按你的目标表来设计的,会出现:中文字段已经乱码、日期既有2024/1/5 8:30又有2024-01-05 08:30:00、18位的订单号被当成数字后精度丢失、同一批数据里偶尔还混着空行和多个空格。用文本导入器处理这些,虽然也不是完全不行,但每导一次都要重新核对一遍映射关系,而且出错了没有日志、没有重试机制,只能从头再来。几万行数据也许还能忍受,几百万行的时候就非常痛苦了。
1.2 Kettle在整个场景里到底扮演了什么角色
Kettle(现在的官方名是Pentaho Data Integration,社区里习惯叫PDI)核心就是一个可视化的ETL工具。ETL三个字母对应到这次实际任务就是:Extract从csv文件里读取数据,Transform对读出来的数据做类型转换、去空格、统一日期等清洗动作,Load把处理好的数据写进Oracle目标表。这个链路最大的好处是可以保存成转换文件,下次换一个文件,只要把路径改一下,跑起来就行;整个过程中字段类型、格式规则、日志、错误处理都是可见、可控、可复现的,而不是一次性的“导入向导”。所以当手里有一份需要反复导入的csv,或者目标表字段结构相对固定时,我会优先考虑用Kettle搭一个转换流程,而不是直接开PL/SQL Developer的导入工具。这篇文章就把我实际搭建这个流程时用到的配置、思路和踩过的坑完整记录下来,给同样卡在csv入库这件事上的人做一个参考。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开工前先把这几件事确认清楚:连接串、驱动、字符集
很多人在Kettle里半天连不上Oracle,问题往往不是Kettle本身,而是前置条件没有核对好。真正动手建转换之前,我习惯先确认三件事:驱动包是否就位、数据库连接类型是否选对、文件里到底是什么编码。这三件事里任何一件没搞定,后面所有操作都会白做。
2.1 pl/sql和PL/SQL Developer,目标到底是哪个
先把这个题目的常见歧义说清楚。很多人说“把csv导入pl/sql”,但pl/sql实际上是Oracle的编程语言,不是数据库,也不是能直接“导入数据”的地方。大家真正想表达的是:把csv文件导入到Oracle数据库的某个表里,然后通过PL/SQL Developer这个客户端工具去查看和使用数据。所以一开始我建议明确:你要导入的目标是一个已经存在的业务表,还是允许新创建一个表。如果是新表,建议先想好字段名、类型、主键,提前在数据库里把表结构建好,而不是让Kettle在运行中创建,因为Kettle自动生成的建表语句往往和业务预期有差距,基本不会生成合适的注释、约束和索引。
比如我这里规划一个常见的例子。目标表结构如下:
sql复制CREATE TABLE t_order (
order_id VARCHAR2(20) NOT NULL,
order_date DATE NOT NULL,
amount NUMBER(10,2),
customer_name VARCHAR2(100),
CONSTRAINT pk_t_order PRIMARY KEY (order_id)
);
order_id是20位以内的字符串,最典型的情况是里面存了20位以内的纯数字单号或者带前缀的编号;order_date是DATE类型;amount是金额。我手里的样例文件叫order_data.csv,表头是ORDER_ID,ORDER_DATE,AMOUNT,CUSTOMER_NAME,总行数大约5万,文件编码不确定,中文姓名在Windows记事本里打开正常。
2.2 驱动缺了就是连不上:ojdbc该放哪里才有效
Kettle连接Oracle不像连MySQL那样开箱即用。Kettle安装包默认并不自带完整的Oracle JDBC驱动,所以第一次新建数据库连接时,极有可能报找不到驱动类,或者在“测试”时提示无法加载驱动。解决办法很简单:从Oracle官方下载对应版本的ojdbc驱动jar包,放到Kettle安装目录下的lib文件夹里,然后重启Spoon。如果Kettle正在运行,放了驱动不重启是不会生效的。
驱动版本怎么选?我的建议是:不要一上来就找最
