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

页面项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约束,但仍存在两种可能:

  1. APEX_UTIL.GET_SESSION_LANG返回的语言代码不符合预期(比如返回NULL、小写ar-ae或仅ar),导致CASE语句未匹配到任何分支,最终返回NULL。
  2. 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语句:

  1. 创建基础LOV,返回ITEM_NO(返回值)和ITEM_DESC_E(默认英语显示值)
  2. 进入APEX的翻译模块,针对ar-ae语言,将LOV的显示值映射为ITEM_DESC_A
  3. 这种方式更稳定,能避免自定义逻辑带来的兼容性问题

验证步骤

  1. 单独执行修改后的LOV查询,确认返回的显示列无NULL值
  2. 在APEX中切换会话语言为ar-ae和英语,测试LOV的显示效果
  3. 可在页面添加临时显示项,设置值为APEX_UTIL.GET_SESSION_LANG,确认会话语言返回值符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:35:02