当前位置:首页 > 问答 > 正文

CSV导入 Oracle数据库:如何将CSV文件中的数据导入Oracle数据库?

📂 场景化引入:当CSV文件遇上Oracle数据库
假设你是一名刚接手电商项目的数据分析师,领导甩给你一个500万行的用户行为日志CSV文件,要求半小时内导入Oracle数据库做分析,你打开PL/SQL Developer一看——好家伙,表结构有20多个字段,部分字段还带逗号和引号!这时候如果只会用SQL Developer的导入向导,怕是要加班到天亮🌙,别慌,本文手把手教你3种高效导入姿势,从青铜到王者全覆盖!

🚀 PL/SQL Developer文本导入器(新手友好版)
1️⃣ 文件预处理
用Excel打开CSV时,记得:

  • 另存为「CSV UTF-8(逗号分隔)」格式
  • 检查特殊字符:如果字段含逗号,必须用双引号包裹(如"张三,北京"
  • 删除表头外的空行

2️⃣ 三步导入法
① 连接数据库 → 菜单栏选 Tools → Text Importer
Open Data File 选择CSV → To Oracle Data 标签页选目标表
③ 重点来了!点击 Field Mapping 核对列对应关系 → 导入模式选 Replace(覆盖旧数据)

💡 避坑指南

  • 若报错「字段数不匹配」,检查CSV是否有隐藏列
  • 导入后执行 SELECT COUNT(*) FROM 表名 验证数据量

🐢 *SQLLoader工具(性能怪兽版)*
当CSV文件超过1GB时,必须请出Oracle官方性能神器——SQL
Loader!实测导入1.5亿条数据仅需28分钟🔥

CSV导入 Oracle数据库:如何将CSV文件中的数据导入Oracle数据库?

1️⃣ 编写控制文件(.ctl)

LOAD DATA  
CHARACTERSET UTF8  -- 防中文乱码  
INFILE '/data/bigdata.csv'  
INTO TABLE USER_LOG  
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'  
(  
  USER_ID,  
  ACTION_TIME "TO_DATE(:ACTION_TIME, 'yyyy-mm-dd hh24:mi:ss')",  -- 日期格式转换  
  IP_ADDRESS "TRIM(:IP_ADDRESS)"  -- 去除IP地址前后空格  
)  

2️⃣ 命令行执行

sqlldr userid=admin/123456@orcl control=bigdata.ctl log=import.log

💡 加速技巧

  • 添加 DIRECT=TRUE 参数启用直接路径导入(速度提升3倍!)
  • 大文件建议分片:ROWS=100000 每10万条提交一次

🌐 外部表(黑科技版)
想让Oracle像读本地文件一样直接查询CSV?外部表了解一下!

CSV导入 Oracle数据库:如何将CSV文件中的数据导入Oracle数据库?

1️⃣ 创建目录对象

CREATE DIRECTORY csv_dir AS '/data/csv_files';
GRANT READ ON DIRECTORY csv_dir TO your_user;

2️⃣ 定义外部表

CREATE TABLE ext_user_log (  
  USER_ID VARCHAR2(20),  
  ACTION_TIME DATE,  
  IP_ADDRESS VARCHAR2(15)  
)  
ORGANIZATION EXTERNAL (  
  TYPE ORACLE_LOADER  
  DEFAULT DIRECTORY csv_dir  
  ACCESS PARAMETERS (  
    RECORDS DELIMITED BY NEWLINE  
    FIELDS TERMINATED BY ','  
    MISSING FIELD VALUES ARE NULL  
  )  
  LOCATION ('bigdata.csv')  
)  
REJECT LIMIT UNLIMITED;  -- 忽略格式错误行

3️⃣ 数据查询

SELECT * FROM ext_user_log WHERE ROWNUM <= 10;  -- 直接查询CSV内容
INSERT INTO real_table SELECT * FROM ext_user_log;  -- 导入实际表

💡 高级玩法

CSV导入 Oracle数据库:如何将CSV文件中的数据导入Oracle数据库?

  • 结合物化视图定时同步:
    CREATE MATERIALIZED VIEW mv_user_log  
    REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE + 1/24  
    AS SELECT * FROM ext_user_log;

⚠️ 通用注意事项

  1. 编码一致性:CSV/控制文件/数据库字符集必须统一(推荐UTF-8)
  2. 内存优化:大文件导入前执行 ALTER SYSTEM SET SGA_TARGET=8G;
  3. 错误处理:检查生成的 .log.bad 文件定位失败记录

🎯 方案选型指南
| 场景 | 推荐工具 | 特点 |
|---------------------|---------------|-----------------------------|
| 少量数据快速验证 | PL/SQL导入器 | 零代码,可视化操作 |
| 百万级以上大数据量 | SQL*Loader | 性能王者,支持并行加载 |
| 定期自动化同步 | 外部表 | 无需导入,直接查询CSV |

现在打开你的CSV文件,选择最适合的武器开始数据攻坚战吧!如果遇到「ORA-28009: connection to sys should be as sysdba」报错,记得在连接字符串后加 AS SYSDBA 哦~ 🛡️

发表评论