使用HR schema创建Oracle外部表时遇ORA-29913错误求排查
解决Oracle外部表创建时的ORA-29913/KUP语法错误
从你给出的错误栈(KUP-00554、KUP-01005)可以明确看到,核心问题是外部表访问参数的语法顺序出错了:MISSING FIELDS VALUES ARE NULL子句的位置不符合Oracle Loader的语法规范,解析器在该位置期望看到字段定义或左括号,却遇到了MISSING关键字。
错误原因分析
在Oracle外部表的ACCESS PARAMETERS中,MISSING FIELDS VALUES ARE NULL是FIELDS子句的可选属性,必须紧跟在FIELDS TERMINATED BY这类字段分隔符定义之后,而不能放在REJECT ROWS WITH ALL NULL FIELDS之后、字段列表之前。你的代码把它放在了错误的层级,导致解析失败。
修正后的创建代码
create directory ex_tab as 'C:\My Works\External Table'; create table strecords ( st_id number(4), st_name varchar(10), schl_name varchar(5), st_city varchar(15), st_year number(4) ) ORGANIZATION EXTERNAL ( TYPE oracle_loader DEFAULT DIRECTORY ex_tab ACCESS PARAMETERS ( RECORDS DELIMITED BY newline FIELDS TERMINATED BY ',' MISSING FIELDS VALUES ARE NULL -- 调整到FIELDS子句内,紧跟分隔符定义 REJECT ROWS WITH ALL NULL FIELDS ( st_id number(4), st_name char(10), schl_name char(5), st_city char(15), st_year number(4) ) ) LOCATION ('strecords.txt') );
额外注意事项
- 确保Oracle数据库对应的操作系统用户(Windows下通常是
OracleService<你的SID>用户)拥有对C:\My Works\External Table目录的读写权限,否则即使语法正确,后续查询也可能出现权限相关的错误。 - 验证
strecords.txt文件的格式是否符合定义:每行记录用逗号分隔字段,换行符作为记录分隔符,字段数量和表结构匹配。
执行修正后的代码后,再运行desc strecords;和select * from strecords;应该就能正常工作了。
内容的提问来源于stack exchange,提问作者Aditya Singh
相关产品推荐
相关产品推荐

