转化问题和模式参考

转换工作区会将所有转换问题汇总到各个组和类别中,以帮助您规划如何修正转换错误和警告。每个类别都表示您可能需要执行的工作类型,以解决相应问题(检查、重构、调整数据类型)。组可提供进一步的汇总,因为它们可在较低级别区分具体情况:

显示转化问题组和类别的转化工作区概览界面。
图 1. 显示转化问题组和类别的转化工作区概览界面。
显示转化问题组和类别的转化工作区概览界面。

下表列出了您在架构转换期间可能会遇到的所有转换问题组:

问题组 ID 说明

源代码无效

可能的根本原因

当 Database Migration Service 遇到未知语法或 Oracle 源代码无效时(例如,存储过程缺少 END; 关键字),通常会发生此组中的错误。

可能的缓解措施

更正源 Oracle 数据库中的无效对象。然后,在 Database Migration Service 中刷新源架构快照,并重试架构转换流程。或者,您也可以从迁移中排除该对象。

缺少引用的对象

可能的根本原因

Database Migration Service 会使用源树中对象的元数据来提高相关对象的代码转换质量。如果您的代码引用了未包含在源架构中的对象,您可能会遇到转换问题,因为 Database Migration Service 无法确定缺少的被引用列、属性或对象的结构或数据类型。

此组中的可能错误包括用户定义类型 (UDT) 或列、形参或变量的默认 VARCHAR 数据类型不正确。

可能的缓解措施

确保所有被引用的对象都已添加到 Database Migration Service 源树中,或者根据您对源数据模型的了解,手动调整 PostgreSQL 代码以解决缺失的依赖项。

没有主键的表

可能的根本原因

Database Migration Service 要求所有表都必须拥有主键。对于没有主键的表,Database Migration Service 会向目标 PostgreSQL 表添加一个名为 rowidNUMERIC 列。 此列填充了源 Oracle ROWID 伪列中的相应数值。为确保 INSERT 语句在迁移后不会失败,Database Migration Service 会创建一个序列,并使用该序列自动递增 rowid 列。

可能的缓解措施

迁移后,您可以保留或移除 rowid 列。

不支持的 Oracle 内置功能

可能的根本原因

您可能正在使用不受支持的内置 Oracle 功能。

可能的缓解措施

在 PostgreSQL 中找到类似的功能,并相应地修改转换后的代码。在某些情况下, Orafce 扩展程序(适用于 Cloud SQL for PostgreSQL 和 AlloyDB for PostgreSQL 迁移)可以提供缺失的功能。

目前还不支持SQLCODE

可能的根本原因

不支持转换 Oracle SQLCODE 函数。SQLCODE 返回 INTEGER,而 PostgreSQL 中最接近的等效函数是 SQLSTATE 函数,该函数返回 TEXT 值。

可能的缓解措施

如果您的源代码不依赖于 SQLCODE 返回整数(例如,SQLCODE 仅记录在 VARCHAR2 列中或使用 DBMS_OUTPUT 消息),则可以在 PostgreSQL 代码中安全地使用 SQLSTATE

如果您的源代码依赖于 SQLCODE 返回整数(例如,您将其与 NUMBERINTEGER 变量搭配使用,或者将 SQLCODE 返回值保存为参数或列),则需要重构转换后的代码。

尚不支持 Oracle SQL 函数

可能的根本原因

Database Migration Service 不支持转换某些 Oracle 内置函数。

某些函数可能在 PostgreSQL 中有对应的函数(例如 ASCII),而另一些函数可能具有相同的名称,但规范不同(例如 REGEXP% 函数)。 有些函数可能根本不存在。

可能的缓解措施

检查哪个 Oracle 函数引发了错误。

  • 如果 PostgreSQL 中存在具有相同行为的函数,您可以忽略该错误消息,因为转换后的代码在迁移后应能正常运行。
  • 如果某个函数名称相同,但在 PostgreSQL 中的运作方式不同或根本不存在,您可以尝试修复转换后的代码:

Oracle 内置软件包尚未获得全面支持

可能的根本原因

Database Migration Service 支持某些 Oracle 内置软件包,但许多软件包不提供完整的转换支持,例如 DBMS_STATSDBMS_UTILITYDBMS_SQL

可能的缓解措施

