无需额外安装工具,除SQL Loader外用Bash脚本导入CSV至Oracle的方法
无需额外工具的Bash脚本导入CSV到Oracle方法
以下几种方法均基于Oracle自带的sqlplus工具(通常随Oracle客户端/服务器默认安装,无需额外部署),完全通过Bash脚本实现:
方法1:生成INSERT语句批量执行
通过Bash解析CSV内容,逐行生成INSERT语句,再通过sqlplus提交到Oracle数据库。适合小到中等规模的CSV文件。
示例脚本
#!/bin/bash # 配置Oracle连接信息 ORACLE_USER="your_username" ORACLE_PWD="your_password" ORACLE_DB="your_tns_name_or_connection_string" CSV_FILE="/path/to/your/data.csv" TARGET_TABLE="your_target_table" # 跳过CSV表头(如果有),用awk生成INSERT语句并处理特殊字符 awk -F ',' 'NR>1 { # 转义字段中的单引号 gsub(/'\''/,"'\'''\''", $0) print "INSERT INTO '$TARGET_TABLE' VALUES('\''"$1"'\'', '\''"$2"'\'', '\''"$3"'\'');"; }' "$CSV_FILE" | sqlplus -s "$ORACLE_USER/$ORACLE_PWD@$ORACLE_DB" <<EOF SET FEEDBACK OFF SET HEADING OFF SET ECHO OFF COMMIT; EXIT; EOF
注意事项
- 替换脚本中的连接信息、文件路径和表名
- 若CSV字段包含逗号(带引号包裹),需修改
awk的分隔符逻辑,比如处理带双引号的字段 - 大文件可优化为批量提交(例如每1000条执行一次COMMIT)
方法2:使用Oracle外部表(高效适配大文件)
Oracle外部表允许直接读取服务器上的CSV文件,无需提前导入,可通过SQL直接将数据插入目标表。Bash脚本只需调用sqlplus完成外部表的创建、数据迁移和清理。
示例脚本
#!/bin/bash ORACLE_USER="your_username" ORACLE_PWD="your_password" ORACLE_DB="your_tns_name_or_connection_string" CSV_FILE="/path/to/your/data.csv" TARGET_TABLE="your_target_table" # 需提前在Oracle中创建对应DIRECTORY对象并授予读写权限 ORACLE_DIR="CSV_IMPORT_DIR" # 执行SQL逻辑 sqlplus -s "$ORACLE_USER/$ORACLE_PWD@$ORACLE_DB" <<EOF -- 创建临时外部表 CREATE TABLE temp_ext_table ( col1 VARCHAR2(100), col2 NUMBER, col3 DATE ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY $ORACLE_DIR ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE SKIP 1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' MISSING FIELD VALUES ARE NULL ) LOCATION ('$(basename $CSV_FILE)') ) REJECT LIMIT UNLIMITED; -- 将外部表数据插入目标表 INSERT INTO $TARGET_TABLE SELECT * FROM temp_ext_table; COMMIT; -- 删除临时外部表 DROP TABLE temp_ext_table; EXIT; EOF
注意事项
- 需提前在Oracle中创建DIRECTORY对象:
CREATE DIRECTORY CSV_IMPORT_DIR AS '/path/to/csv/folder';,并授予权限:GRANT READ, WRITE ON DIRECTORY CSV_IMPORT_DIR TO your_username; - 外部表的字段定义必须与CSV文件的列顺序、数据类型完全匹配
- 此方法性能远优于单条INSERT,适合GB级别的大文件
内容的提问来源于stack exchange,提问作者Rajnie27
相关产品推荐
相关产品推荐

