迁移手册 · 精确目标 postgresql:16 · 更新于 2026-08-21

Oracle → PostgreSQL 16迁移手册

十章工程目录收录 945 个 Oracle 迁移候选;109 个 verified / doc_based 场景有明确目标结论,437 个 draft 声明仅进入待核验口径,399 个未知项不进行产品家族外推。

945迁移候选
109权威明确结论
437待核验声明
108权威 partial / none
0已登记工件锚点
0版本观察

十章工程目录

1. 类型与值域

40 个候选 · 14 个权威明确 · 24 个待核验

full 0partial 7none 7unknown 1

2. DDL 与数据库对象

183 个候选 · 25 个权威明确 · 18 个待核验

full 0partial 2none 23unknown 135

3. 查询与结果语义

107 个候选 · 13 个权威明确 · 14 个待核验

full 0partial 2none 11unknown 77

4. DML 与数据写入

14 个候选 · 6 个权威明确 · 3 个待核验

full 0partial 2none 4unknown 4

10. 驱动与应用层

5 个候选 · 0 个权威明确 · 5 个待核验

full 0partial 0none 0unknown 0

当前预览没有可链接的权威明确场景;完整构建保留本章事实统计。

优先核对的高风险场景

只收录 authoritative、精确矩阵已声明且 support 为 partial / none 的条目;不把 draft 放入推荐。

CONNECT BY 层次查询

none · doc_based · 目标不保留原生层次句时改 WITH RECURSIVE,并先保留 Oracle 执行序:FROM/WHERE 中的 join 先形成候选关系,START WITH 与 CONNECT BY/PRIOR 再展开层次,剩余 WHERE 最后逐行过滤,不能提前裁掉不满足 WHERE 的父行及其仍应返回的子孙。锚点/递归成员生成 depth/path/visited,visited 必须使用稳定行身份与路径实例,不能用可重复业务键。NOCYCLE 在下一子行已是祖先时停止该边;CONNECT_BY_ISCYCLE 标记“当前行存在一个祖先子行”,不是标记或输出重复子行

LEVEL 层次伪列

none · doc_based · 树深度在递归 CTE 锚点置 depth=1、递归成员置 depth+1;纯行生成须区分根行契约:无 START WITH 且无其他根过滤时,Oracle 在 n<=0/NULL 仍保留 1 个根行,改为无条件产生 1 的递归 CTE 锚点、仅在下一层满足 LEVEL<=n 时递归,或给 generate_series 显式补该分支;有 START WITH/根过滤时才允许根行被过滤为零行

DECODE 函数

none · doc_based · 先用目标保证的物化屏障/临时结果/过程变量求 expr 一次,普通 CTE 不保证;按首个 search(数值首对按 Oracle 数值优先级)统一比较类型,再改有序 searched CASE/双 NULL,并把 result/default 转成首结果有效类型

INTERVAL 自动分区

none · doc_based · 目标原生 INTERVAL 时逐项保留表达式、最高显式 RANGE 分区上界定义的过渡点和子分区模板;否则移除自动扩展,按该过渡点至业务 horizon 预建等价 RANGE 分区,并部署幂等滚动作业在写入前继续预建,同时替换依赖自动分区名的运维 SQL

MERGE INTO 目标为内联视图

none · doc_based · 将目标改键保留基表,按投影别名回写列;只把目标视图过滤条件并入 ON 以复刻可见目标行集,原 action 条件仍留原 WHEN;原视图有 WITH CHECK OPTION 时在 action/目标约束复刻写后可见性并保持失败,无该子句时不额外限制;join/聚合/不可更新或 INSTEAD OF 视图先按源端失败/触发器契约处理

(+) 传统外连接标记

none · doc_based · a.id = b.id(+) 保留 a,改 a LEFT JOIN b ON (...);marker 在左侧时按保留侧改 RIGHT JOIN 或交换表序后改 LEFT JOIN。同一可空表的全部 (+) 谓词(含 b.flag(+) = 常量)必须整体移入 ON, 留在 WHERE 会消掉 NULL 扩展行。含 OR/IN、同一表混合左右 marker、跨多表 marker 不一致或 NEW/OLD 伪表时只给人工方案,不自动重排连接图。

既有改造点明细

保留原有实质详情 canonical,下面是当前页前 80 个改造点入口;迁移手册不复制问题详情。

