本文へスキップ
IntoSQL ホーム

Oracle のエクスポートを古いまたは新しい Oracle へ移す

SQL Developer のデータベース・エクスポートか SQLcl が書き出す、テーブルと Insert 文を含む .sql ファイルをドロップすると、Oracle 19c 以降で読み込めるスクリプトをダウンロードできます。NUMBER、DATE、TIMESTAMP、LOB、IDENTITY、シーケンスはそのまま残り、XMLTYPE と JSON はテキストを CLOB に保ちます。すべての変更はレポートに記載されます。

ファイル
sqlshop_2024_oracle.sqlサンプルファイル、9.3 KB
データベース

18 行を変換、修正なし、却下なし

表示

shop_2024_oracle.sql のテーブルOracle のダンプ · SQL Developer で作成 · utf-8

  • customersCUSTOMERS として書き出し8 行
    7 列
    IDNUMBER(10,0) not null
    NAMEVARCHAR2(100 CHAR) not null
    EMAILVARCHAR2(150 CHAR) not null
    COUNTRYCHAR(2 BYTE) not null
    IS_ACTIVENUMBER(1,0) not null
    SIGNED_UPDATE
    CREATED_ATTIMESTAMP(0) not null
  • ordersORDERS として書き出し10 行
    9 列
    IDNUMBER(10,0) not null
    CUSTOMER_IDNUMBER(10,0) not null
    INVOICENUMBER(10,0)
    STATUSVARCHAR2(10 CHAR) not null
    TOTALNUMBER(10,2) not null
    ITEMSNUMBER(5,0) not null
    ORDERED_ATDATE not null
    SHIPPED_ATDATE
    NOTEVARCHAR2(255 CHAR)
-- Written by IntoSQL from a Oracle dump. Load it with: NLS_LANG=.AL32UTF8 sqlplus -S -L <user>/<password>@<database> @<file>
WHENEVER SQLERROR EXIT FAILURE ROLLBACK;
SET DEFINE OFF;
SET SQLBLANKLINES ON;
SET FEEDBACK OFF;
SET SERVEROUTPUT ON;
CREATE OR REPLACE FUNCTION "INTOSQL_CLOB" (p SYS.ODCIVARCHAR2LIST) RETURN CLOB IS
    r CLOB;
BEGIN
    DBMS_LOB.CREATETEMPORARY(r, TRUE);
    FOR i IN 1 .. p.COUNT LOOP
        IF p(i) IS NOT NULL THEN
            DBMS_LOB.WRITEAPPEND(r, LENGTH2(p(i)), p(i));
        END IF;
    END LOOP;
    RETURN r;
END;
/
CREATE OR REPLACE FUNCTION "INTOSQL_BLOB" (p SYS.ODCIVARCHAR2LIST) RETURN BLOB IS
    r BLOB;
    piece RAW(2000);
BEGIN
    DBMS_LOB.CREATETEMPORARY(r, TRUE);
    FOR i IN 1 .. p.COUNT LOOP
        piece := HEXTORAW(p(i));
        DBMS_LOB.WRITEAPPEND(r, UTL_RAW.LENGTH(piece), piece);
    END LOOP;
    RETURN r;
END;
/

CREATE SEQUENCE "INVOICE_NUMBERS" START WITH 1020 INCREMENT BY 1 MINVALUE 1;
CREATE TABLE "CUSTOMERS" (
    "ID" NUMBER(10,0) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1),
    "NAME" VARCHAR2(100 CHAR) NOT NULL,
    "EMAIL" VARCHAR2(150 CHAR) NOT NULL,
    "COUNTRY" CHAR(2 BYTE) DEFAULT 'US' NOT NULL,
    "IS_ACTIVE" NUMBER(1,0) DEFAULT 1 NOT NULL,
    "SIGNED_UP" DATE,
    "CREATED_AT" TIMESTAMP(0) DEFAULT LOCALTIMESTAMP NOT NULL,
    CONSTRAINT "CHECK1" CHECK ("IS_ACTIVE" IN (0, 1))
);

