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

使用RECORD类型替代数据库类型后PL/SQL函数报错求助

问题分析与解决:PLS-00103错误排查

问题背景

之前使用数据库对象类型(object type)成功创建了返回查询结果的函数,现在需要替换为记录类型(record type),修改后触发PLS-00103错误:

PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: begin function pragma procedure


原可正常运行的代码

create or replace type type_TRAUDIT040 as object
   (X VARCHAR2(1000), 
    DOCUMENT_ID VARCHAR2(1000 ), 
    PR3_ID VARCHAR2(1000 ), 
    MICROFILM_ID VARCHAR2(1000 ), 
    CNT_PR3_ID VARCHAR2(1000 ), 
    CNT_MICRO_ID VARCHAR2(1000 ), 
    CREATE_USERID VARCHAR2(1000 ), 
    PAYEE_PRVR_EXT_ID VARCHAR2(1000 ), 
    RECCNT VARCHAR2(1000 ),
    cp_claim_types_desc VARCHAR2(1000 ),
    cp_claim_status_desc VARCHAR2(1000 ),
    count_document_id  VARCHAR2(1000 )
   );
   
create or replace type table_TRAUDIT040 is table of type_TRAUDIT040;

create or replace function fn_traudit040
(
    p_Ambulance  varchar2
) 
return table_TRAUDIT040
as test_type table_TRAUDIT040;
   
BEGIN
     SELECT type_TRAUDIT040( 
             x,document_id,PR3_ID,MICROFILM_ID,CNT_PR3_ID,CNT_MICRO_ID,create_userid,PAYEE_PRVR_EXT_ID,RecCnt,'1' ,'2','3'
           )
    BULK COLLECT INTO test_type
    FROM   TRAUDIT040;
     
    RETURN test_type;

END;

修改后报错的代码

create procedure p_traudit040(p_name varchar2)
is
    TYPE type_rec_summary IS RECORD (
        bhs_id  VARCHAR2(40),        
        Name    VARCHAR2(40),
        bh_inst_id  NUMBER
    );
    
    TYPE type_tab_sum IS
        TABLE OF type_rec_summary;

    FUNCTION f_get_data return type_tab_sum
    as test_type type_tab_sum ;
    begin
         SELECT type_rec_summary( 
             bhs_id, Name, bh_inst_id
           )
    BULK COLLECT INTO test_type
    FROM   blu_benefit_holder_sections  tr040
    where Name = p_name;
    
    return test_type;
end;

错误原因与修正方案

1. 语法结构不完整

报错核心原因是代码缺少闭合标记:内部函数f_get_data的end;仅结束了自身定义,但外部的存储过程p_traudit040没有对应的end;来闭合,导致解析器遇到文件结束符时仍未找到预期的闭合标记。

2. 记录类型的使用错误

对象类型可以通过类型名(字段列表)的方式构造实例,但记录类型不支持这种构造语法,直接查询字段并批量收集到集合即可。

修正后的完整代码

create procedure p_traudit040(p_name varchar2)
is
    TYPE type_rec_summary IS RECORD (
        bhs_id  VARCHAR2(40),        
        Name    VARCHAR2(40),
        bh_inst_id  NUMBER
    );
    
    TYPE type_tab_sum IS TABLE OF type_rec_summary;

    FUNCTION f_get_data return type_tab_sum
    as 
        test_type type_tab_sum;
    begin
        -- 记录类型无需构造函数,直接批量收集字段
        SELECT bhs_id, Name, bh_inst_id
        BULK COLLECT INTO test_type
        FROM   blu_benefit_holder_sections tr040
        where Name = p_name;
        
        return test_type;
    end f_get_data; -- 显式指定结束的函数名,避免嵌套混淆

-- 存储过程主逻辑,可在此调用内部函数
begin
    declare
        v_result type_tab_sum;
    begin
        v_result := f_get_data;
        -- 此处可添加结果处理逻辑,比如循环输出、业务校验等
    end;
end p_traudit040; -- 显式指定结束的存储过程名

内容的提问来源于stack exchange,提问作者sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:14:56