ADD_MONTHS 函数none · minor · ora.func.add_monthsALTER SESSION SET 会话参数none · minor · ora.syntax.alter_sessionANYDATA 动态类型列none · critical · ora.type.anydataASCIISTR Unicode 转义函数none · major · ora.func.asciistr关联数组(INDEX BY 表)none · major · ora.plsql.associative_arrayAT TIME ZONE 时区表达式partial · major · ora.func.at_time_zoneAUTHID 执行者/定义者权限模式partial · critical · ora.plsql.authid自治事务(PRAGMA AUTONOMOUS_TRANSACTION)none · blocker · ora.plsql.autonomous_txn触发器内自治事务undeclared · blocker · ora.trigger.autonomous_transaction视图 BEQUEATH 子句none · minor · ora.ddl.bequeathBFILE 外部文件类型none · critical · ora.type.bfileBFILENAME 外部文件定位函数none · critical · ora.func.bfilenameBIN_TO_NUM 位序列转数值partial · major · ora.func.bin_to_numBINARY_DOUBLE 类型none · minor · ora.type.binary_doubleBINARY_FLOAT 类型none · minor · ora.type.binary_floatOracle 二进制浮点特殊字面量partial · critical · ora.literal.binary_float_specialBITAND 函数none · minor · ora.func.bitandBITMAP 位图索引none · major · ora.index.bitmapBULK COLLECT 批量取数none · major · ora.plsql.bulk_collectLENGTHB / SUBSTRB / INSTRB 字节语义函数none · major · ora.func.byte_semanticsCDB/多租户与排序规则 DDL 子句(SHARING / DEFAULT COLLATION / CONTAINER_MAP)none · minor · ora.ddl.container_clausesCHAR 定长补空格类型partial · minor · ora.type.char_paddingCHR(0) NUL 字符语义差异undeclared · major · ora.func.chr_zeroOracle 聚簇表与 CLUSTER 子句none · major · ora.object.cluster_tableOracle 集合 CARDINALITYpartial · major · ora.func.cardinalitySQL 层集合运算函数none · major · ora.func.collection_sql列 DEFAULT 使用序列伪列none · major · ora.column.default_sequence存储过程内 COMMIT/ROLLBACKpartial · major · ora.plsql.commit_in_proc复合 UNIQUE 的部分 NULL 唯一性语义undeclared · blocker · ora.constraint.composite_unique_null字符串拼接 || 的 NULL 语义partial · minor · ora.behavior.concat_nullCONNECT BY 层次查询none · major · ora.syntax.connect_byCONNECT BY 操作数含函数undeclared · critical · ora.syntax.connect_by_function_operandLEVEL 层次伪列none · major · ora.syntax.level_pseudocolumnCONNECT_BY_ROOT 层次操作符none · major · ora.syntax.connect_by_root约束 DISABLE 状态partial · major · ora.ddl.constraint_disableCREATE INDEX ... NOLOGGINGundeclared · major · ora.ddl.create_index_nologging游标属性(%FOUND/%NOTFOUND/%ISOPEN/%ROWCOUNT)none · major · ora.plsql.cursor_attributesSQL%BULK_ROWCOUNT 逐项批量 DML 计数none · critical · ora.cursor.sql_bulk_rowcount游标 FOR 循环partial · minor · ora.plsql.cursor_for_loop日期直接加减数字(天数运算)none · major · ora.behavior.date_arithmeticDATE 映射 TIMESTAMP 后日期差聚合类型变化none · critical · ora.dm.timestamp_delta_aggregateDATE 类型含时间部分的语义none · major · ora.type.date_semanticsDBLINK 引用(obj@link)partial · major · ora.object.dblink_ref过程体内 DBLINK 引用(obj@link)partial · critical · ora.plsql.dblink_in_bodyDBMS_RANDOM 随机数调用(过程体内)none · minor · ora.pkg.dbms_randomDBMS_RANDOM 包调用none · minor · ora.func.dbms_randomDBMS_JOB 定时作业调用(过程体内)none · major · ora.pkg.dbms_jobDBMS_SCHEDULER 调度器调用(过程体内)none · major · ora.pkg.dbms_schedulerDBMS_SCHEDULER / DBMS_JOB 调度作业none · major · ora.plsql.dbms_schedulerDBTIMEZONE 数据库时区函数partial · major · ora.func.dbtimezoneDECODE 函数none · major · ora.func.decodeDEFAULT ON NULL 列默认值none · minor · ora.column.default_on_nullDETERMINISTIC 函数标记none · minor · ora.plsql.deterministicDROP USER ... CASCADE 级联删除undeclared · critical · ora.ddl.drop_user_cascadeDUAL 虚表none · minor · ora.syntax.dualDUMP 内部表示诊断函数none · major · ora.func.dump动态 SQL(EXECUTE IMMEDIATE)partial · major · ora.plsql.dynamic_sqlOPEN FOR 直接使用 SQL 字符串表达式partial · critical · ora.cursor.open_expressionEDITIONABLE / NONEDITIONABLE 关键字none · minor · ora.ddl.editionableEMPTY_CLOB / EMPTY_BLOB 函数none · minor · ora.func.empty_lob与空串字面量的等值/不等比较('' 即 NULL 语义)none · critical · ora.behavior.empty_string_compareEXCEPTION 异常处理块partial · minor · ora.plsql.exception_block显式游标声明(CURSOR ... IS)partial · minor · ora.plsql.cursor_explicitJava/C 外部语言存储例程none · critical · ora.plsql.external_routine外部表(ORGANIZATION EXTERNAL)partial · critical · ora.object.external_tableFIRST_VALUE IGNORE NULLSnone · major · ora.func.first_value_ignore_nullsFLASHBACK 查询(AS OF SCN/TIMESTAMP、VERSIONS BETWEEN)none · major · ora.syntax.flashback_querySELECT ... FOR UPDATE OF 列级锁定写法partial · minor · ora.syntax.for_update_of外连接查询 FOR UPDATEundeclared · critical · ora.syntax.for_update_outer_joinFOR UPDATE WAIT n 超时等待子句none · minor · ora.syntax.for_update_waitFORALL 批量 DMLnone · major · ora.plsql.forallCREATE FORCE VIEWnone · minor · ora.ddl.view_forceFROM_TZ 时区附加函数partial · major · ora.func.from_tzOracle Text 全文索引与 CTX 包none · critical · ora.index.fulltext_contextPL/SQL 代码中的全角标点none · major · ora.plsql.fullwidth_punctuation索引表达式中的 TO_DATE/TO_CHARundeclared · critical · ora.index.nonimmutable_conversionMDSYS / SDO 空间类型与包none · critical · ora.func.gis_sdo全局临时表(GLOBAL TEMPORARY TABLE)none · major · ora.object.gttGOTO 语句none · major · ora.plsql.gotoGREATEST / LEAST 函数(NULL 传播差异)partial · major · ora.func.greatest_least

上线前验证清单