如果您使用任何不受支持的软件包,可能需要执行以下操作:

  • 更改救援码。例如,您可以使用更简单的命令(例如 ANALYZE)来代替 DBMS_STATS.GATHER_TABLE_STATS

    UTL_FILEDBMS_AQ 等软件包可能需要重构,因为它们无法在 PostgreSQL 中轻松复制。

  • 某些 Oracle 数据库函数或功能可以通过扩展程序(例如 Orafce)进行复制。如需详细了解目标数据库中支持的扩展程序,请参阅 支持的数据库扩展程序

尚不支持转换的 Oracle 数据类型

可能的根本原因

目前,某些 Oracle 数据类型不支持转换或数据迁移。

可能的缓解措施

在大多数情况下,PostgreSQL 都有等效的数据类型。您可以 使用转换映射文件自定义转换逻辑,并将不受支持的 Oracle 数据类型转换为所需的 PostgreSQL 数据类型。

如需详细了解数据类型支持,请参阅 转换工作区 - 概览和支持的对象

尚不支持的来源功能

可能的根本原因

此群组捕获与不支持转换的 Oracle 功能相关的所有一般性问题。此组中的问题不属于任何其他更具体的问题组。

可能的缓解措施

架构对象类型不受支持

可能的根本原因

Database Migration Service 不支持某些 Oracle 架构对象类型进行代码转换,因为 PostgreSQL 没有相应的等效项。 例如,索引组织表 (IOT)、文本搜索索引或用户定义类型 (UDT) 的正文。

可能的缓解措施

Database Migration Service 会将不支持的对象转换为最接近的 PostgreSQL 等效对象。例如,IOT 会变成具有主键约束的常规表,文本搜索索引会转换为 B 树索引。请注意,这些转换可能会导致原始对象类型特有的功能丢失。

尚不支持 PL/SQL 功能

潜在的根本原因

此组捕获与不支持转换的 PL/SQL 功能相关的所有一般性问题。此组中的问题不属于任何其他更具体的问题组。

可能的缓解措施

尚不支持批量绑定

可能的根本原因

Database Migration Service 代码转换目前不支持 Oracle 批量绑定功能,例如 BULK COLLECTFORALLSAVE EXCEPTIONS

可能的缓解措施

如需解决此问题,您需要修改使用批量绑定功能的代码。 您可能需要考虑 PostgreSQL 和 Oracle 架构的差异,以及您的使用情形是否需要在 PostgreSQL 中进行数组处理。

在 PostgreSQL 中,有多种策略可用于处理 Oracle 批量绑定操作。这些功能的使用取决于您的具体情况,因此我们建议您使用 由 Gemini 提供支持的转化辅助功能来满足您的特定需求。以下是一些其他建议示例,可帮助您快速入门:

  • 对于完整的 BULK COLLECT(无 LIMIT),您可以尝试使用 ARRAY_AGG 函数。
  • 对于 BULK COLLECTLIMIT,您可以尝试使用 CURSOR FOR LOOP 加载和处理数组中的批量行。但是,如果您的使用情形允许进行功能性更改,则可能更简单的替代方案是使用 CURSOR FOR LOOP 一次处理一行(而不是将它们加载到数组中)。
  • 对于 FORALL 操作,如果您选择使用数组处理,可以尝试使用 UNNEST 进行基于集合的 DML 操作。
  • 对于 SAVE EXCEPTIONS,您可能需要在基于行的 CURSOR FOR LOOP 中编写异常处理程序,因为 PostgreSQL 中没有等效的子句。

尚不支持集合

可能的根本原因

Database Migration Service 代码转换对 Oracle 集合提供部分支持。

可能的缓解措施

您需要相应地修改转换后的 PostgreSQL 代码。在解决集合问题时,请注意 PostgreSQL 数组永远不会是稀疏数组。如果您稀疏地分配元素,PostgreSQL 数组可能会返回与 Oracle 数组不同的结果和基数计数。

由于 PostgreSQL 不支持字符串索引的数组,因此根据数据的性质,您可能会发现 JSON/JSONBhstore 扩展程序比较适合。

尚不支持流水线函数

可能的根本原因

Database Migration Service 不支持流水线函数。

可能的缓解措施

您可以将 Oracle 管道函数替换为 PostgreSQL 集返回函数。我们建议您根据自己的使用情形调整代码。以下是一些示例,可帮助您开始使用:

  1. 引用从源 Oracle 对象或记录类型转换而来的 PostgreSQL 类型 (UDT),该类型定义了流水线函数的 rowtype。然后,根据您的具体情况,将 PostgreSQL 函数的返回子句修改为 RETURNS SETOF <type name>RETURNS TABLE

  2. 将转换后的 PIPE ROW 代码中的返回值替换为 RETURN NEXT <row or record variable>

