关于PLSQL导入CSV文件报错:无效的月份

关于PLSQL导入CSV文件报错:无效的月份

问题描述

今天使用PLSQL导入CSV格式数据到本地数据库时,遇到报错:无效的月份

原因分析

PLSQL配置的日期格式默认是英文格式,导入的数据是中文格式日期,导致数据导入会报错。

解决方案

方案1、设置PLSQL:工具->首选项->日期/时间都使用windows格式;

方案2、添加环境变量
nls_date_format=YYYY-MM-DD HH24:MI:SS
nls_timestamp_format=YYYY-MM-DD HH24:MI:SS


每天进步一点点

### 如何使用 PL/SQL 导入 CSV 文件 在 PL/SQL 开发中,导入 CSV 文件是一种常见需求。以下是具体方法及其示例: #### 方法一:利用 SQL*Loader 工具 SQL*Loader 是 Oracle 提供的一种高效工具,用于将外部文件中的数据批量加载到数据库表中。它通过控制文件定义数据源和目标表之间的映射关系。 以下是一个完整的流程说明以及代码示例: 1. **准备 CSV 数据文件** 假设有一个名为 `data.csv` 的文件,其内容如下: ``` id,name,age 1,Alice,30 2,Bob,25 ``` 2. **创建目标表** 创建一个与 CSV 文件结构匹配的目标表: ```sql CREATE TABLE employees ( id NUMBER, name VARCHAR2(50), age NUMBER ); ``` 3. **编写控制文件 (CTL)** 控制文件描述了如何解析 CSV 文件并将其插入到目标表中。例如,`control_file.ctl` 可能如下所示: ``` LOAD DATA INFILE 'data.csv' INTO TABLE employees FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( id, name, age ) ``` 4. **运行 SQL*Loader** 使用命令行执行 SQL*Loader 加载数据: ```bash sqlldr username/password control=control_file.ctl ``` 这种方法适用于大规模数据导入场景,并且性能优越[^4]。 --- #### 方法二:手动读取 CSV 文件并通过 PL/SQL 插入 如果需要完全基于 PL/SQL 实现,则可以通过 UTL_FILE 包读取 CSV 文件并将每一行解析后插入到目标表中。 以下是一个具体的实现示例: ```plsql DECLARE v_file UTL_FILE.FILE_TYPE; v_line VARCHAR2(32767); v_id NUMBER; v_name VARCHAR2(50); v_age NUMBER; -- 定义分隔符 PROCEDURE parse_csv(p_line IN OUT NOCOPY VARCHAR2, p_value OUT VARCHAR2) IS v_start PLS_INTEGER := 1; v_end PLS_INTEGER; BEGIN IF LENGTH(p_line) > 0 THEN v_end := INSTR(p_line, ','); IF v_end = 0 THEN v_end := LENGTH(p_line) + 1; END IF; p_value := SUBSTR(p_line, v_start, v_end - v_start); p_line := LTRIM(SUBSTR(p_line, v_end), ','); ELSE p_value := NULL; END IF; END parse_csv; BEGIN -- 打开文件 v_file := UTL_FILE.FOPEN('DIRECTORY_NAME', 'data.csv', 'R'); LOOP -- 逐行读取文件 BEGIN UTL_FILE.GET_LINE(v_file, v_line); EXCEPTION WHEN NO_DATA_FOUND THEN EXIT; -- 结束循环 END; -- 解析 CSV 行 parse_csv(v_line, v_id); parse_csv(v_line, v_name); parse_csv(v_line, v_age); -- 将解析后的数据插入到目标表 INSERT INTO employees (id, name, age) VALUES (v_id, v_name, v_age); END LOOP; -- 关闭文件 UTL_FILE.FCLOSE(v_file); COMMIT; EXCEPTION WHEN OTHERS THEN IF UTL_FILE.IS_OPEN(v_file) THEN UTL_FILE.FCLOSE(v_file); END IF; RAISE; END; / ``` 此方法适合中小规模数据导入场景,灵活性较高,但相比 SQL*Loader 效率较低[^3]。 --- #### 注意事项 - 确保目录对象 (`DIRECTORY_NAME`) 存在于数据库中,并指向存储 CSV 文件的实际路径。 - 如果 CSV 文件字段包含特殊字符(如逗号),需确保字段被双引号包裹[^2]。 - 对于超大数据集,推荐优先考虑 SQL*Loader 方案以提高效率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值