兼容性判定
公开资料依据 · 建议 PoC 复核支持度partial
严重度major
置信度low
依据规则ora.plsql.harvest_exception_map.collection_is_null
怎么改
CURSOR_ALREADY_OPEN->duplicate_cursor/42P03; INVALID_CURSOR->invalid_cursor_state/24000; DUP_VAL_ON_INDEX->unique_violation/23505; TIMEOUT_ON_RESOURCE->lock_not_available/55P03; ZERO_DIVIDE->division_by_zero/22012; STORAGE_ERROR->out_of_memory/53200; INTEGRITY_ERROR->integrity_constraint_violation/23000; VALUE_ERROR、INVALID_NUMBER->data_exception/22000; NO_DATA_FOUND->no_data_found/P0002; LOGIN_DENIED->connection_exception/08000; TOO_MANY_ROWS->too_many_rows/P0003; NOT_LOGGED_ON->insufficient_privilege/42501; PROGRAM_ERROR->internal_error/XX000; ACCESS_INTO_NULL、COLLECTION_IS_NULL->object_not_in_prerequisite_state/55000; INVALID_USERENV_PARAMETER->invalid_parameter_value/22023
判定说明
17 项映射来自 Ora2Pg facts 并按 PostgreSQL 16 官方 SQLSTATE 表复核;名称相近不代表触发时机和回滚范围完全一致,建议 PoC 复核每个分支
库侧 / 应用侧路径
库侧改造
可行:将 Oracle 预定义异常 COLLECTION_IS_NULL 改为 PL/pgSQL condition object_not_in_prerequisite_state 或 SQLSTATE '55000',局部同名异常须单独处理
应用侧改造
可行:同步修改驱动和日志中依赖 ORA 错误码的分支,使其按 SQLSTATE 处理
推荐路线:db_side。验证建议:建议 PoC 复核 COLLECTION_IS_NULL 的真实错误是否进入 object_not_in_prerequisite_state/55000 handler,并比对事务回滚和应用错误分支
规则样例
BEGIN NULL; EXCEPTION WHEN COLLECTION_IS_NULL THEN NULL; END;
BEGIN NULL; EXCEPTION WHEN NO_DATA_FOUND OR VALUE_ERROR OR COLLECTION_IS_NULL THEN NULL; END;
BEGIN NULL; EXCEPTION WHEN COLLECTION_IS_NULL OR NO_DATA_FOUND OR VALUE_ERROR THEN NULL; END;
参考来源
- https://github.com/darold/ora2pg/blob/97015451a4d1cfbee888f2e6efe7ff68c239a9b5/lib/Ora2Pg/PLSQL.pm#L835-L1076
- https://www.postgresql.org/docs/16/errcodes-appendix.html
- https://www.postgresql.org/docs/16/datatype.html
- https://www.postgresql.org/docs/16/functions.html
- https://www.postgresql.org/docs/16/sql-commands.html
- source:ora2pg-facts.md:323 (Ora2Pg EXCEPTION_MAP facts; rewritten)
相关改造点
- ORACLE → postgresql 16 全部改造点
- postgresql 16 兼容性总览
- ORACLE 迁移国产库总览
- ORACLE ADD_MONTHS 函数 迁移 postgresql 16 怎么改
- ORACLE ALTER SESSION SET 会话参数 迁移 postgresql 16 怎么改
- ORACLE ANYDATA 动态类型列 迁移 postgresql 16 怎么改
- ORACLE ASCIISTR Unicode 转义函数 迁移 postgresql 16 怎么改
- ORACLE 关联数组(INDEX BY 表) 迁移 postgresql 16 怎么改
- ORACLE AT TIME ZONE 时区表达式 迁移 postgresql 16 怎么改