Oracle Apex表单提交报错ORA-01847:合规日期仍报错求助
解决ORA-01847错误的步骤
这个问题我之前也碰到过,大概率是Apex在提交时解析日期字符串的格式和你显示的格式不匹配导致的——哪怕你看到的日期看起来合法,但Oracle可能在用不同的规则解析它。咱们一步步来解决:
1. 调整选择列表的返回值设计
你的查询现在返回格式化后的日期字符串作为显示值、id作为返回值。如果表单是要把选中的日期保存到DATE类型字段里,这个逻辑就有问题:返回的id是数字,但表单字段可能在尝试把这个数字当成日期字符串解析,自然会报错。
正确的做法是让选择列表:
- 显示值用格式化后的日期字符串(方便用户识别)
- 返回值用原始的
data字段(DATE类型,让Apex直接处理日期值,跳过字符串解析环节)
修改后的查询:
SELECT to_char(data, 'DD/MM/YYYY HH24:MI') AS display_value, data AS return_value FROM seanse WHERE id_film = :P15_TYTUL;
2. 匹配表单项的日期格式掩码
如果你的表单项是Date Picker或Date类型,一定要确保它的Format Mask设置为DD/MM/YYYY HH24:MI,和你查询里的日期格式完全一致。这样Apex在提交时就能正确识别返回的日期值。
设置路径:编辑表单项 → 找到「Formatting」区域 → 填写Format Mask为DD/MM/YYYY HH24:MI
3. 显式指定日期转换格式(若必须用字符串返回值)
如果因为业务限制必须返回字符串作为选择列表的返回值,那在保存到数据库时,一定要显式指定日期格式,不要依赖Oracle的会话默认格式。比如在表单的处理Process中用TO_DATE函数转换:
INSERT INTO your_target_table (date_column) VALUES (TO_DATE(:P15_YOUR_DATE_ITEM, 'DD/MM/YYYY HH24:MI'));
这样不管会话的日期格式是什么,都能正确解析字符串。
4. 排查是否绑定了错误字段
最后再检查一遍:你的表单项是不是错误地绑定了选择列表的返回值?比如如果选择列表返回的是id,但你把这个id赋值给了DATE类型字段,Oracle会把数字id当成日期字符串解析,必然触发ORA-01847错误。这种情况下,要么调整选择列表返回日期值,要么通过id查询对应的data字段再赋值。
内容的提问来源于stack exchange,提问作者e_cinema
相关产品推荐
相关产品推荐

