外部表查询时出现ORA-29913和ORA-29400错误

本文解决了一个在使用Oracle Loader创建外部表时遇到的解析accessparameters错误的问题,通过更正关键字terminiated为terminated,成功解决了ORA-29913和ORA-29400错误。


create table t_ext_tab(id char(1),name char(6))
organization external(
type oracle_loader
default directory scott_dir
access parameters(
records delimited by newline
fields terminiated by '#')
location ('ext.tab')
);


select * from t_ext_tab;
*
第 1 行出现错误:
ORA-29913: 执行 ODCIEXTTABLEOPEN 调出时出错
ORA-29400: 数据插件错误KUP-00554: error encountered while parsing access parameters

KUP-01005: syntax error: found "identifier": expecting one of: "column, enclosed, exit, (, ltrim, lrtrim, ldrtrim, missing, notrim, optionally, rtrim,
 reject, terminated"
KUP-01008: the bad identifier was: terminiated
KUP-01007: at line 2 column 8
ORA-06512: 在 "SYS.ORACLE_LOADER", line 19

 

错误原因——从错误提示信息中可以看到是解析access parameters时出错了。仔细检查发现fields terminiated by '#'中的关键字terminiated写错了。正确的应该是"terminated"。

 

外部表查询时的ORA-29913和ORA-29400错误,通常是由于其中关键字写错或定义的文件不存在。创建外部表时oracle不会验证其正确性。

 


 

转载于:https://www.cnblogs.com/toughhou/p/3778801.html

<think>嗯,用户遇到了PL/SQL导入CSV文件到表报错ORA-00936: missing expression。首先,我需要回忆一下这个错误的常见原因。ORA-00936通常是因为SQL语句中缺少必要的表达式,比如列名、运算符或值。用户提到他们排除了SUM函数GROUP BY的问题,但错误依旧,所以需要从其他方面考虑。 接下来,用户是在导入CSV文件出现的错误,可能涉及到外部表或者SQL*Loader的用法。根据提供的引用[2],用户检查了目录对象EXT_DIR是否存在,发现不存在,这说明可能外部表定义指定的目录对象有误,或者权限不足。这候需要确认是否创建了正确的目录对象,并且授权给了当前用户。 另外,创建外部表的SQL语句是否正确也很关键。比如,是否在列定义后面缺少逗号,或者字段类型与CSV文件中的数据类型不匹配。例如,如果CSV中的日期格式与SQL语句中指定的格式不符,也可能导致解析错误,进而引发ORA-00936。此外,字段名如果使用了Oracle的保留字,但没有用引号括起来,也会导致这个问题。 还要检查外部表的访问权限是否正确。用户需要确保目录对象有READ权限,否则在查询外部表会报错,可能间接导致ORA-00936。 解决方案方面,首先要创建正确的目录对象,并授权。然后检查外部表的定义,确保语法正确,字段类型格式与CSV文件一致。最后,处理数据需要注意保留字格式问题。如果用户使用了UTL_FILE包直接操作文件,也要检查文件路径是否正确,以及是否有访问权限。 可能用户没有正确创建目录对象,或者在SQL语句中存在语法错误,比如缺少逗号或引号。需要逐步排查这些可能性,确保每一步都正确无误。另外,用户可能需要检查CSV文件的实际内容是否与表结构匹配,比如字段数量是否一致,是否存在额外的逗号导致解析错误。</think>### PL/SQL导入CSVORA-00936错误分析与解决 #### 错误原因分析 1. **SQL语法不完整或格式错误** ORA-00936通常由以下原因引发: - 列名缺失或拼写错误,例如`SELECT , col2 FROM table`(缺少列名)[^1] - 外部表定义语句中缺少关键参数,如未指定`ORGANIZATION EXTERNAL`或`LOCATION`子句 - 字段类型与CSV数据不匹配,例如日期字段未指定格式`DATE "YYYY-MM-DD"` 2. **目录对象配置问题** 通过查询`all_directories`发现`EXT_DIR`不存在[^2],说明: - 未使用`CREATE DIRECTORY`创建目录对象 - 目录路径权限未授权给当前用户 3. **外部表定义缺陷** 常见错误定义示例: ```sql CREATE TABLE ext_table ( id NUMBER, name VARCHAR2(20) ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY EXT_DIR -- 若目录未创建会报错 ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY ',' ) LOCATION ('data.csv') ); ``` 此定义缺少`REJECT LIMIT`子句完整字段类型声明。 #### 解决方案步骤 1. **创建目录对象并授权** ```sql CREATE DIRECTORY EXT_DIR AS '/path/to/csv/folder'; GRANT READ, WRITE ON DIRECTORY EXT_DIR TO current_user; ``` 2. **完整外部表定义模板** ```sql CREATE TABLE employees_ext ( emp_id NUMBER(4), emp_name VARCHAR2(50), hire_date DATE ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY EXT_DIR ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE BADFILE 'employees.bad' LOGFILE 'employees.log' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' MISSING FIELD VALUES ARE NULL ( emp_id CHAR(4), emp_name CHAR(50), hire_date DATE "YYYY-MM-DD" ) ) LOCATION ('employees.csv') ) REJECT LIMIT UNLIMITED; ``` 3. **数据验证与错误排查** - 检查CSV文件编码(建议UTF-8) - 验证字段数量匹配:`SELECT COUNT(*) FROM employees_ext` - 查看日志文件定位错误行:`/path/to/csv/folder/employees.log` #### 典型错误场景示例 ```sql -- 错误示例:缺少字段定义 CREATE TABLE error_table ( id NUMBER ) ORGANIZATION EXTERNAL ( DEFAULT DIRECTORY EXT_DIR LOCATION ('data.csv') -- 缺少ACCESS PARAMETERS段 ); -- 执行查询会报ORA-00936 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值