You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 00:25:28