Oracle包编译报错PLS-00103:遇文件结尾期望分号
Oracle APEX包编译报错PLS-00103:遇到end-of-file期望分号,保留关联数组类型时失败
问题详情
在Oracle APEX应用中创建包时出现编译错误,同一代码在其他环境可正常编译,但当前环境抛出如下错误:
第22行错误:PLS-00103: 遇到符号"end-of-file",期望以下之一: ; 系统已用";"替代"end-of-file"以继续。
包定义代码如下:
CREATE OR REPLACE PACKAGE ul_sync_pkg AS FUNCTION get_version RETURN VARCHAR2; TYPE environments_tbl IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER; PROCEDURE context_topic( p_context_id_i IN ul_context.context_id%TYPE, p_source_env_i IN ul_environment.env_name%TYPE, p_target_envs_i IN environments_tbl, p_message_o OUT VARCHAR2 ); PROCEDURE sync_alias( p_context_id_i IN ul_context.context_id%TYPE, p_source_env_i IN ul_environment.env_name%TYPE, p_target_envs_i IN environments_tbl, p_message_o OUT VARCHAR2 ); FUNCTION get_system_user RETURN NUMBER; FUNCTION get_apex_user RETURN NUMBER; END ul_sync_pkg; /
关键现象及排查情况
- 移除
TYPE environments_tbl IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER;行后,包编译正常,但业务需要保留该关联数组类型。 - 已完成排查:
- 确认当前环境与正常环境的数据库版本、配置一致
- 验证依赖对象
ul_context、ul_environment存在且结构正确 - 检查脚本无隐藏/不可打印字符
- 尝试过SQL Developer、SQL*Plus等多种编译工具
- 该代码此前在当前环境可正常运行,现突然报错
解决方法尝试
1. 重新格式化代码并确保分号识别
部分情况下,换行符编码或格式问题会导致数据库无法正确解析语句结尾的分号。尝试将代码重新整理,确保每个语句(包括类型定义)后的分号清晰独立,同时统一使用Unix风格换行符(LF):
CREATE OR REPLACE PACKAGE ul_sync_pkg AS FUNCTION get_version RETURN VARCHAR2; TYPE environments_tbl IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER; PROCEDURE context_topic( p_context_id_i IN ul_context.context_id%TYPE, p_source_env_i IN ul_environment.env_name%TYPE, p_target_envs_i IN environments_tbl, p_message_o OUT VARCHAR2 ); PROCEDURE sync_alias( p_context_id_i IN ul_context.context_id%TYPE, p_source_env_i IN ul_environment.env_name%TYPE, p_target_envs_i IN environments_tbl, p_message_o OUT VARCHAR2 ); FUNCTION get_system_user RETURN NUMBER; FUNCTION get_apex_user RETURN NUMBER; END ul_sync_pkg; /
2. 检查并对齐编译参数
查询当前环境与正常环境的PL/SQL相关参数,重点对比字符集和编译警告设置:
-- 查询字符集 SELECT * FROM v$nls_parameters WHERE parameter LIKE '%CHARACTERSET'; -- 查询PL/SQL警告参数 SELECT value FROM dba_parameters WHERE name = 'PLSQL_WARNINGS';
若发现参数差异,调整为与正常环境一致后重新编译包。
3. 临时将类型改为全局定义测试
如果上述方法无效,可先将关联数组类型创建为全局类型,再在包中引用:
CREATE OR REPLACE TYPE environments_tbl IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER; / CREATE OR REPLACE PACKAGE ul_sync_pkg AS FUNCTION get_version RETURN VARCHAR2; PROCEDURE context_topic( p_context_id_i IN ul_context.context_id%TYPE, p_source_env_i IN ul_environment.env_name%TYPE, p_target_envs_i IN environments_tbl, p_message_o OUT VARCHAR2 ); PROCEDURE sync_alias( p_context_id_i IN ul_context.context_id%TYPE, p_source_env_i IN ul_environment.env_name%TYPE, p_target_envs_i IN environments_tbl, p_message_o OUT VARCHAR2 ); FUNCTION get_system_user RETURN NUMBER; FUNCTION get_apex_user RETURN NUMBER; END ul_sync_pkg; /
若编译成功,说明当前环境对包内类型解析存在临时异常,之后可尝试将类型移回包内重新编译。
4. 更新依赖对象统计信息
依赖对象的统计信息异常可能导致编译错误,执行以下语句更新统计信息后再编译:
EXEC DBMS_STATS.GATHER_TABLE_STATS('你的用户名', 'UL_CONTEXT'); EXEC DBMS_STATS.GATHER_TABLE_STATS('你的用户名', 'UL_ENVIRONMENT');
内容的提问来源于stack exchange,提问作者Atul
相关产品推荐
相关产品推荐