Oracle 函数的 RETURN 子句中使用的源流水线函数的集合类型在 PostgreSQL 中是不需要的。

尚不支持的动态 SQL 选项

可能的根本原因

Database Migration Service 可部分支持转换动态 SQL。 Oracle EXECUTE IMMEDIATEOPEN FORUSING/INTO 关键字会正确转换为相应的 PostgreSQL 关键字,但实际的动态 SQL、DML 或 DDL 字符串不会转换。

可能的缓解措施

您需要修改转换后的代码,以满足您的要求。 我们强烈建议您使用 Gemini 赋能的转化辅助工具来处理动态 SQL。

尚不支持 CONNECT BY 选项

可能的根本原因

Database Migration Service 支持大多数 CONNECT BY 运算符、函数和伪列,并将其转换为 PostgreSQL 递归公共表表达式 (CTE)。不过,也有一些例外情况可能需要您注意。例如,ORDER SIBLINGS BY 子句仅支持升序。

可能的缓解措施

无法以简单的方式复制降序的 ORDER SIBLINGS BY 子句,因此您可能需要重构代码以使用升序。

查看有关 CONNECT BY 运算符的报告问题,并根据需要调整代码。我们建议您探索 Gemini 赋能的自动转换功能,以加快此类修复。如需了解详情,请参阅 在 Gemini 的协助下转换 Oracle 代码和架构

尚不支持 JSON

可能的根本原因

Database Migration Service 在支持 JSON 进行数据迁移和代码转换方面存在一些限制:

  • 数据迁移不支持 JSONB
  • 代码转换不支持 Oracle 中的 JSON 查询函数或运算符(例如 JSON_TABLEJSON_QUERYJSON_OBJECT[AGG]JSON_ARRAYAGGJSON_PATCH)。
  • 在低于 21c 的 Oracle 版本中,您可以将 JSON 数据存储在 VARCHAR2CLOBBLOB 列中,并使用 IS JSON 条件进行验证。Database Migration Service 不支持转换此条件。
可能的缓解措施
  • 如需将存储在 VARCHAR2CLOBBLOB 列中的 JSON 数据迁移到 PostgreSQL,您可能需要使用 MODIFY_TYPE 指令编写转换映射文件。

    例如:

    MODIFY_TYPE SOURCE_TABLE_NAME:BLOB_COLUMN_NAME_WITH_JSON_DATA:JSON

    如需详细了解转化映射文件,请参阅 转化映射文件

  • 如需将 Oracle JSON 函数和运算符转换为 PostgreSQL,您可以使用 JSONB_ARRAY_ELEMENTSJSON_AGG 等 PostgreSQL 函数。 如需了解详情,请参阅 PostgreSQL 文档中的 JSON 函数和运算符

锁定和事务问题

可能的根本原因

Database Migration Service 代码转换不支持 LOCKSAVEPOINT 语句。PostgreSQL 不支持 SAVEPOINT

可能的缓解措施
  • 在 Oracle 中中断 SAVEPOINT 块,以在 PostgreSQL 中分离利用 ROLLBACK 语句的事务块。
  • 如需实现 DBMS_LOCK,请使用 PostgreSQL pg_dbms_lock 扩展程序。此扩展程序通过模拟 Oracle DBMS_LOCK 软件包的功能,简化了将 Oracle 用户定义的锁迁移到 PostgreSQL 的过程。

尚不支持 XML

可能的根本原因

Database Migration Service 不支持 Oracle XMLTYPE 或相关的 XML 函数和运算符。

可能的缓解措施

虽然 Database Migration Service 不直接支持 XMLTYPE,但您可以自定义 BLOBCLOBNVARCHAR2VARCHAR2 列到 XML,以实现数据迁移。PostgreSQL 支持 XML 功能。

如需迁移 XML 数据,请按以下步骤操作:

  1. 使用 MODIFY_TYPE 指令为 XML 数据创建转化映射文件。例如:

    MODIFY_TYPE SOURCE_TABLE_NAME:BLOB_COLUMN_NAME_WITH_XML_DATA:XML

    如需详细了解转化映射文件,请参阅 转化映射文件

  2. 启动迁移作业。此流程会将所有数据从 Oracle 迁移到 PostgreSQL,但类型为 XMLTYPE 的列中的数据除外。这些列在 PostgreSQL 中填充了 NULL 值。t
  3. 通过仅从 Oracle 中选择 XMLTYPE 列,在 PostgreSQL 中创建外部表。包含源表中的主键列。
  4. 将外部表中的 XML 数据合并到原始 PostgreSQL 表中。

