---
title: "Chuyển bản xuất Oracle sang phiên bản khác"
description: "Chuyển bản xuất SQL Developer hoặc SQLcl từ Oracle 11g trở lên thành tập lệnh nạp được trên Oracle 19c trở lên, cùng bảng, khóa và dữ liệu."
canonical: https://intosql.com/vi/oracle-sang-oracle
last_updated: 2026-10-15
---

# Chuyển bản xuất Oracle sang phiên bản khác

Thả tệp .sql mà Database Export của SQL Developer hoặc SQLcl viết, với các bảng và câu lệnh Insert, và tải xuống tập lệnh nạp được trên Oracle 19c trở lên. NUMBER, DATE, TIMESTAMP, LOB, identity và sequence giữ nguyên, XMLTYPE và JSON giữ văn bản trong CLOB, và mọi thay đổi được liệt kê trong báo cáo.

[Hướng dẫn di chuyển Oracle sang Oracle](https://intosql.com/docs/migrations/oracle-to-oracle)

[Kiểu dữ liệu từ Oracle sang Oracle](https://intosql.com/docs/types/oracle-to-oracle)

## Những gì thay đổi giữa tệp và tập lệnh

Mỗi hàng là một quy tắc trình chuyển đổi áp dụng, kèm dòng báo cáo được ghi khi quy tắc thay đổi dữ liệu của bạn.

| Trong tệp | Trong tập lệnh | Dòng báo cáo |
| --- | --- | --- |
| BOOLEAN (23ai) | BOOLEAN trên 23ai, nếu không thì NUMBER(1) kèm CHECK 0 và 1 |  |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | cùng các kiểu, với độ dài BYTE hoặc CHAR của chúng |  |
| VARCHAR2 and NVARCHAR2 past what the target's own types hold | VARCHAR2(4000 CHAR) khi mọi giá trị vừa 4000 byte, nếu không thì CLOB | `text_as_lob` |
| NUMBER, NUMBER(p,s), FLOAT(b) | cùng các kiểu NUMBER |  |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | cùng các kiểu INTERVAL |  |
| DATE, TIMESTAMP(p) | DATE và TIMESTAMP(p), như đã khai báo |  |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | cùng các kiểu |  |
| JSON (21c), and CLOB holding JSON | JSON trên 21c trở lên, nếu không thì CLOB |  |
| BLOB, RAW(n), LONG RAW | cùng các kiểu; LONG RAW thành BLOB |  |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | CLOB với văn bản của chúng | `type_replaced` |
| collations that ignore case (BINARY_CI) | so sánh chính xác | `case_insensitive_collation` |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | GENERATED BY DEFAULT ON NULL AS IDENTITY, tiếp tục sau id lớn nhất |  |
| identity columns the target can't count | một số nguyên thường | `counter_dropped` |
| CREATE SEQUENCE | CREATE SEQUENCE với cùng các tùy chọn |  |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | cột ảo | `stored_as_virtual` |
| virtual columns with functions IntoSQL doesn't write, and the || operator | một cột thường | `generated_not_translated` |
| defaults with functions IntoSQL doesn't write (SYS_GUID(), ||) | không có giá trị mặc định | `default_not_translated` |
| CHECK constraints | được chuyển đổi |  |
| CHECK constraints with functions IntoSQL doesn't write | không được tạo | `check_skipped` |
| CHECK constraints that are DISABLE or ENABLE NOVALIDATE | không được tạo | `check_not_enforced` |
| function-based, bitmap and domain indexes | không được tạo | `index_skipped` |
| foreign keys | sau dữ liệu với ENABLE NOVALIDATE, rồi xác thực kèm cảnh báo về hàng mồ côi |  |
| ON DELETE CASCADE that cascades in a cycle or along a second path | bị bỏ | `foreign_key_action_unsupported` |
| foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones | không được tạo | `foreign_key_skipped` |
| names longer than Oracle 12.1 allows | rút ngắn | `name_shortened` |
| partitioned tables | một bảng chứa các hàng của mọi phân vùng | `partitions_dropped` |
| several schemas in one export | một schema, mỗi bảng có tên schema ở đầu | `schemas_merged` |
| NOT NULL columns with values that become NULL | bỏ NOT NULL | `not_null_relaxed` |
| views, synonyms, types, packages, procedures, functions and other triggers | được liệt kê trong báo cáo | `not_converted_objects` |
| exports without CREATE TABLE (data only) | kiểu suy ra từ giá trị | `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 và Infinity được giữ |  |
| NUL characters in text | được giữ |  |
| text that isn't valid in its encoding | byte lỗi thành ký tự thay thế | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | sao chép nguyên trạng | `mojibake_suspected` |

## Nạp tập lệnh vào Oracle

Tập lệnh tạo bảng, sao chép các hàng, rồi thêm khóa, chỉ mục và khóa ngoại, nên nạp nhanh và dừng ở lỗi đầu tiên.

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

Khóa ngoại được thêm với ENABLE NOVALIDATE, nên hàng mới được kiểm tra ngay, rồi được xác thực. Nếu một hàng cũ trỏ tới hàng không tồn tại, tập lệnh cho biết ràng buộc nào và để nó ở trạng thái chưa xác thực, thay vì thất bại giữa chừng.

Với bản dump lớn, hãy chạy SQL*Plus trên cùng máy với cơ sở dữ liệu. Tập lệnh commit sau mỗi 100 hàng. Người dùng chạy tập lệnh cần quyền CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER và CREATE PROCEDURE, cùng hạn mức trên tablespace của mình.

## Tạo bản dump Oracle để có kết quả tốt nhất

Trình chuyển đổi đọc những gì bản dump chứa. Các tùy chọn sau giữ lại nhiều dữ liệu hơn trong đó:

- Trong SQL Developer, chọn Tools, Database Export, với DDL và định dạng dữ liệu Insert. SQLcl ghi ra cùng nội dung với SET SQLFORMAT INSERT.
- Chạy ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' trước khi xuất: định dạng mặc định ghi ngày mà không có giờ hay thế kỷ.
- Tệp .dmp từ exp hoặc expdp là nhị phân: hãy nhập nó vào một cơ sở dữ liệu Oracle, chẳng hạn Oracle Database Free trong Docker, rồi xuất bằng SQL Developer.

## Những gì không được chuyển đổi

View, trigger, thủ tục, hàm và các đối tượng khác viết bằng ngôn ngữ riêng của Oracle được liệt kê theo tên trong báo cáo, không bao giờ bị bỏ âm thầm, để bạn kiểm tra từng cái với phiên bản Oracle bạn nạp vào trước khi tạo lại.

## Câu hỏi về chuyển Oracle giữa các phiên bản

### Bản dump của tôi có bị tải lên không?

Không. Trình chuyển đổi chạy trong trình duyệt và đọc bản dump từ ổ đĩa theo từng phần, nên nó không bao giờ rời khỏi máy tính của bạn. Ứng dụng máy tính và dòng lệnh cũng chuyển đổi ngay trên máy tính của bạn.

### Bản dump có thể lớn đến đâu?

Trình chuyển đổi không bao giờ giữ toàn bộ bản dump trong bộ nhớ: nó đọc tệp hai lần, theo từng đoạn, và ghi tập lệnh trong lúc đọc. Bản dump nhiều gigabyte vẫn chuyển đổi được trong trình duyệt, trong ứng dụng máy tính và bằng dòng lệnh.

### Tôi có chuyển đổi được tệp .dmp từ exp hoặc expdp không?

Không trực tiếp: Data Pump và Export gốc ghi một định dạng nhị phân mà chỉ Oracle đọc được. Hãy nhập nó vào bất kỳ cơ sở dữ liệu Oracle nào, Oracle Database Free chạy trong Docker, rồi xuất bằng Database Export của SQL Developer hoặc SQLcl. Trình chuyển đổi sẽ báo điều này khi nhận được tệp .dmp.

### Bản xuất có thể đến từ những phiên bản Oracle nào?

Bản xuất từ SQL Developer và SQLcl, với định nghĩa bảng của DBMS_METADATA, từ Oracle 11g trở lên. Mọi bản xuất thử nghiệm đến từ Oracle 21c và 23ai, trong các phiên kiểu Mỹ, Đức và ISO, và được so với nguồn từng ô một.

### NUMBER, DATE và các kiểu Oracle khác sẽ ra sao?

Chúng giữ nguyên: NUMBER với độ chính xác, DATE, TIMESTAMP, interval, CHAR và VARCHAR2 với độ dài, RAW và các kiểu LOB. XMLTYPE và JSON giữ văn bản trong CLOB, nên tập lệnh nạp được trên 19c.

### Cột identity và sequence có được giữ không?

Có. Cột identity và sequence giữ nguyên và tiếp tục từ điểm mà bản xuất ghi là chúng đã đạt tới.

### Còn gói PL/SQL, thủ tục và trình kích hoạt thì sao?

Chúng được liệt kê theo tên trong báo cáo và không được chuyển đổi, để bạn tạo lại sau khi đã nạp các bảng.

### Tập lệnh nạp được trên những phiên bản Oracle nào?

Oracle 19c trở lên. Mọi bản xuất thử nghiệm đều nạp được trên 21c và 23ai, và dừng ở lỗi đầu tiên nếu có sự cố.

## Từ Oracle

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

## Sang Oracle

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

## Hướng dẫn và mọi cặp

- [Hướng dẫn di chuyển Oracle sang Oracle](https://intosql.com/docs/migrations/oracle-to-oracle)
- [Kiểu dữ liệu từ Oracle sang Oracle](https://intosql.com/docs/types/oracle-to-oracle)
- [Mọi cặp cơ sở dữ liệu](https://intosql.com/vi/chuyen-co-so-du-lieu)
