---
title: "Oracle 내보내기를 다른 버전으로"
description: "Oracle 11g 이상의 SQL Developer나 SQLcl 내보내기를 Oracle 19c 이상에서 불러와지는 스크립트로 변환. 같은 테이블, 키, 데이터."
canonical: https://intosql.com/ko/oracle-to-oracle
last_updated: 2026-10-15
---

# Oracle 내보내기를 다른 버전으로

SQL Developer 데이터베이스 내보내기나 SQLcl이 쓴 테이블과 Insert 문의 .sql 파일을 놓으면 Oracle 19c 이상에서 불러와지는 스크립트를 받아요. NUMBER, DATE, TIMESTAMP, LOB, IDENTITY, 시퀀스는 그대로이고, 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, 아니면 0과 1의 CHECK가 붙은 NUMBER(1) |  |
| 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 | 하나의 스키마, 테이블 이름 앞에 스키마 이름 | `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 버전의 내보내기를 읽나요?

Oracle 11g 이상에서 SQL Developer와 SQLcl로 만든, DBMS_METADATA의 테이블 정의를 담은 내보내기예요. 모든 테스트 내보내기는 Oracle 21c와 23ai에서 미국식, 독일식, ISO 세션으로 만들고 원본과 셀 단위로 비교해요.

### NUMBER, DATE 등 Oracle 타입은 어떻게 되나요?

그대로 유지돼요. 정밀도를 유지한 NUMBER, DATE, TIMESTAMP, interval, 길이를 유지한 CHAR와 VARCHAR2, RAW와 LOB 모두 그대로예요. XMLTYPE과 JSON은 텍스트를 CLOB에 유지하므로 스크립트를 19c에서 불러올 수 있어요.

### identity 열과 시퀀스는 유지되나요?

네. identity 열과 시퀀스는 그대로 유지되고, 내보내기에 적힌 위치부터 이어져요.

### PL/SQL 패키지, 프로시저, 트리거는 어떻게 되나요?

변환하지 않고 보고서에 이름으로 나열하므로, 테이블을 불러온 뒤 다시 만들 수 있어요.

### 스크립트는 어떤 Oracle 버전에서 불러올 수 있나요?

Oracle 19c 이상이에요. 모든 테스트 내보내기를 21c와 23ai에서 불러오며, 문제가 생기면 첫 오류에서 멈춰요.

## Oracle에서

- [Oracle에서 PostgreSQL로](https://intosql.com/ko/oracle-to-postgresql)
- [Oracle에서 MySQL로](https://intosql.com/ko/oracle-to-mysql)
- [Oracle에서 MariaDB로](https://intosql.com/ko/oracle-to-mariadb)
- [Oracle에서 SQLite로](https://intosql.com/ko/oracle-to-sqlite)
- [Oracle에서 SQL Server로](https://intosql.com/ko/oracle-to-sql-server)

## Oracle로

- [MySQL에서 Oracle로](https://intosql.com/ko/mysql-to-oracle)
- [MariaDB에서 Oracle로](https://intosql.com/ko/mariadb-to-oracle)
- [PostgreSQL에서 Oracle로](https://intosql.com/ko/postgresql-to-oracle)
- [SQL Server에서 Oracle로](https://intosql.com/ko/sql-server-to-oracle)
- [SQLite에서 Oracle로](https://intosql.com/ko/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/ko/database-migration)