如需详细了解 PostgreSQL 如何与 XMLTYPE 搭配使用,请参阅 PostgreSQL 文档中的 XML 函数

目前还不支持PIVOT

可能的根本原因

Database Migration Service 不支持用于代码转换的 PIVOTUNPIVOT 转置运算符。

可能的缓解措施

您可以使用 tablefunc 扩展程序或将源 PIVOT 表达式重写为条件聚合,在 PostgreSQL 中实现 PIVOT 转置。例如:

  • SUM(CASE WHEN <condition> THEN <value> ELSE 0 END)
  • COUNT(CASE WHEN <condition> THEN 1 END)

您可以通过多种方式在 PostgreSQL 中创建 UNPIVOT 转置,从而从一组列中创建键值对:

  • LATERAL 连接与一组 VALUES 相结合。例如: SELECT ... FROM <table> CROSS JOIN LATERAL (VALUES ('<column1-name>', <column1>), ('<column2-name>', <column2>) AS u(column_name, column_value))
  • UNNESTARRAY 搭配使用。例如: SELECT ..., UNNEST(ARRAY['<column1-name>', '<column2-name>']) AS column_name, UNNEST(ARRAY[column1, column2]) AS column_value FROM <table>

尚不支持 ALTER 语句选项

可能的根本原因

Database Migration Service 不会转换 ALTER 语句(通常在动态 SQL 中执行)。

可能的缓解措施

将 Oracle ALTER 语句替换为 PostgreSQL 中的 SET 命令。我们建议您探索 Gemini 赋能的自动转换功能,以加快此类修复。如需了解详情,请参阅 在 Gemini 的协助下转换 Oracle 代码和架构

尚不支持的 SQL 功能

潜在的根本原因

此组捕获与不支持转换的 SQL 功能相关的所有一般性问题。此群组中的问题不属于任何其他更具体的问题群组。示例包括数据库事件触发器、GRANT 语句、多表 INSERT 操作、对内联视图 (INSERT INTO (SELECT ... FROM ...)) 的 DML、横向视图。

可能的缓解措施

不受支持的语法

潜在的根本原因

此组捕获与不受支持的 Oracle SQL 或 PL/SQL 语法相关的所有一般性问题。此组中的问题不属于任何其他更具体的问题组。

可能的缓解措施

将代码更改为使用在功能上等效的 PostgreSQL 语法。建议您探索由 Gemini 提供支持的自动转换功能,以调整代码。 如需了解详情,请参阅 在 Gemini 的协助下转换 Oracle 代码和架构

不受支持的 SQL 语法

可能的根本原因

您的源代码使用了 Database Migration Service 不支持的 SQL 语法或元素。例如,不支持 Oracle TO_DATE 函数中的 NLS_LANG 参数。

可能的缓解措施
不受支持的 PL/SQL 语法

可能的根本原因

您的源代码使用了 Database Migration Service 不支持的 PL/SQL 语法或元素。例如,基于记录的 INSERT 语句(例如 INSERT INTO table VALUES r_variable)和 PRAGMA RESTRICT_REFERENCES 不受支持。

可能的缓解措施

将代码更改为使用在功能上等效的 PostgreSQL 语法。建议您探索由 Gemini 提供支持的自动转换功能,以调整代码。 如需了解详情,请参阅 在 Gemini 的协助下转换 Oracle 代码和架构

不受支持的日期和时间戳语法

可能的根本原因

Database Migration Service 可能会针对不受支持的日期或时间戳语法、操作或表达式引发错误或警告。此类问题的示例包括不匹配的数据类型之间的比较,或在时间戳中使用 TZH:TZM 格式模型。如需详细了解支持的对象和数据类型,请参阅 转换工作区简介

可能的缓解措施

您可以使用 PostgreSQL 等效函数重新创建大多数日期和时间戳表达式。 我们建议您探索 Gemini 赋能的自动转换功能,以加快此类修复。如需了解详情,请参阅 在 Gemini 的协助下转换 Oracle 代码和架构