CREATE TABLE "ORDERS" (
    "ID" NUMBER(10,0) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1),
    "CUSTOMER_ID" NUMBER(10,0) NOT NULL,
    "INVOICE" NUMBER(10,0) DEFAULT ("INVOICE_NUMBERS".NEXTVAL),
    "STATUS" VARCHAR2(10 CHAR) DEFAULT 'pending' NOT NULL,
    "TOTAL" NUMBER(10,2) NOT NULL,
    "ITEMS" NUMBER(5,0) DEFAULT 1 NOT NULL,
    "ORDERED_AT" DATE NOT NULL,
    "SHIPPED_AT" DATE,
    "NOTE" VARCHAR2(255 CHAR),
    CONSTRAINT "CHECK1_2" CHECK ("STATUS" IN ('pending', 'paid', 'shipped', 'cancelled'))
);

BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
1,
'Ana Martínez',
'ana@example.com',
'MX',
1,
TIMESTAMP '2023-01-15 00:00:00',
TIMESTAMP '2023-01-15 10:24:00.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
2,
'Zoë Müller',
'zoe@example.de',
'DE',
1,
TIMESTAMP '2023-02-03 00:00:00',
TIMESTAMP '2023-02-03 08:11:42.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
3,
'José Peña',
'jose@example.es',
'ES',
0,
TIMESTAMP '2023-03-21 00:00:00',
TIMESTAMP '2023-03-21 19:05:17.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
4,
'李雷',
'lilei@example.cn',
'CN',
1,
TIMESTAMP '2023-05-09 00:00:00',
TIMESTAMP '2023-05-09 02:40:00.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
5,
'Noah O''Brien',
'noah@example.ie',
'IE',
1,
NULL,
TIMESTAMP '2023-06-30 14:00:00.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
6,
'Amélie Laurent',
'amelie@example.fr',
'FR',
1,
TIMESTAMP '2024-01-02 00:00:00',
TIMESTAMP '2024-01-02 09:30:00.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
7,
'Ravi Patel',
'ravi@example.in',
'IN',
0,
TIMESTAMP '2024-02-29 00:00:00',
TIMESTAMP '2024-02-29 23:59:59.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
8,
'Sofia Rossi 🌻',
'sofia@example.it',
'IT',
1,
TIMESTAMP '2024-04-12 00:00:00',
TIMESTAMP '2024-04-12 12:12:12.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
1,
1,
1000,
'shipped',
129.9,
3,
TIMESTAMP '2024-03-01 10:00:00',
TIMESTAMP '2024-03-02 16:30:00',
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
2,
2,
1001,
'paid',
54,
1,
TIMESTAMP '2024-03-02 11:15:00',
NULL,
'Gift wrap 🎁'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
3,
1,
1002,
'cancelled',
12.5,
1,
TIMESTAMP '2024-03-03 09:45:00',
NULL,
'Customer changed their mind'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
4,
4,
1003,
'shipped',
980,
12,
TIMESTAMP '2024-03-05 02:10:00',
TIMESTAMP '2024-03-07 08:00:00',
'请小心轻放'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
5,
5,
1004,
'pending',
45.75,
2,
TIMESTAMP '2024-03-08 17:20:00',
NULL,
'Leave at the door; ring twice'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
6,
6,
1005,
'shipped',
310.4,
5,
TIMESTAMP '2024-03-10 13:00:00',
TIMESTAMP '2024-03-11 09:00:00',
'Fragile: "glass"'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
7,
8,
1006,
'paid',
76.2,
2,
TIMESTAMP '2024-03-11 18:45:00',
NULL,
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
8,
2,
1007,
'paid',
19.99,
1,
TIMESTAMP '2024-03-12 08:00:00',
NULL,
'Paid at the counter'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
9,
3,
1008,
'shipped',
64,
2,
TIMESTAMP '2024-03-14 15:30:00',
NULL,
'Shipping date never recorded'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
10,
7,
1009,
'paid',
1499,
1,
TIMESTAMP '2024-03-15 21:05:00',
NULL,
'C:\Users\ravi\invoice.pdf'
);
COMMIT;
END;
/

