页面项P3_NATIONALITY渲染报错ORA-06502,多语言LOV配置求助
问题描述
在Oracle APEX系统中,页面项P3_NATIONALITY的列表值(LOV)需按会话语言切换显示:阿拉伯语(ar-ae)环境下显示阿拉伯语国籍名称,英语环境下显示英语名称。但打开页面时触发渲染错误,具体错误信息如下:
Error during rendering of page item P3_NATIONALITY.
Technical Info (only available for developers)
is_internal_error: true
apex_error_code: WWV_FLOW_FORM.UNHANDLED_ERROR
ora_sqlcode: -6502
ora_sqlerrm: ORA-06502: PL/SQL: numeric or value error: NULL index table key value
当前使用的LOV查询代码:
select CASE WHEN APEX_UTIL.GET_SESSION_LANG = 'ar-ae' THEN SYS_CODES.ITEM_DESC_A ELSE SYS_CODES.ITEM_DESC_E END , SYS_CODES.ITEM_NO as ITEM_NO from SYS_CODES WHERE TABLE_NO = 108 AND ITEM_NO > 0 AND HOSPITAL_NO = 1;
SYS_CODES表结构:
CREATE TABLE "SYS_CODES" ( "HOSPITAL_NO" VARCHAR2(10), "TABLE_NO" NUMBER(6,0), "SUB_TABLE_NO" NUMBER(6,0), "ITEM_NO" NUMBER(6,0), "ITEM_DESC_A" VARCHAR2(100) NOT NULL ENABLE, "ITEM_DESC_E" VARCHAR2(100) NOT NULL ENABLE, "VALUE_1" VARCHAR2(8), "VALUE_2" VARCHAR2(8), "PROTECT" NUMBER(1,0) NOT NULL ENABLE, "LAST_UPDATE_DATE" NUMBER(8,0), "LAST_UPDATE_COUNT" NUMBER(5,0), "LAST_UPDATE_USER" VARCHAR2(8), "LAST_UPDATE_TRANSACTION" VARCHAR2(1), PRIMARY KEY ("HOSPITAL_NO", "TABLE_NO", "SUB_TABLE_NO", "ITEM_NO") USING INDEX ENABLE ) ;
此前在动态菜单列表中使用相同CASE WHEN逻辑实现多语言显示正常,疑问为何页面项LOV配置时出现该错误。
分析与解决
错误原因
ORA-06502的“NULL index table key value”提示,结合APEX LOV的渲染逻辑,核心问题是LOV查询返回的显示列出现了NULL值,触发了APEX内部的索引表键值校验异常。
虽然表结构中ITEM_DESC_A和ITEM_DESC_E都设置了NOT NULL约束,但仍存在两种可能:
APEX_UTIL.GET_SESSION_LANG返回的语言代码不符合预期(比如返回NULL、小写ar-ae或仅ar),导致CASE语句未匹配到任何分支,最终返回NULL。- APEX对LOV显示列的NULL值容忍度远低于动态菜单,菜单能正常处理的NULL场景,LOV会直接抛出索引表错误。
修复方案
方案1:优化CASE语句,确保显示列非空
修改LOV查询,兼容多种语言代码格式并添加兜底逻辑,同时明确列名避免解析异常:
select CASE WHEN LOWER(APEX_UTIL.GET_SESSION_LANG) LIKE 'ar%' THEN SYS_CODES.ITEM_DESC_A ELSE SYS_CODES.ITEM_DESC_E END AS DISPLAY_VALUE, SYS_CODES.ITEM_NO AS RETURN_VALUE from SYS_CODES WHERE TABLE_NO = 108 AND ITEM_NO > 0 AND HOSPITAL_NO = 1;
优化点说明:
- 用
LOWER(...) LIKE 'ar%'兼容ar、ar-AE、ar_ae等多种阿拉伯语会话代码格式 - 明确命名显示列和返回列,避免APEX自动解析列名时出现异常
方案2:使用APEX内置多语言LOV配置(推荐)
遵循APEX原生多语言设计规范,无需手写CASE语句:
- 创建基础LOV,返回
ITEM_NO(返回值)和ITEM_DESC_E(默认英语显示值) - 进入APEX的翻译模块,针对
ar-ae语言,将LOV的显示值映射为ITEM_DESC_A - 这种方式更稳定,能避免自定义逻辑带来的兼容性问题
验证步骤
- 单独执行修改后的LOV查询,确认返回的显示列无NULL值
- 在APEX中切换会话语言为
ar-ae和英语,测试LOV的显示效果 - 可在页面添加临时显示项,设置值为
APEX_UTIL.GET_SESSION_LANG,确认会话语言返回值符合预期
内容的提问来源于stack exchange,提问作者Ziad Adnan