Oracle 异常处理语法中不受支持的元素

可能的根本原因

Database Migration Service 代码转换不支持以下 Oracle PL/SQL 异常语法元素:

  • 使用 RAISE_APPLICATION_ERROR 和可变错误代码,而不是字面量 -20nnn 代码。
  • 使用 SQLERRM 并提供错误代码实参,因为 PostgreSQL 不支持此语法。
可能的缓解措施

您必须在转换后的代码中手动解决这些问题。 我们建议您探索 Gemini 赋能的自动转换功能,以加快此类修复。如需了解详情,请参阅 在 Gemini 的协助下转换 Oracle 代码和架构

数据类型和转换问题

可能的根本原因

Database Migration Service 可以根据上下文对转换问题进行分组(例如, 类型比较表达式中出现的转换问题)。 CW_OP0500 组捕获不属于其他问题组的所有一般性数据类型转换问题。

可能的缓解措施

在大多数情况下,Database Migration Service 会在转换后的 PostgreSQL 代码中发出 ERROR_UNIMPLEMENTEDERROR_TYPE 消息。根据您对所涉及数据类型的了解来解决此错误。

日期格式掩码问题

可能的根本原因

根据格式模型将日期或时间戳表达式转换为字符串或从字符串转换为日期或时间戳表达式时,您可能会遇到警告或问题。如果 Oracle 源代码中的转换不包含明确的日期或时间戳格式模型,Database Migration Service 会使用默认模型(目前为 DD-MON-RR)。

如果为隐式转换发出的格式模型与同一表达式中的显式格式模型发生冲突,有时可能会导致转换后的代码出现问题。如果您的数据很可能会受到 Oracle RR 格式 PostgreSQL YY 格式之间差异的影响,您也可能会看到此问题。

可能的缓解措施

在转换工作区中查看并验证转换后的 PostgreSQL 表达式。

数字格式掩码问题

可能的根本原因

Database Migration Service 不支持所有 Oracle 格式模型。 例如,不支持 'L''X'。 您可能会遇到基于 Oracle 格式模型将字符串转换为数字的代码出现问题或警告的情况。

可能的缓解措施

对于 PostgreSQL 中没有等效项的 Oracle 格式模型,您可能需要重构表达式或格式模型。 我们建议您探索 Gemini 赋能的自动转换功能,以加快此类修复。如需了解详情,请参阅 在 Gemini 的协助下转换 Oracle 代码和架构

数据类型转换问题

可能的根本原因

由于不支持或不准确的数据类型转换,您可能会遇到错误。Database Migration Service 通常会发出 ERROR_UNIMPLEMENTED。 这通常是因为元数据缺失或不完整。 Database Migration Service 可能没有足够的信息来转换类型,例如在函数实参或过程形参中。

可能的缓解措施

调整 PostgreSQL 代码,确保正确转换数据类型。 这些更正要求您熟悉所引用的属性、变量和列。

比较问题

可能的根本原因

在转换数据比较表达式时,Database Migration Service 可能没有足够的元数据或有关数据类型的信息。例如,当用户定义的类型 (UDT) 与 NULL 进行比较时,可能会发生这种情况。

可能的缓解措施

查看转换后的 PostgreSQL 表达式并解决问题。 我们建议您探索 Gemini 赋能的自动转换功能,以加快此类修复。如需了解详情,请参阅 在 Gemini 的协助下转换 Oracle 代码和架构

此类问题是指 Oracle 源代码已正确转换为最接近的 PostgreSQL 等效代码,但生成的代码可能存在细微的语义或功能差异,需要您进行审核。这是因为 Oracle 和 PostgreSQL 在处理数据类型、格式或对象方面存在差异。

乍一看,此类别似乎与 数据类型和转换 (CW_05) 类别中的问题重叠,但请注意,它们代表的是不同的问题。 CW_05 包含已知问题,即 Database Migration Service 无法将 Oracle 代码转换为相应的 PostgreSQL 代码。

查看日期格式掩码

可能的根本原因

大多数 Oracle 日期和时间戳格式模型在 PostgreSQL 中都有相应的等效项,因此转换后的代码在语义或功能上没有区别。 有些模型没有完全匹配的项,其行为各不相同。 例如, Oracle RR 格式会转换为 PostgreSQL YY 格式

可能的缓解措施

查看并验证包含格式模型转换的表达式,确保转换后的代码按预期运行。

查看数字格式掩码

可能的根本原因

