Oracle APEX:如何从JSON读取色值并显示到颜色选择器
解决Oracle APEX颜色选择器读取JSON配置值的问题
问题根源
你当前存储的JSON格式无效:颜色值#fd1313这类没有用双引号包裹,Oracle的JSON解析函数无法正常识别,这是导致读取失败的核心原因之一。
步骤1:修正存储的JSON格式
1.1 确保新存储的JSON是有效的
修改存储逻辑,将颜色值转为字符串格式,正确的JSON示例:
{"attention": "#fd1313", "property": "#ea00ff", "not_reported": "#0004ff", "off_property": "#00ffe1", "carts_in_use": "#1eff00", "carts_idle": "#ffd500"}
1.2 修复已存在的错误数据
如果USR表中已有无效JSON,执行以下SQL修正:
UPDATE USR SET setting_pref = REGEXP_REPLACE(setting_pref, '(#[\da-fA-F]{6})', '"\1"') WHERE setting_pref IS NOT NULL; COMMIT;
步骤2:正确读取JSON值到颜色选择器
以下两种方法任选其一:
方法1:直接在组件Source中使用JSON_VALUE
针对每个颜色选择器组件,在Source配置区的SQL Query中填写:
SELECT JSON_VALUE(setting_pref, '$.attention') FROM USR WHERE user_id = :APP_USER;
- 替换
$.attention为对应键名(比如$.property对应property颜色项) - 替换
user_id = :APP_USER为你的实际用户匹配条件(比如用户名、用户ID字段)
方法2:通过页面流程批量赋值
- 为每个颜色选择器创建对应页面项(比如
P_ATTENTION_COLOR、P_PROPERTY_COLOR等) - 在页面的Before Header区域添加一个PL/SQL Process,代码如下:
DECLARE l_pref CLOB; BEGIN -- 读取当前用户的配置 SELECT setting_pref INTO l_pref FROM USR WHERE user_id = :APP_USER; -- 解析JSON并赋值给页面项 :P_ATTENTION_COLOR := JSON_VALUE(l_pref, '$.attention'); :P_PROPERTY_COLOR := JSON_VALUE(l_pref, '$.property'); :P_NOT_REPORTED_COLOR := JSON_VALUE(l_pref, '$.not_reported'); :P_OFF_PROPERTY_COLOR := JSON_VALUE(l_pref, '$.off_property'); :P_CARTS_IN_USE_COLOR := JSON_VALUE(l_pref, '$.carts_in_use'); :P_CARTS_IDLE_COLOR := JSON_VALUE(l_pref, '$.carts_idle'); EXCEPTION WHEN NO_DATA_FOUND THEN -- 用户无配置时设置默认值 :P_ATTENTION_COLOR := '#fd1313'; :P_PROPERTY_COLOR := '#ea00ff'; :P_NOT_REPORTED_COLOR := '#0004ff'; :P_OFF_PROPERTY_COLOR := '#00ffe1'; :P_CARTS_IN_USE_COLOR := '#1eff00'; :P_CARTS_IDLE_COLOR := '#ffd500'; END;
- 将每个颜色选择器的Source设为Static Value,并绑定对应的页面项。
关键检查点
- 确认颜色选择器的Format属性设置为
Hex Color,确保组件能正确识别#开头的颜色代码。 - 确认USR表的
setting_pref列类型为CLOB或足够长度的VARCHAR2(比如VARCHAR2(4000))。 - 验证查询条件的正确性,确保只返回当前用户的一行数据,避免因多行导致的错误。
内容的提问来源于stack exchange,提问作者codename_zoe
相关产品推荐
相关产品推荐

