使用apex_data_parser插入数据报错ORA-20987的解决求助
问题:APEX插入数据报错ORA-20987:上传文件无数据
错误信息
SQL Error: ORA-20987: No data found in uploaded file. ORA-06512: at "APEX_200100.WWV_FLOW_DATA_PARSER", line 5384 ORA-06512: at "APEX_200100.WWV_FLOW_DATA_PARSER", line 4782 ORA-06512: at line 1
场景描述
上传文件实际包含数据,移除WHERE条件或LEFT JOIN关联后可正常执行插入,但需要仅插入特定行(如第2行);该SQL两天前可正常运行,现在突然报错。
原SQL代码
Insert into emp (EMPNO,ENAME,JOB,MGR,SAL,COMM,DEPTNO) Select col001,col002,col003,col004,col005,col006,d.ID from apex_application_temp_files f, table ( apex_data_parser.parse ( p_content=> f.blob_content, p_file_name=> f.filename)) left join dept d on d.code=col007 Where LINE_NUMBER = 2;
错误原因分析
- 查询逻辑优先级问题:逗号连接(交叉连接)的优先级高于
LEFT JOIN,原SQL中WHERE LINE_NUMBER=2是对交叉连接后的结果集过滤,若过滤后无返回行,会触发APEX解析器的"无数据"错误。 - 解析结果行号变化:文件格式(如表头识别、换行符、编码)或APEX解析规则变化,导致目标行的
LINE_NUMBER不再是2,比如表头行被识别为第1行,数据行从第2行变为第3行。 - 临时文件异常:APEX临时文件可能过期、损坏,或本次上传的文件内容存在空行/格式错误,导致解析后目标行不存在。
解决方法
1. 验证解析结果
先执行以下查询,确认解析后的结果集中是否存在LINE_NUMBER=2的行:
Select t.*, d.ID from apex_application_temp_files f, table ( apex_data_parser.parse ( p_content=> f.blob_content, p_file_name=> f.filename)) t left join dept d on d.code = t.col007;
- 若不存在
LINE_NUMBER=2的行,检查文件内容是否新增空行/表头,调整LINE_NUMBER的值(如改为3)。 - 若存在,则说明是查询逻辑问题,按方法2调整。
2. 调整查询逻辑(优先过滤目标行再关联)
使用CROSS APPLY先过滤解析后的目标行,再关联dept表,避免因外部过滤导致结果为空触发错误:
Insert into emp (EMPNO,ENAME,JOB,MGR,SAL,COMM,DEPTNO) Select t.col001, t.col002, t.col003, t.col004, t.col005, t.col006, d.ID from apex_application_temp_files f cross apply ( select * from table ( apex_data_parser.parse ( p_content=> f.blob_content, p_file_name=> f.filename)) where LINE_NUMBER = 2 ) t left join dept d on d.code = t.col007;
3. 检查临时文件与上传格式
- 重新上传目标文件,排除临时文件损坏/过期问题。
- 检查文件格式:确认CSV分隔符、引号规则与之前一致,避免解析时出现行识别错误。
内容的提问来源于stack exchange,提问作者nasim
相关产品推荐
相关产品推荐