大多数源数值格式模型在 PostgreSQL 中都有等效项,因此转换后的代码在语义或功能上没有差异。 不过,某些格式模型可能没有完全匹配的格式,或者行为略有不同。

可能的缓解措施

查看并验证包含格式模型转换的表达式,确保转换后的代码能按预期运行。

查看异常代码

可能的根本原因

当您使用错误代码范围为 -20000-20999 RAISE_APPLICATION_ERROR 时,Database Migration Service 会将其转换为 PostgreSQL RAISE EXCEPTION,其中 SQLSTATE 的范围为 CW0000CW999。 转换会保留源错误代码的最后 3 位数字,并在其前面添加 CW 前缀。

可能的缓解措施

请检查此行为,确定是否适合您的需求。 仅当源错误代码对您的应用、支持团队或文档有意义时,才需要进行此审核。如果错误代码值本身没有意义,您可以忽略此警告。

查看异常消息

可能的根本原因

SQLERRM 函数同时存在于 Oracle PL/SQL 和 PostgreSQL 中,但它在每个引擎中可能会返回不同的错误文本。例如,在 Oracle 中除以零会返回错误文本 ORA-01476: divisor is equal to zero,但在 PostgreSQL 中会返回 ERROR: division by zero

可能的缓解措施

如果您的应用、支持基础架构或文档依赖于错误文本,请检查转换。否则,您可以忽略此差异。

查看 Oracle 内置函数的模拟情况

可能的根本原因

Database Migration Service 代码和架构转换旨在提供与 PostgreSQL 等效的 Oracle 函数行为,但结果可能并不总是能满足您的需求。 因此,转换工作区始终会针对可能需要您审核的函数转换提供建议性警告。

可能的缓解措施

建议您查看转化工作区在 CW_OP0605 问题组中发出警告的对象。

查看外键列数据类型

可能的根本原因

Database Migration Service 在父对象和子对象之间发现了不匹配的数据类型规范(例如,当父列为 NUMBER(4) 而子列为 NUMBER(10) 时)。

可能的缓解措施

在大多数情况下,轻微的数据类型不匹配不会导致数据库功能出现问题。不过,我们建议您检查转换后的数据模型是否存在不一致之处。

建议审核功能性
可能的根本原因

此组捕获与 Oracle 和 PostgreSQL 代码中潜在的功能差异相关的所有一般性问题。此组中的问题不属于任何其他更具体的问题组。

可能的缓解措施

查看 Oracle 内置函数的模拟情况

可能的根本原因

许多 Oracle 内置函数在 PostgreSQL 中没有直接的对等函数。 为了帮助缓解迁移过程中的这一问题,Database Migration Service 会使用不同的 SQL 表达式转换您的代码,以便在 PostgreSQL 中产生等效的功能行为。

在某些情况下,转换后的表达式可能很复杂。 Database Migration Service 会在 CW_OP0702 组中发出警告,以突出显示可能存在的问题,并建议使用表达式来模拟函数。

可能的缓解措施

检查转换后的代码,确保转换后的函数在 PostgreSQL 环境中按预期运行。

需要重构自治事务

可能的根本原因

PostgreSQL 不支持 自主事务

可能的缓解措施

您可以使用 dblink pg_background PL/Proxy 扩展程序在 PostgreSQL 中实现自主事务。使用上述任一扩展程序进行的数据库调用会在不同的会话中执行,因此会生成自主事务。

需要重构数据库链接

可能的根本原因

Database Migration Service 不支持 Oracle 数据库链接。使用链接的对象需要重构。

可能的缓解措施

您可以根据数据库链接的目标,通过数据库扩展程序(例如 dblink postgres_fdw oracle_fdw PL/Proxy)在 PostgreSQL 中实现等效功能。

需要重构高级排队

可能的根本原因

Oracle 高级队列软件包(DBMS_AQDBMS_AQADM)没有 PostgreSQL 等效项,需要重构。

可能的缓解措施

您可以考虑采取以下方案:

  • 将排队功能从数据库重构到应用层。
  • 使用 PostgreSQL 表、提醒和触发器来实现等效行为。
  • 如需更多帮助,请咨询您的技术解决方案团队代表。

需要重构数据库电子邮件

可能的根本原因

Cloud SQL for PostgreSQL 不支持直接从数据库发送电子邮件。我们也不支持启用此功能的扩展程序。 因此,Database Migration Service 不会转换 UTL_SMTP 软件包的使用情况。

