在PL/SQL中如何从APEX_DATA_PARSE.PARSE()获取单行对象存入变量
问题
我正在学习PL/SQL,尝试从APEX的APEX_DATA_PARSE.PARSE()函数返回的表中获取单行数据,存入WWV_FLOW_T_PARSER_ROW类型的变量r_columns_headers中。以下是我的测试代码:
DECLARE r_columns_headers WWV_FLOW_T_PARSER_ROW; --object BEGIN DBMS_OUTPUT.ENABLE; BEGIN <<populate_headers>> select * into r_columns_headers from apex_application_temp_files f, table( apex_data_parser.parse( p_content => f.blob_content, p_add_headers_row => 'Y', P_SKIP_ROWS => 1, p_max_rows => 500, p_store_profile_to_collection => 'FILE_PARSER_COLLECTION', p_file_name => f.filename ) ) p where f.name = '43300947378776117/DATALOAD_Test_data_main_v032.xlsx' and p.line_number = 2; end populate_headers; DBMS_OUTPUT.PUT_LINE(r_columns_headers.id); end;
执行时在SELECT INTO语句处出现PL/SQL: ORA-00947(值不足)错误。我确认查询仅返回一行,且变量类型与返回行类型一致,部分字段为null是否会导致该问题?希望得到解决方法。
解决方法
- 错误原因:
SELECT *会将WWV_FLOW_T_PARSER_ROW对象的所有属性(如id、line_number、columns等)拆分为独立列返回,而你的变量是单个对象类型,两者列数不匹配,这才是引发ORA-00947错误的根本原因。字段为null不会导致该问题。 - 修正方案:直接选择解析结果的行对象本身,而非拆分其属性。将原代码中的
select * into r_columns_headers修改为select p into r_columns_headers。
修正后的代码如下:
DECLARE r_columns_headers WWV_FLOW_T_PARSER_ROW; --object BEGIN DBMS_OUTPUT.ENABLE; BEGIN <<populate_headers>> select p into r_columns_headers from apex_application_temp_files f, table( apex_data_parser.parse( p_content => f.blob_content, p_add_headers_row => 'Y', P_SKIP_ROWS => 1, p_max_rows => 500, p_store_profile_to_collection => 'FILE_PARSER_COLLECTION', p_file_name => f.filename ) ) p where f.name = '43300947378776117/DATALOAD_Test_data_main_v032.xlsx' and p.line_number = 2; end populate_headers; DBMS_OUTPUT.PUT_LINE(r_columns_headers.id); end;
内容的提问来源于stack exchange,提问作者execcr
相关产品推荐
相关产品推荐

