jOOQ 3.21.9 连接 Oracle 19c 生成代码报 DATA_DEFAULT_VC 不存在
Oracle 19c 的 ALL_TAB_COLS 没有 DATA_DEFAULT_VC。jOOQ Professional 3.21.9 生成器查询新字典列会触发 ORA-00904,需按生成器版本回退或等正式修复。
jOOQ 从 3.21.8 升到 3.21.9,连接同一套 Oracle 19c 做代码生成时失败,错误指向系统字典列:
ORA-00904: "SYS"."ALL_TAB_COLS"."DATA_DEFAULT_VC": invalid identifier
若使用 jOOQ Professional Edition,并在获取索引等元数据时看到这条异常,先检查生成器版本与数据库版本的兼容路径。它不是业务表漏了一列,不应该去改实体对应的表,更不能往 SYS 数据字典里手工补列。
这次缺的是数据库版本没有提供的字典列
Oracle 19c 的 ALL_TAB_COLS 提供 DATA_DEFAULT,其类型是 LONG;Oracle 26 的字典还提供 DATA_DEFAULT_VC。后者便于在查询中处理默认值,却不能假定在 19c 上存在。
故障组合明确为 jOOQ Professional 3.21.9、Oracle 19.32、ojdbc11 23.26.3.0.0。仅升级生成器就让同一数据库失败,而 3.21.8 的对照日志能继续完成,这与库权限不足或业务字段拼错不同。
查看完整失败 SQL 与实际连接目标,确认错误确实指向 ALL_TAB_COLS.DATA_DEFAULT_VC。不要只凭 ORA-00904 四个字就回退 jOOQ;这个 Oracle 错误也常用于普通 SQL 的无效标识符。
还要区分运行时 jOOQ 与代码生成器。Maven 插件依赖、独立生成项目或构建脚本可能单独指定版本,只改应用的运行依赖,执行生成任务的组件仍会是 3.21.9。
先恢复已知可工作的生成器组合
无法等待修复发行时,可以评估把这份生成任务恢复到此前已验证可工作的 3.21.8 组合。保留原 Professional 发行渠道、授权配置、生成器插件及其兼容依赖,不把它换成面向另一组数据库能力的空白开源配置。
回退前记录生成配置、实际生成器与运行时版本,并提交当前已生成源码。不要先删除整个生成目录再试;如果新任务仍失败,会同时丢掉最后一份可用产物。
3.21.8 是本问题有对照依据的临时版本,不是长期统一推荐。若工程已经依赖后续生成特性,应在隔离构建中确认回退是否可用;无法保持契约时保留最后通过的生成产物并阻止失败构建发布,不能默默跳过生成后让陈旧模型混入新代码。
截至 2026 年 10 月 23 日,修正已经登记到 3.22.0、3.21.10、3.20.21、3.19.40 这些目标,但截至该日的正式发行记录尚未列出 3.21.10。目标版本与合并状态不能代替可下载、可核对的正式发行。后续采用修复时,应同时检查所用 Professional 包的实际版本和对应修复内容。
不要把 DATA_DEFAULT_VC 机械替换成 DATA_DEFAULT 后热改 JAR。LONG 不能直接参与相同的 SQL 函数处理,完整修正还涉及把相应转换移到 Java;替换一个列名并不保持原查询语义。
生成完成后还要比较模型差异
在原 19c 目标的受控只读连接上运行生成任务,确认不再新增这条元数据查询错误,生成器正常结束。随后对比表、列、默认值、索引和约束的生成结果,再编译依赖它们的代码。
只看到输出目录存在不能证明本次生成成功,它可能仍是上一次留下的源码。保留生成日志、版本和输出差异;若出现大批非预期删除或默认值变化,先停止合入,而不是把差异当成补丁升级必然产生的清理。


