Oracle APEX 22.2.1传递39位超长ID至模态页失败问题求助
问题描述
背景
- 最初使用以下SQL构建APEX层级树,链接可正常打开对应模态页:
select case when connect_by_isleaf = 1 then 0 when level = 1 then 1 else -1 end as status, level, C."Name" || ' (' || C."Alias" || ')' as title, null as icon, C.ID as value, null as tooltip, f?p=&APP_ID.:1105:'||:APP_SESSION||'::::P1105_ID:'||"ID" as link from VBORGUNT C WHERE C.ID_STNT = 190925678486461946459250188392520804336 start with C.ID_BORGUNT = 0 connect by prior C.ID = C.ID_BORGUNT order siblings by C."Name"
- 后续将SQL移至View(移除链接字段),用该View填充树属性后,「Selected Node Page Item」无法填充页面项
P1124_NODE_ID - 改为在树属性的链接字段配置JS:
javascript:apex.item("P1124_NODE_ID").setValue(&ID.),可成功填充ID;为P1124_NODE_ID添加动态动作:值变化时提交页面,通过「After Processing」分支跳转至页面P1105
异常现象
- 传递短ID(如
11111)时,模态页P1105正常打开 - 传递39位超长ID时,模态页显示「未找到记录」错误
- 交互式网格中使用相同的超长ID,可正常打开模态页P1105
问题原因
JavaScript的Number类型仅能精确表示16位以内的整数(最大为2^53),39位超长ID会被JS自动转换为不精确的数值,导致P1124_NODE_ID最终存储的是失真后的ID值,传递到P1105后无法匹配到对应记录。
而交互式网格的链接直接使用f?p=格式拼接字符串传递ID,没有经过JS的数值转换环节,因此能完整保留超长ID的精度。
解决方法
方法1:修正JS代码,将ID作为字符串传递
把树的链接URL修改为:
javascript:apex.item("P1124_NODE_ID").setValue("&ID.");
通过给&ID.添加双引号,让JS将ID识别为字符串类型,避免数值转换导致的精度丢失。
方法2:修复「Selected Node Page Item」填充问题
如果希望回到使用View的原生树节点选择逻辑,可检查以下配置:
- 确认树属性的「Value Column」已绑定到View中的
ID字段 - 确保
P1124_NODE_ID的页面项类型为文本字段(而非数字字段),避免数值转换 - 若数据库中
ID是数值类型,在View中显式将其转换为字符串输出(例如TO_CHAR(C.ID) as ID)
方法3:检查目标页P1105的配置
确认P1105中接收ID的页面项P1105_ID类型为文本字段,且查询记录时使用字符串匹配逻辑,避免因数值类型转换导致的ID失真。
内容的提问来源于stack exchange,提问作者Andy Collier
相关产品推荐
相关产品推荐