-- Keys, indexes, foreign keys, counters and triggers, after the rows.
ALTER TABLE "CUSTOMERS" ADD CONSTRAINT "PK_CUSTOMERS" PRIMARY KEY ("ID");
ALTER TABLE "CUSTOMERS" ADD CONSTRAINT "UQ_CUSTOMERS_CUSTOMERS_EMAIL_UK" UNIQUE ("EMAIL");
ALTER TABLE "ORDERS" ADD CONSTRAINT "PK_ORDERS" PRIMARY KEY ("ID");
CREATE INDEX "IX_ORDERS_ORDERS_STATUS_DATE_IX" ON "ORDERS" ("STATUS", "ORDERED_AT");
ALTER TABLE "ORDERS" ADD CONSTRAINT "ORDERS_CUSTOMER_FK" FOREIGN KEY ("CUSTOMER_ID") REFERENCES "CUSTOMERS" ("ID") ENABLE NOVALIDATE;
BEGIN
    EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" ENABLE VALIDATE CONSTRAINT "ORDERS_CUSTOMER_FK"';
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Foreign key ' || '"ORDERS_CUSTOMER_FK"' || ' has rows without a parent: it stays unvalidated, and new rows are checked.');
END;
/
DECLARE
    next_id NUMBER;
BEGIN
    SELECT NVL(MAX("ID"), 0) + 1 INTO next_id FROM "CUSTOMERS";
    IF next_id < 1 THEN
        next_id := 1;
    END IF;
    EXECUTE IMMEDIATE 'ALTER TABLE "CUSTOMERS" MODIFY ("ID" GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH ' || next_id || '))';
END;
/
COMMENT ON TABLE "CUSTOMERS" IS 'People who bought at least once';
DECLARE
    next_id NUMBER;
BEGIN
    SELECT NVL(MAX("ID"), 0) + 1 INTO next_id FROM "ORDERS";
    IF next_id < 1 THEN
        next_id := 1;
    END IF;
    EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" MODIFY ("ID" GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH ' || next_id || '))';
END;
/
DROP FUNCTION "INTOSQL_CLOB";
DROP FUNCTION "INTOSQL_BLOB";
COMMIT;
EXIT;

修正

修正が必要な箇所はありませんでした。

ファイルはこのコンピューター上で変換され、アップロードされることはありません。

その他のサンプル:

ファイルとスクリプトで変わること

