使用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
相关产品推荐
相关产品推荐

