---
title: "将 Oracle 导出迁移到另一个版本"
description: "将 Oracle 11g 及以上的 SQL Developer 或 SQLcl 导出转换为可在 Oracle 19c 及以上导入的脚本，表、键和数据相同。"
canonical: https://intosql.com/zh-cn/oracle-to-oracle
last_updated: 2026-10-15
---

# 将 Oracle 导出迁移到另一个版本

拖入 SQL Developer 的数据库导出或 SQLcl 写出的 .sql 文件，包含表和 Insert 语句，即可下载可在 Oracle 19c 及以上导入的脚本。NUMBER、DATE、TIMESTAMP、LOB、标识列和序列保持不变，XMLTYPE 和 JSON 的文本保存在 CLOB 中，每项更改都会列在报告中。

[Oracle 到 Oracle 迁移指南](https://intosql.com/docs/migrations/oracle-to-oracle)

[Oracle 到 Oracle 的数据类型](https://intosql.com/docs/types/oracle-to-oracle)

## 文件与脚本之间的变化

每一行是转换器应用的一条规则，以及该规则更改你的数据时在报告中写入的记录。

| 文件中 | 脚本中 | 报告记录 |
| --- | --- | --- |
| BOOLEAN (23ai) | 23ai 上为 BOOLEAN，否则为 NUMBER(1)，并带有限定 0 和 1 的 CHECK |  |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | 相同的类型，保留其 BYTE 或 CHAR 长度 |  |
| VARCHAR2 and NVARCHAR2 past what the target's own types hold | 每个值都不超过 4000 字节时为 VARCHAR2(4000 CHAR)，否则为 CLOB | `text_as_lob` |
| NUMBER, NUMBER(p,s), FLOAT(b) | 相同的 NUMBER 类型 |  |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | 相同的 INTERVAL 类型 |  |
| DATE, TIMESTAMP(p) | DATE 和 TIMESTAMP(p)，与声明一致 |  |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | 相同的类型 |  |
| JSON (21c), and CLOB holding JSON | 21c 及更高版本为 JSON，否则为 CLOB |  |
| BLOB, RAW(n), LONG RAW | 相同的类型；LONG RAW 为 BLOB |  |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | CLOB，存放其文本 | `type_replaced` |
| collations that ignore case (BINARY_CI) | 精确比较 | `case_insensitive_collation` |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | GENERATED BY DEFAULT ON NULL AS IDENTITY，从最大的 id 之后继续 |  |
| identity columns the target can't count | 普通整数 | `counter_dropped` |
| CREATE SEQUENCE | CREATE SEQUENCE，选项相同 |  |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | 虚拟列 | `stored_as_virtual` |
| virtual columns with functions IntoSQL doesn't write, and the || operator | 普通列 | `generated_not_translated` |
| defaults with functions IntoSQL doesn't write (SYS_GUID(), ||) | 无默认值 | `default_not_translated` |
| CHECK constraints | 已转换 |  |
| CHECK constraints with functions IntoSQL doesn't write | 不创建 | `check_skipped` |
| CHECK constraints that are DISABLE or ENABLE NOVALIDATE | 不创建 | `check_not_enforced` |
| function-based, bitmap and domain indexes | 不创建 | `index_skipped` |
| foreign keys | 在数据之后以 ENABLE NOVALIDATE 添加，然后验证，有孤立行时给出警告 |  |
| ON DELETE CASCADE that cascades in a cycle or along a second path | 去除 | `foreign_key_action_unsupported` |
| foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones | 不创建 | `foreign_key_skipped` |
| names longer than Oracle 12.1 allows | 缩短 | `name_shortened` |
| partitioned tables | 单个表，包含每个分区的行 | `partitions_dropped` |
| several schemas in one export | 单个 schema，每个表名前加上其 schema 名 | `schemas_merged` |
| NOT NULL columns with values that become NULL | 去除 NOT NULL | `not_null_relaxed` |
| views, synonyms, types, packages, procedures, functions and other triggers | 在报告中列出 | `not_converted_objects` |
| exports without CREATE TABLE (data only) | 根据值推断类型 | `no_schema` |
| expressions in INSERT values other than the ones exports write | NULL | `expression_value` |
| types IntoSQL doesn't know, and object types | CLOB | `unknown_type` |
| dates before year 1 and time zones given as region names | NULL | `date_out_of_range` |
| NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE | 保留 NaN 和 Infinity |  |
| NUL characters in text | 保留 |  |
| text that isn't valid in its encoding | 错误的字节变为替换字符 | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | 按原样复制 | `mojibake_suspected` |

## 将脚本导入 Oracle

脚本先创建表、复制行，再添加键、索引和外键，因此导入速度快，并会在遇到第一个错误时停止。

```shell
NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @oracle.oracle.sql
```

外键以 ENABLE NOVALIDATE 添加，因此新行会立即检查，之后再验证。如果某个旧行指向不存在的行，脚本会说明是哪个约束，并让它保持未验证状态，而不是中途失败。

对于较大的转储，请在数据库所在的机器上运行 SQL*Plus。脚本每 100 行提交一次。运行脚本的用户需要 CREATE TABLE、CREATE SEQUENCE、CREATE TRIGGER 和 CREATE PROCEDURE 权限，以及其表空间上的配额。

## 如何转储 Oracle 以获得最佳结果

转换器读取转储中的内容。以下选项能让转储保留更多数据：

- 在 SQL Developer 中选择 Tools、Database Export，并选择 DDL 和 Insert 数据格式。SQLcl 使用 SET SQLFORMAT INSERT 也会写出相同内容。
- 导出前请执行 ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS'：默认格式写出的日期不含时间和世纪。
- exp 或 expdp 生成的 .dmp 文件是二进制的：请将其导入 Oracle 数据库（例如 Docker 中的 Oracle Database Free），再用 SQL Developer 导出。

## 哪些内容不会转换

视图、触发器、存储过程、函数等用 Oracle 自己的语言编写的对象，会按名称列在报告中，绝不会被悄悄丢弃，你可以先在要导入的 Oracle 版本上逐一检查再重建。

## 关于在 Oracle 版本之间迁移的问题

### 我的转储会被上传吗？

不会。转换器在你的浏览器中运行，分块从磁盘读取转储，因此转储不会离开你的电脑。桌面应用和命令行也在你的电脑上转换。

### 转储可以多大？

转换器从不把整个转储放进内存：它按范围读取文件两次，边读边写出脚本。几 GB 的转储可以在浏览器、桌面应用和命令行中转换。

### 可以转换 exp 或 expdp 生成的 .dmp 文件吗？

不能直接转换：Data Pump 和原始的 Export 写出的是只有 Oracle 能读取的二进制格式。请将其导入任意 Oracle 数据库（Oracle Database Free 可在 Docker 中运行），再用 SQL Developer 的 Database Export 或 SQLcl 导出。转换器收到 .dmp 文件时会给出提示。

### 导出可以来自哪些 Oracle 版本？

由 SQL Developer 和 SQLcl 从 Oracle 11g 及更高版本写出、带有 DBMS_METADATA 表定义的导出。每个测试导出都来自 Oracle 21c 和 23ai，涵盖美式、德式和 ISO 会话，并与其源数据逐个单元格比较。

### NUMBER、DATE 和其他 Oracle 类型会怎样？

它们保持不变：NUMBER 保留其精度，DATE、TIMESTAMP、interval，CHAR 和 VARCHAR2 保留其长度，RAW 和 LOB 也一样。XMLTYPE 和 JSON 将其文本保存在 CLOB 中，因此脚本可在 19c 上导入。

### 标识列和序列会保留吗？

是的。标识列和序列保持不变，并从导出记录的到达位置继续。

### PL/SQL 包、存储过程和触发器怎么处理？

它们会按名称在报告中列出，但不会转换，以便你在导入表之后重新创建它们。

### 脚本可以导入哪些 Oracle 版本？

Oracle 19c 及更高版本。每个测试导出都能在 21c 和 23ai 上导入，如有问题会在第一个错误处停止。

## 从 Oracle

- [Oracle 到 PostgreSQL](https://intosql.com/zh-cn/oracle-to-postgresql)
- [Oracle 到 MySQL](https://intosql.com/zh-cn/oracle-to-mysql)
- [Oracle 到 MariaDB](https://intosql.com/zh-cn/oracle-to-mariadb)
- [Oracle 到 SQLite](https://intosql.com/zh-cn/oracle-to-sqlite)
- [Oracle 到 SQL Server](https://intosql.com/zh-cn/oracle-to-sql-server)

## 到 Oracle

- [MySQL 到 Oracle](https://intosql.com/zh-cn/mysql-to-oracle)
- [MariaDB 到 Oracle](https://intosql.com/zh-cn/mariadb-to-oracle)
- [PostgreSQL 到 Oracle](https://intosql.com/zh-cn/postgresql-to-oracle)
- [SQL Server 到 Oracle](https://intosql.com/zh-cn/sql-server-to-oracle)
- [SQLite 到 Oracle](https://intosql.com/zh-cn/sqlite-to-oracle)

## 指南和所有组合

- [Oracle 到 Oracle 迁移指南](https://intosql.com/docs/migrations/oracle-to-oracle)
- [Oracle 到 Oracle 的数据类型](https://intosql.com/docs/types/oracle-to-oracle)
- [所有数据库组合](https://intosql.com/zh-cn/database-migration)