各行はコンバーターが適用するルールです。ルールによってデータが変わったときにレポートに書かれる行も示します。

  • BOOLEAN (23ai)

    23ai では BOOLEAN、それ以外は 0 と 1 の CHECK 付きの NUMBER(1)

    TRUE と FALSE は true と false のままです。

  • VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG

    同じ型、BYTE または CHAR の長さ付き

    同じテキスト型です。LONG は、バージョン 8 以降のどのバージョンでも推奨される CLOB になります。

  • VARCHAR2 and NVARCHAR2 past what the target's own types hold

    すべての値が 4000 バイトに収まれば VARCHAR2(4000 CHAR)、それ以外は CLOB

    VARCHAR2 はデフォルトで 4000 バイトまでで、Oracle は CLOB にインデックスを作れません。そのためテキストは値が収まれば VARCHAR2 のまま、収まらなければ CLOB になります。

    レポートの行: text_as_lob

  • NUMBER, NUMBER(p,s), FLOAT(b)

    同じ NUMBER 型

    同じ NUMBER 型と FLOAT 型で、すべての桁を保ちます。

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    同じ INTERVAL 型

    interval の値は同じです。

  • DATE, TIMESTAMP(p)

    宣言どおりの DATE と TIMESTAMP(p)

    同じ型なので、すべての日付が秒までの時刻を保ちます。

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    同じ型

    Oracle が保持できるオフセットは -12:00 から +14:00 までです。-12:00 を超えるオフセットの値は UTC で書き出し、同じ時点を保ちます。

  • JSON (21c), and CLOB holding JSON

    21c 以降は JSON、それ以外は CLOB

    JSON の値は同じです。エクスポートが 'null' と書き出した SQL の NULL は NULL のままです。

  • BLOB, RAW(n), LONG RAW

    同じ型、LONG RAW は BLOB

    バイトはバイトのままです。

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    テキストを持つ CLOB

    XMLTYPE、ROWID、UROWID はテキストを CLOB に保つため、スクリプトは 19c 以降のどのバージョンでも読み込めます。

    レポートの行: type_replaced

  • collations that ignore case (BINARY_CI)

    厳密な比較

    列の照合順序は書き出さないため、大文字と小文字を区別しなかった列 (BINARY_CI) でも、Ana と ana を区別するようになります。

    レポートの行: case_insensitive_collation

  • identity columns, and a sequence a BEFORE INSERT trigger assigns

    GENERATED BY DEFAULT ON NULL AS IDENTITY、最大の ID の後から継続

    コピーした ID はそのまま読み込み、カウンターは最大の ID の後から続きます。トリガーがシーケンスから値を入れる列 (12c より前の方法) も IDENTITY 列になります。

  • identity columns the target can't count

    普通の整数

    Oracle が採番する IDENTITY 列はテーブルごとに 1 つだけです。それ以外の列はカウンターなしで値を保ちます。

    レポートの行: counter_dropped

  • CREATE SEQUENCE

    同じオプションの CREATE SEQUENCE

    エクスポートはシーケンスの現在位置を START WITH として書き出すため、そこから続きます。

  • virtual columns (GENERATED ALWAYS AS ... VIRTUAL)

    仮想列

    仮想列は同じです。

    レポートの行: stored_as_virtual

  • virtual columns with functions IntoSQL doesn't write, and the || operator

    普通の列

    Oracle 用に書き換えられない式は、普通の列とレポートの 1 行になります。エクスポートが仮想列に書き出した値は含めず、Oracle が計算する値もありません。

    レポートの行: 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

    作成しない

    Oracle は既存の行にこれらのチェックを適用しないため、行が違反している可能性があります。

    レポートの行: check_not_enforced

  • function-based, bitmap and domain indexes

    作成しない

    IntoSQL が書き出すのは列全体に対する b-tree インデックスです。その他は読み込み後に作り直してください。

    レポートの行: index_skipped

  • foreign keys

    データの後に ENABLE NOVALIDATE で作成してから検証し、孤立した行があれば警告

    キーは新しい行をすぐにチェックし、最後に検証します。親のない行があれば、読み込みを止めずにキーを未検証のまま残して警告します。

  • ON DELETE CASCADE that cascades in a cycle or along a second path

    削除

    Oracle の外部キーが動作するのは削除時だけで、CASCADE か SET NULL のみです。

    レポートの行: foreign_key_action_unsupported

  • foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones

    作成しない

    キーは存在しないテーブルを参照できません。また、Oracle がチェックしないキーには親のない行がある可能性があります。

    レポートの行: foreign_key_skipped

  • names longer than Oracle 12.1 allows

    短縮

    Oracle 12.2 以降の名前は 128 バイトまでです。それより長い名前は短縮します。

    レポートの行: name_shortened

  • partitioned tables

    すべてのパーティションの行を持つ 1 つのテーブル

    行は同じです。必要なら Oracle でもう一度テーブルをパーティション分割してください。

    レポートの行: partitions_dropped

  • several schemas in one export

    1 つのスキーマ、テーブル名の先頭にスキーマ名

    スクリプトは実行したユーザーのスキーマに読み込まれるため、別のスキーマのテーブルには先頭にスキーマ名が付きます。1 つのスキーマだけのエクスポートはテーブル名を保ちます。

    レポートの行: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL を削除

    値を NULL にする必要があった列は NOT NULL を保てません。保つと読み込みが止まります。

    レポートの行: not_null_relaxed

  • views, synonyms, types, packages, procedures, functions and other triggers

    レポートに記載

    コードが PL/SQL で書かれているため、作り直せるよう一覧にします。

    レポートの行: not_converted_objects

  • exports without CREATE TABLE (data only)

    値から読み取った型

    データのみのエクスポートには行しかないため、型は値から決まります。

    レポートの行: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    データベースを実行しないコンバーターでは、これらを評価できません。エクスポートが書き出す to_date、to_timestamp、TO_CLOB、HEXTORAW などは読み取ります。

    レポートの行: expression_value

  • types IntoSQL doesn't know, and object types

    CLOB

    text はどんな値も保持できます。読み込み後に型を変更してください。

    レポートの行: unknown_type

  • dates before year 1 and time zones given as region names

    NULL

    日付ではない値は NULL になり、レポートで件数を示します。

    レポートの行: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NaN と Infinity を保持

    Oracle の浮動小数点型は NaN と infinity を保持できます。

  • NUL characters in text

    保持

    VARCHAR2 と CLOB は NUL 文字を保持できるため、値はそのままコピーします。

  • text that isn't valid in its encoding

    不正なバイトを置換文字に

    スクリプトは UTF-8 なので、すべての値が有効なテキストである必要があります。

    レポートの行: invalid_utf8_replaced

  • text decoded twice (ñ)

    そのままコピー

    スクリプトにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。

    レポートの行: mojibake_suspected