可能的缓解措施

重构数据库电子邮件代码,并将发送电子邮件的责任转移到应用层。您仍然可以使用数据库来捕获需要发送电子邮件的条件。

一种可能的实现方式是将电子邮件详细信息写入专用表。此表还可以充当电子邮件队列,您可以使用 Cloud Run functions 函数轮询该队列,并处理实际的 SMTP 处理。

需要重构作业和调度

可能的根本原因

DBMS_JOB DBMS_SCHEDULER Oracle 软件包不会由 Database Migration Service 转换。您需要重构引用这些软件包的代码。

可能的缓解措施

对于没有依赖关系的简单作业,您可以使用 pg_cron 扩展程序在目标 PostgreSQL 数据库中手动创建调度作业。

对于 pg_cron 不支持的更复杂的安排,您可能需要使用应用级或第三方调度程序。

需要重构文件 I/O

可能的根本原因

Database Migration Service 不支持 Oracle UTL_FILE 软件包。您需要重构引用此软件包的代码。

Orafce 扩展程序包含 UTL_FILE 模拟,但由于文件 I/O 功能受限,可能无法在 Google 管理的 PostgreSQL 环境中使用。

可能的缓解措施
  • 重构代码以移除对 UTL_FILE 的依赖项。
  • Cloud SQL for PostgreSQL 对文件 I/O 功能有一定的限制,因此无法在目标数据库中直接实现此行为。

    另一种可能的替代方案是在 VPC 中的 Compute Engine 虚拟机上安装带有 orafce 扩展程序的 PostgreSQL。然后,您可以在目标数据库中使用 PL/Proxy 扩展程序来调用在 Compute Engine 虚拟机上的数据库中运行的 与 PostgreSQL 兼容的 UTL_FILE 版本

同义词

可能的根本原因

PostgreSQL 不支持同义词。对于代码对象,Database Migration Service 会自动将同义词引用替换为其源架构和对象名称。如果您在代码对象之外使用同义词(例如在数据库应用用户的只读架构中),则需要手动转换这些同义词。

可能的缓解措施

对于代码对象之外的同义词用法,您可以使用 PostgreSQL SEARCH_PATH 参数,或者重构代码以使用视图作为查询对象。

全局临时表

可能的根本原因

此问题组是一条警告,表示 Database Migration Service 在您的 Oracle 源代码中检测到了全局临时表。迁移全局临时表需要您在目标数据库中安装并创建 pgtt PostgreSQL 扩展程序。

可能的缓解措施

建议您验证是否已在目标数据库中安装并创建 pgtt PostgreSQL 扩展程序。

查看 Gemini 建议

潜在根本原因

此问题组会捕获与 Gemini 增强型代码转换相关的所有一般性错误和警告。

可能的缓解措施:此处发现的问题可能并不总是指向实际问题,但我们强烈建议您检查所有经过 Gemini 增强的转化,确保它们符合您的预期。

查看 AI 增强型代码

潜在根本原因:此 DDL 代码已通过 Gemini 增强功能进行转换,可能需要您检查其准确性。

可能的缓解措施:我们建议您仔细检查通过 AI 增强功能转换的代码,确保最终结果与源架构的功能相符。

引用

潜在的根本原因:Gemini 增强型建议可能包含引用自多个来源的内容。某些引用可能受许可限制。 建议您检查转换后的代码中是否存在引用。

元数据转换问题

潜在根本原因

此组包含不属于任何其他更具体的问题组的所有转化问题。

可能的缓解措施

建议您根据对源数据模型的了解情况查看转换后的代码,并根据需要调整代码。

元数据转换问题

潜在根本原因

此群组包含不属于任何其他更具体的问题群组的所有元数据跟踪问题。

可能的缓解措施

此类问题通常与编译错误或警告有关,这些错误或警告可能会导致转换后的 PostgreSQL 中出现数据类型问题。建议您根据对源数据模型的了解来检查转换后的代码,并调整有问题的引用。

请与支持团队联系

可能的根本原因

在特殊边缘情况下,您可能会遇到具有有效 Oracle 源对象的内部错误。如果需要,请与支持团队联系以获取更多帮助。

一般转换问题

潜在的根本原因

此群组包含不属于任何其他更具体的问题类别或群组的所有问题。

可能的缓解措施

建议您根据对源数据模型和代码的了解来检查转换后的代码,并根据需要进行调整。