适用版本
- [[Oracle APEX19.2]]
- APEX补丁版本 19.2.0.00.16
背景
在表单中输入超过4000字符时,保存操作会报错。以下是针对该问题的详细分析与解决方案。

问题
当用户尝试保存超过4000字符的备注信息时,系统抛出错误。为了验证数据是否正确获取,我们进行了以下测试:
1
2
3
4
5
|
BEGIN
apex_debug.warn('---------');
apex_debug.warn(length(:P120_REMARK));
apex_debug.warn('---------');
END;
|
通过上述代码,我们确认了数据确实被正确获取,但插入操作仍然失败。这表明问题可能出在平台自带的增删改查处理逻辑上。

解决方案
首先,我们尝试调整字段长度,将REMARK字段从VARCHAR2(4000)修改为更大的容量,例如VARCHAR2(30000)。如果数据库不支持大于4000的VARCHAR2类型,则增加一个CLOB列来存储长文本。
1
2
3
|
ALTER TABLE DEMO666_CONF_ENV MODIFY REMARK varchar2(30000);
-- 如果数据库不支持大于4000 则增加一个clob列,其他跟varchar2类似
ALTER TABLE DEMO666_CONF_ENV add REMARK_clob clob;
|
尽管调整了字段长度,问题依旧存在。因此,我们决定手动拆分保存处理过程,以确保每一步都能正常执行。以下是具体的实现步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
DECLARE
BEGIN
IF :REQUEST = 'CREATE' THEN
INSERT INTO DEMO666_CONF_ENV (env_type, env_key, env_value, remark)
VALUES (:P120_ENV_TYPE,
:P120_ENV_KEY,
:P120_ENV_VALUE,
:P120_REMARK)
RETURNING id INTO :P120_ID;
ELSIF :REQUEST = 'SAVE' THEN
UPDATE DEMO666_CONF_ENV
SET ENV_TYPE = :P120_ENV_TYPE,
ENV_KEY = :P120_ENV_KEY,
ENV_VALUE = :P120_ENV_VALUE,
REMARK = :P120_REMARK
WHERE id = :P120_ID;
END IF;
END;
|
通过这种方式,我们成功地替换了平台自带的增删改查处理逻辑,解决了超长文本保存的问题。
显示优化
为了改善用户体验,我们将显示的备注信息截断为前200个字符,并提供一个链接,点击后可以查看完整的备注内容。以下是查询语句和弹框页的实现:

查询语句
1
2
3
4
5
6
7
8
9
10
|
SELECT ID,
ENV_TYPE,
ENV_KEY,
ENV_VALUE,
SUBSTR(REMARK, 1, 200) AS REMARK,
CREATED,
CREATED_BY,
UPDATED,
UPDATED_BY
FROM DEMO666_CONF_ENV;
|
弹框页(P122)PL/SQL 动态内容
新增区域类型为 PL/SQL 动态内容,并新增页项 P122_ID
1
2
3
4
5
6
7
8
9
10
|
DECLARE
v_C varchar2(30000);
v_v clob;
BEGIN
SELECT REMARK AS REMARK
INTO v_C
FROM DEMO666_CONF_ENV
WHERE id = :P122_ID;
htp.P(htf.escape_sc(v_C));-- 注意这里可能存在安全问题
END;
|

通过以上方法,我们不仅解决了超长文本保存的问题,还优化了显示效果,提升了用户体验。至此,所有相关的增删改查操作都已逐一拆分并实现,确保系统的稳定性和可靠性。
这是一个脚注 。