ファイルではスクリプトではレポートの行
BOOLEAN (23ai)23ai では BOOLEAN、それ以外は 0 と 1 の CHECK 付きの NUMBER(1)TRUE と FALSE は true と false のままです。
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG同じ型、BYTE または CHAR の長さ付き同じテキスト型です。LONG は、バージョン 8 以降のどのバージョンでも推奨される CLOB になります。
VARCHAR2 and NVARCHAR2 past what the target's own types holdすべての値が 4000 バイトに収まれば VARCHAR2(4000 CHAR)、それ以外は CLOBVARCHAR2 はデフォルトで 4000 バイトまでで、Oracle は CLOB にインデックスを作れません。そのためテキストは値が収まれば VARCHAR2 のまま、収まらなければ CLOB になります。text_as_lob
NUMBER, NUMBER(p,s), FLOAT(b)同じ NUMBER 型同じ NUMBER 型と FLOAT 型で、すべての桁を保ちます。
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND同じ INTERVAL 型interval の値は同じです。
DATE, TIMESTAMP(p)宣言どおりの DATE と TIMESTAMP(p)同じ型なので、すべての日付が秒までの時刻を保ちます。
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE同じ型Oracle が保持できるオフセットは -12:00 から +14:00 までです。-12:00 を超えるオフセットの値は UTC で書き出し、同じ時点を保ちます。
JSON (21c), and CLOB holding JSON21c 以降は JSON、それ以外は CLOBJSON の値は同じです。エクスポートが 'null' と書き出した SQL の NULL は NULL のままです。
BLOB, RAW(n), LONG RAW同じ型、LONG RAW は BLOBバイトはバイトのままです。
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYテキストを持つ CLOBXMLTYPE、ROWID、UROWID はテキストを CLOB に保つため、スクリプトは 19c 以降のどのバージョンでも読み込めます。type_replaced
collations that ignore case (BINARY_CI)厳密な比較列の照合順序は書き出さないため、大文字と小文字を区別しなかった列 (BINARY_CI) でも、Ana と ana を区別するようになります。case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assignsGENERATED BY DEFAULT ON NULL AS IDENTITY、最大の ID の後から継続コピーした ID はそのまま読み込み、カウンターは最大の ID の後から続きます。トリガーがシーケンスから値を入れる列 (12c より前の方法) も IDENTITY 列になります。
identity columns the target can't count普通の整数Oracle が採番する IDENTITY 列はテーブルごとに 1 つだけです。それ以外の列はカウンターなしで値を保ちます。counter_dropped
CREATE SEQUENCE同じオプションの CREATE SEQUENCEエクスポートはシーケンスの現在位置を START WITH として書き出すため、そこから続きます。
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)仮想列仮想列は同じです。stored_as_virtual
virtual columns with functions IntoSQL doesn't write, and the || operator普通の列Oracle 用に書き換えられない式は、普通の列とレポートの 1 行になります。エクスポートが仮想列に書き出した値は含めず、Oracle が計算する値もありません。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作成しないOracle は既存の行にこれらのチェックを適用しないため、行が違反している可能性があります。check_not_enforced
function-based, bitmap and domain indexes作成しないIntoSQL が書き出すのは列全体に対する b-tree インデックスです。その他は読み込み後に作り直してください。index_skipped
foreign keysデータの後に ENABLE NOVALIDATE で作成してから検証し、孤立した行があれば警告キーは新しい行をすぐにチェックし、最後に検証します。親のない行があれば、読み込みを止めずにキーを未検証のまま残して警告します。
ON DELETE CASCADE that cascades in a cycle or along a second path削除Oracle の外部キーが動作するのは削除時だけで、CASCADE か SET NULL のみです。foreign_key_action_unsupported
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones作成しないキーは存在しないテーブルを参照できません。また、Oracle がチェックしないキーには親のない行がある可能性があります。foreign_key_skipped
names longer than Oracle 12.1 allows短縮Oracle 12.2 以降の名前は 128 バイトまでです。それより長い名前は短縮します。name_shortened
partitioned tablesすべてのパーティションの行を持つ 1 つのテーブル行は同じです。必要なら Oracle でもう一度テーブルをパーティション分割してください。partitions_dropped
several schemas in one export1 つのスキーマ、テーブル名の先頭にスキーマ名スクリプトは実行したユーザーのスキーマに読み込まれるため、別のスキーマのテーブルには先頭にスキーマ名が付きます。1 つのスキーマだけのエクスポートはテーブル名を保ちます。schemas_merged
NOT NULL columns with values that become NULLNOT NULL を削除値を NULL にする必要があった列は NOT NULL を保てません。保つと読み込みが止まります。not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggersレポートに記載コードが PL/SQL で書かれているため、作り直せるよう一覧にします。not_converted_objects
exports without CREATE TABLE (data only)値から読み取った型データのみのエクスポートには行しかないため、型は値から決まります。no_schema
expressions in INSERT values other than the ones exports writeNULLデータベースを実行しないコンバーターでは、これらを評価できません。エクスポートが書き出す to_date、to_timestamp、TO_CLOB、HEXTORAW などは読み取ります。expression_value
types IntoSQL doesn't know, and object typesCLOBtext はどんな値も保持できます。読み込み後に型を変更してください。unknown_type
dates before year 1 and time zones given as region namesNULL日付ではない値は NULL になり、レポートで件数を示します。date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENaN と Infinity を保持Oracle の浮動小数点型は NaN と infinity を保持できます。
NUL characters in text保持VARCHAR2 と CLOB は NUL 文字を保持できるため、値はそのままコピーします。
text that isn't valid in its encoding不正なバイトを置換文字にスクリプトは UTF-8 なので、すべての値が有効なテキストである必要があります。invalid_utf8_replaced
text decoded twice (ñ)そのままコピースクリプトにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。mojibake_suspected

スクリプトを Oracle に読み込む

スクリプトはテーブルを作成して行をコピーしてから、キー、インデックス、外部キーを追加します。そのため読み込みが速く、最初のエラーで止まります。

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 のバージョン間の移行に関する質問

ここに答えがない場合は、お問い合わせページからご連絡ください。担当者が返信します。 お問い合わせページ

ダンプはアップロードされますか?

いいえ。コンバーターはブラウザ上で動作し、ダンプをディスクから少しずつ読み込むため、ダンプがコンピューターの外に出ることはありません。デスクトップアプリとコマンドラインも、お使いのコンピューター上で変換します。

ダンプはどのくらいの大きさまで扱えますか?

コンバーターはダンプ全体をメモリに保持しません。ファイルを範囲ごとに 2 回読み、読みながらスクリプトを書き出します。数 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 で読み込み、問題があれば最初のエラーで止まります。