Langsung ke konten
Beranda IntoSQL

Konversi PostgreSQL ke Oracle

Letakkan dump plain dari pg_dump atau pg_dumpall, sebagai .sql atau .sql.gz, lalu unduh skrip Oracle dengan tabel, kunci, indeks, dan data yang sama. Setiap nilai yang tidak bisa disimpan Oracle apa adanya, dan setiap objek yang tidak didukungnya, dicantumkan di laporan.

File Anda
sqlshop_2024_postgres.sqlFile contoh, 6,2 kB
Database Anda

18 baris dikonversi, 2 perbaikan, tidak ada yang ditolak

Tampilkan

Tabel di shop_2024_postgres.sqlDump PostgreSQL 18.6 · ditulis oleh pg_dump · utf8mb4

  • customersditulis sebagai CUSTOMERS8 baris1
    8 kolom
    IDNUMBER(10) not null
    NAMEVARCHAR2(4000 CHAR) not null
    EMAILVARCHAR2(750 CHAR) not null
    COUNTRYVARCHAR2(2 CHAR) not null
    IS_ACTIVENUMBER(1) not null
    TAGSCLOB not null
    SIGNED_UPDATE
    CREATED_ATTIMESTAMP(6) WITH TIME ZONE not null
  • ordersditulis sebagai ORDERS10 baris1
    10 kolom
    IDNUMBER(10) not null
    CUSTOMER_IDNUMBER(10) not null
    STATUSVARCHAR2(9 CHAR) not null
    TOTALNUMBER(10,2) not null
    ITEMSNUMBER(5) not null
    ORDERED_ATTIMESTAMP(6) not null
    SHIPPED_ATTIMESTAMP(6)
    NOTEVARCHAR2(4000 CHAR)
    DETAILSCLOB
    DELIVERYVARCHAR2(100 CHAR)

Tidak dikonversi

  • View paid_orders

Setiap database menulis objek ini dalam bahasanya sendiri. Tulis ulang untuk Oracle.

-- Written by IntoSQL from a PostgreSQL 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 TABLE "CUSTOMERS" (
    "ID" NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1001),
    "NAME" VARCHAR2(4000 CHAR) NOT NULL,
    "EMAIL" VARCHAR2(750 CHAR) NOT NULL,
    "COUNTRY" VARCHAR2(2 CHAR) DEFAULT 'US' NOT NULL,
    "IS_ACTIVE" NUMBER(1) DEFAULT 1 NOT NULL,
    "TAGS" CLOB NOT NULL,
    "SIGNED_UP" DATE,
    "CREATED_AT" TIMESTAMP(6) WITH TIME ZONE DEFAULT SYSTIMESTAMP NOT NULL,
    CONSTRAINT "CK_CUSTOMERS_IS_ACTIVE" CHECK ("IS_ACTIVE" IN (0, 1))
);

CREATE TABLE "ORDERS" (
    "ID" NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 5001),
    "CUSTOMER_ID" NUMBER(10) NOT NULL,
    "STATUS" VARCHAR2(9 CHAR) DEFAULT 'pending' NOT NULL,
    "TOTAL" NUMBER(10,2) NOT NULL,
    "ITEMS" NUMBER(5) DEFAULT 1 NOT NULL,
    "ORDERED_AT" TIMESTAMP(6) NOT NULL,
    "SHIPPED_AT" TIMESTAMP(6),
    "NOTE" VARCHAR2(4000 CHAR),
    "DETAILS" CLOB,
    "DELIVERY" VARCHAR2(100 CHAR),
    CONSTRAINT "CK_ORDERS_STATUS" CHECK ("STATUS" IN ('pending', 'paid', 'shipped', 'cancelled')),
    CONSTRAINT "ORDERS_TOTAL_CHECK" CHECK ("TOTAL" >= (0))
);

BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"TAGS",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
1,
'Ana Martínez',
'ana@example.com',
'MX',
1,
'["vip"]',
DATE '2023-01-15',
TIMESTAMP '2023-01-15 10:24:00 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"TAGS",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
2,
'Zoë Müller',
'zoe@example.de',
'DE',
1,
'[]',
DATE '2023-02-03',
TIMESTAMP '2023-02-03 08:11:42 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"TAGS",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
3,
'José Peña',
'jose@example.es',
'ES',
0,
'["wholesale","late payer"]',
DATE '2023-03-21',
TIMESTAMP '2023-03-21 19:05:17 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"TAGS",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
4,
'李雷',
'lilei@example.cn',
'CN',
1,
'[]',
DATE '2023-05-09',
TIMESTAMP '2023-05-09 02:40:00 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"TAGS",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
5,
'Noah O''Brien',
'noah@example.ie',
'IE',
1,
'[]',
NULL,
TIMESTAMP '2023-06-30 14:00:00 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"TAGS",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
6,
'Amélie Laurent',
'amelie@example.fr',
'FR',
1,
'["vip"]',
DATE '2024-01-02',
TIMESTAMP '2024-01-02 09:30:00 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"TAGS",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
7,
'Ravi Patel',
'ravi@example.in',
'IN',
0,
'[]',
DATE '2024-02-29',
TIMESTAMP '2024-02-29 23:59:59 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"TAGS",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
8,
'Sofia Rossi 🌻',
'sofia@example.it',
'IT',
1,
'[]',
DATE '2024-04-12',
TIMESTAMP '2024-04-12 12:12:12 +00:00'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"DELIVERY"
) VALUES (
1,
1,
'shipped',
129.90,
3,
TIMESTAMP '2024-03-01 10:00:00',
TIMESTAMP '2024-03-02 16:30:00',
NULL,
'{"gift": false}',
'1 day 06:30:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"DELIVERY"
) VALUES (
2,
2,
'paid',
54.00,
1,
TIMESTAMP '2024-03-02 11:15:00',
NULL,
'Gift wrap 🎁',
'{"gift": true, "wrap": "red"}',
NULL
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"DELIVERY"
) VALUES (
3,
1,
'cancelled',
12.50,
1,
TIMESTAMP '2024-03-03 09:45:00',
NULL,
'Customer changed their mind',
NULL,
NULL
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"DELIVERY"
) VALUES (
4,
4,
'shipped',
980.00,
12,
TIMESTAMP '2024-03-05 02:10:00',
TIMESTAMP '2024-03-07 08:00:00',
'请小心轻放',
'{"fragile": true}',
'2 days 05:50:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"DELIVERY"
) VALUES (
5,
5,
'pending',
45.75,
2,
TIMESTAMP '2024-03-08 17:20:00',
NULL,
'Leave at the door; ring twice',
NULL,
NULL
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"DELIVERY"
) VALUES (
6,
6,
'shipped',
310.40,
5,
TIMESTAMP '2024-03-10 13:00:00',
TIMESTAMP '2024-03-11 09:00:00',
'Fragile: "glass"',
'{"fragile": true}',
'20:00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"DELIVERY"
) VALUES (
7,
8,
'paid',
76.20,
2,
TIMESTAMP '2024-03-11 18:45:00',
NULL,
NULL,
NULL,
NULL
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"DELIVERY"
) VALUES (
8,
2,
'shipped',
19.99,
1,
TIMESTAMP '2024-03-12 08:00:00',
NULL,
'Shipped date set to infinity by an old import',
NULL,
NULL
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"DELIVERY"
) VALUES (
9,
3,
'shipped',
64.00,
2,
TIMESTAMP '2024-03-14 15:30:00',
TIMESTAMP '2024-03-15 10:00:00',
'Two parcels',
'{"parcels": [1, 2]}',
'18:30:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"DELIVERY"
) VALUES (
10,
7,
'paid',
1499.00,
1,
TIMESTAMP '2024-03-15 21:05:00',
NULL,
'C:\Users\ravi\invoice.pdf',
NULL,
NULL
);
COMMIT;
END;
/

-- Keys, indexes, foreign keys, counters and triggers, after the rows.
ALTER TABLE "CUSTOMERS" ADD CONSTRAINT "UQ_CUSTOMERS_CUSTOMERS_EMAIL_KEY" UNIQUE ("EMAIL");
ALTER TABLE "CUSTOMERS" ADD CONSTRAINT "PK_CUSTOMERS" PRIMARY KEY ("ID");
ALTER TABLE "ORDERS" ADD CONSTRAINT "PK_ORDERS" PRIMARY KEY ("ID");
CREATE INDEX "IX_ORDERS_IDX_ORDERS_CUSTOMER" ON "ORDERS" ("CUSTOMER_ID");
CREATE INDEX "IX_ORDERS_IDX_ORDERS_STATUS_DATE" ON "ORDERS" ("STATUS", "ORDERED_AT");
ALTER TABLE "ORDERS" ADD CONSTRAINT "ORDERS_CUSTOMER_ID_FKEY" FOREIGN KEY ("CUSTOMER_ID") REFERENCES "CUSTOMERS" ("ID") ENABLE NOVALIDATE;
BEGIN
    EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" ENABLE VALIDATE CONSTRAINT "ORDERS_CUSTOMER_ID_FKEY"';
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Foreign key ' || '"ORDERS_CUSTOMER_ID_FKEY"' || ' 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 < 1001 THEN
        next_id := 1001;
    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 < 5001 THEN
        next_id := 5001;
    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;

Perbaikan

  1. "tags" di customers adalah text[], yang tidak ada di Oracle, jadi menjadi CLOB dengan nilai yang sama.
  2. "delivery" di orders adalah interval, yang tidak ada di Oracle, jadi menjadi VARCHAR2(100 CHAR) dengan nilai yang sama.

Perlu diperiksa

  • 1 view, trigger, rutin, atau event tidak dikonversi; laporan mencantumkan masing-masing. Buat ulang secara manual di Oracle.
  • Default "tags" di customers tidak bisa ditulis untuk Oracle (a value its type can't hold), jadi kolom itu tanpa default. Tambahkan default secara manual jika baris baru memerlukannya.
  • Indeks idx_orders_details pada orders memakai ekspresi yang tidak bisa ditulis untuk Oracle (a gin index), jadi tidak dibuat. Buat indeks secara manual jika kueri memerlukannya.
  • 1 nilai di "shipped_at" dari orders adalah tanggal yang tidak bisa disimpan Oracle, misalnya infinity, jadi menjadi NULL. Oracle menyimpan tahun 1 sampai 9999 tanpa infinity; ganti tanggal itu di sumber jika penting.

File Anda dikonversi di komputer ini dan tidak pernah diunggah.

Contoh lain:

Yang berubah dari PostgreSQL ke Oracle

Setiap baris adalah aturan yang diterapkan konverter, beserta baris laporan yang ditulisnya saat aturan itu mengubah sesuatu di data Anda.

  • boolean

    NUMBER(1) dengan CHECK 0 dan 1

    Oracle 21c tidak punya tipe kolom boolean; 1 dan 0 menyimpan true dan false di setiap versi.

  • varchar(n), char(n)

    VARCHAR2(n CHAR), menghitung karakter

    Panjang dihitung dalam karakter, seperti di PostgreSQL.

  • text

    VARCHAR2(4000 CHAR) jika setiap nilai muat dalam 4000 byte (750 karakter dalam key), selain itu CLOB

    VARCHAR2 memuat 4000 byte secara default dan Oracle tidak bisa mengindeks CLOB, jadi teks tetap VARCHAR2 jika nilainya muat dan menjadi CLOB jika tidak.

    Baris laporan: text_as_lob

  • empty strings and empty bytea values

    NULL

    Oracle menyimpan string kosong sebagai NULL, jadi nilai ' terbaca kembali sebagai NULL. Laporan menghitungnya per kolom.

    Baris laporan: empty_string_null

  • citext

    perbandingan persis

    Oracle membandingkan teks secara persis kecuali diatur lain, seperti teks PostgreSQL; kolom citext tidak lagi mengabaikan huruf besar dan kecil.

    Baris laporan: case_insensitive_collation

  • numeric(p,s) past 38 digits; numeric without a precision

    NUMBER jika nilainya muat dalam 38 digit, selain itu VARCHAR2

    NUMBER di Oracle memuat 38 digit pada skala berapa pun. Angka yang lebih lebar disimpan sebagai teks agar setiap digit tetap persis.

    Baris laporan: decimal_as_text

  • money

    NUMBER(19,2)

    Oracle tidak punya tipe money. Jumlahnya disimpan sebagai angka, tanpa simbol mata uang yang ditambahkan locale server.

    Baris laporan: type_replaced

  • interval

    VARCHAR2(100 CHAR) berisi teks PostgreSQL

    Interval mencampur bulan dengan hari dan detik, yang disimpan Oracle dalam dua tipe berbeda; teksnya mempertahankan setiap bagian.

    Baris laporan: type_replaced

  • arrays (integer[], text[]...)

    CLOB berisi array JSON

    Oracle tidak punya array. Array JSON mempertahankan setiap elemen dan NULL, dan JSON_TABLE membacanya.

    Baris laporan: type_replaced

  • ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types

    VARCHAR2 atau CLOB berisi teks PostgreSQL

    Oracle tidak punya tipe yang setara, jadi setiap nilai mempertahankan teks yang ditulis PostgreSQL.

    Baris laporan: type_replaced

  • json, jsonb

    CLOB

    Fungsi JSON Oracle membaca JSON dari teks di setiap versi, dan CLOB memuat nilai dengan ukuran berapa pun.

  • timestamp

    TIMESTAMP

    timestamp tanpa zona waktu adalah pembacaan jam dinding, seperti TIMESTAMP di Oracle. date menjadi DATE, yang juga memuat jam yang tetap di tengah malam.

  • timestamp with time zone

    TIMESTAMP WITH TIME ZONE dalam UTC

    Setiap nilai ditulis dalam UTC, momen yang sama apa pun selisih yang ditulis dump.

  • time

    INTERVAL DAY TO SECOND sejak tengah malam

    Oracle tidak punya tipe jam dalam sehari; interval dari tengah malam memuat setiap nilai, termasuk 24:00:00.

  • infinity, -infinity, BC dates and years past 9999

    NULL

    Skrip menulis tahun 1 sampai 9999, dan Oracle tidak punya infinity. Nilai itu menjadi NULL dan laporan menghitungnya.

    Baris laporan: date_out_of_range

  • NaN and Infinity in numeric

    NULL

    NUMBER di Oracle tidak punya NaN atau Infinity, jadi nilai itu menjadi NULL dan laporan menghitungnya.

    Baris laporan: invalid_value_null

  • NOT NULL columns with values that become NULL

    NOT NULL dihapus

    Kolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti.

    Baris laporan: not_null_relaxed

  • enum types

    VARCHAR2 dengan CHECK labelnya

    Teks dengan CHECK mempertahankan nilai yang sama.

  • enum columns holding values outside their labels

    VARCHAR2 tanpa CHECK

    Nilai yang tidak ada di label akan gagal di CHECK, jadi CHECK tidak dibuat.

    Baris laporan: enum_check_skipped

  • uuid, inet, cidr, macaddr

    VARCHAR2

    Oracle tidak punya tipe seperti itu; teksnya mempertahankan setiap nilai.

  • bytea

    BLOB

    Byte tetap byte.

  • bit(n), bit varying

    NUMBER dengan nilai bit hingga 63 bit; digit teks jika lebih

    String bit disimpan sebagai angka yang dibentuk bit-bitnya.

  • oid, xid, cid

    NUMBER(10) dengan CHECK bahwa nilainya tidak negatif

    NUMBER memuat setiap nilai.

  • serial, identity

    GENERATED BY DEFAULT ON NULL AS IDENTITY, berlanjut setelah id tertinggi

    Id yang disalin dimuat apa adanya, dan penghitung berlanjut setelah id tertinggi atau nilai berikutnya dari sequence, mana yang lebih tinggi.

  • a second serial or identity column in a table

    bilangan bulat biasa

    Oracle menghitung satu kolom identity per tabel; kolom lain mempertahankan nilainya tanpa penghitung.

    Baris laporan: counter_dropped

  • sequences not owned by a column

    CREATE SEQUENCE, pada nilai yang sudah dicapainya

    Sequence Oracle bekerja dengan cara yang sama.

  • generated columns

    kolom virtual

    Oracle menghitung kolom generated hanya saat dibaca; kolom STORED menjadi virtual dengan nilai yang sama.

    Baris laporan: stored_as_virtual

  • generated columns with functions Oracle lacks

    kolom biasa berisi nilainya

    Rumus yang tidak bisa ditulis untuk Oracle menyisakan kolom biasa berisi nilai dari dump dan satu baris laporan.

    Baris laporan: generated_not_translated

  • defaults with functions Oracle lacks, and defaults from a sequence

    tanpa default

    Default yang tidak bisa ditulis untuk Oracle dihilangkan dan dilaporkan.

    Baris laporan: default_not_translated

  • CHECK constraints

    diterjemahkan, langsung di CREATE TABLE

    CHECK di dalam tabel diuji saat setiap baris dimuat.

  • CHECK constraints with functions Oracle lacks

    tidak dibuat

    CHECK yang tidak bisa ditulis untuk Oracle dihilangkan dan dilaporkan.

    Baris laporan: check_skipped

  • CHECK ... NOT VALID

    tidak dibuat

    PostgreSQL tidak pernah memeriksa baris yang sudah ada sebelumnya, jadi baris itu bisa melanggarnya.

    Baris laporan: check_not_valid

  • gin, gist, brin and hash indexes, partial and expression indexes, and indexes on CLOB columns

    tidak dibuat

    IntoSQL menulis indeks b-tree pada kolom untuk Oracle, yang tidak bisa mengindeks CLOB; buat ulang indeks lainnya setelah pemuatan.

    Baris laporan: index_skipped

  • foreign keys

    setelah data ENABLE NOVALIDATE, lalu divalidasi dengan peringatan untuk baris tanpa induk

    Key langsung memeriksa baris baru dan divalidasi terakhir; baris tanpa induk membuatnya tetap tidak tervalidasi dengan peringatan, bukan menghentikan pemuatan.

  • ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT

    dihapus

    Foreign key di Oracle hanya bertindak saat penghapusan, dengan CASCADE atau SET NULL.

    Baris laporan: foreign_key_action_unsupported

  • foreign keys to tables the dump doesn't create

    tidak dibuat

    Key tidak bisa merujuk ke tabel yang tidak ada.

    Baris laporan: foreign_key_skipped

  • names over 128 bytes

    dipersingkat

    Nama di Oracle 12.2 dan yang lebih baru memuat 128 byte, lebih dari 63 di PostgreSQL.

    Baris laporan: name_shortened

  • partitioned tables

    satu tabel dengan baris dari setiap partisi

    Barisnya sama; partisi ulang tabel di Oracle jika diperlukan.

    Baris laporan: partitions_dropped

  • schemas

    satu skema, nama tabel diawali nama skemanya

    Skrip dimuat ke skema pengguna yang menjalankannya, jadi tabel dari skema berbeda diawali nama skemanya; tabel di public mempertahankan namanya.

    Baris laporan: schemas_merged

  • views, functions, procedures, triggers, rules, policies, extensions and types

    dicantumkan di laporan

    Kodenya ditulis dalam bahasa PostgreSQL, jadi dicantumkan agar Anda buat ulang.

    Baris laporan: not_converted_objects

  • dumps without CREATE TABLE (--data-only)

    tipe dibaca dari nilainya

    Dump yang hanya berisi data hanya punya baris, jadi tipenya berasal dari nilainya.

    Baris laporan: no_schema

  • expressions in INSERT values

    NULL

    Konverter yang tidak menjalankan database tidak bisa mengevaluasinya.

    Baris laporan: expression_value

  • types IntoSQL doesn't know

    CLOB

    Teks memuat nilai apa pun; ubah tipenya setelah pemuatan.

    Baris laporan: unknown_type

  • text that isn't valid in its encoding

    byte yang rusak menjadi karakter pengganti

    Skrip berupa UTF-8 dan dimuat dengan NLS_LANG=.AL32UTF8.

    Baris laporan: invalid_utf8_replaced

  • text decoded twice (ñ)

    disalin apa adanya

    Dump berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya.

    Baris laporan: mojibake_suspected

Di PostgreSQLDi OracleBaris laporan
booleanNUMBER(1) dengan CHECK 0 dan 1Oracle 21c tidak punya tipe kolom boolean; 1 dan 0 menyimpan true dan false di setiap versi.
varchar(n), char(n)VARCHAR2(n CHAR), menghitung karakterPanjang dihitung dalam karakter, seperti di PostgreSQL.
textVARCHAR2(4000 CHAR) jika setiap nilai muat dalam 4000 byte (750 karakter dalam key), selain itu CLOBVARCHAR2 memuat 4000 byte secara default dan Oracle tidak bisa mengindeks CLOB, jadi teks tetap VARCHAR2 jika nilainya muat dan menjadi CLOB jika tidak.text_as_lob
empty strings and empty bytea valuesNULLOracle menyimpan string kosong sebagai NULL, jadi nilai ' terbaca kembali sebagai NULL. Laporan menghitungnya per kolom.empty_string_null
citextperbandingan persisOracle membandingkan teks secara persis kecuali diatur lain, seperti teks PostgreSQL; kolom citext tidak lagi mengabaikan huruf besar dan kecil.case_insensitive_collation
numeric(p,s) past 38 digits; numeric without a precisionNUMBER jika nilainya muat dalam 38 digit, selain itu VARCHAR2NUMBER di Oracle memuat 38 digit pada skala berapa pun. Angka yang lebih lebar disimpan sebagai teks agar setiap digit tetap persis.decimal_as_text
moneyNUMBER(19,2)Oracle tidak punya tipe money. Jumlahnya disimpan sebagai angka, tanpa simbol mata uang yang ditambahkan locale server.type_replaced
intervalVARCHAR2(100 CHAR) berisi teks PostgreSQLInterval mencampur bulan dengan hari dan detik, yang disimpan Oracle dalam dua tipe berbeda; teksnya mempertahankan setiap bagian.type_replaced
arrays (integer[], text[]...)CLOB berisi array JSONOracle tidak punya array. Array JSON mempertahankan setiap elemen dan NULL, dan JSON_TABLE membacanya.type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension typesVARCHAR2 atau CLOB berisi teks PostgreSQLOracle tidak punya tipe yang setara, jadi setiap nilai mempertahankan teks yang ditulis PostgreSQL.type_replaced
json, jsonbCLOBFungsi JSON Oracle membaca JSON dari teks di setiap versi, dan CLOB memuat nilai dengan ukuran berapa pun.
timestampTIMESTAMPtimestamp tanpa zona waktu adalah pembacaan jam dinding, seperti TIMESTAMP di Oracle. date menjadi DATE, yang juga memuat jam yang tetap di tengah malam.
timestamp with time zoneTIMESTAMP WITH TIME ZONE dalam UTCSetiap nilai ditulis dalam UTC, momen yang sama apa pun selisih yang ditulis dump.
timeINTERVAL DAY TO SECOND sejak tengah malamOracle tidak punya tipe jam dalam sehari; interval dari tengah malam memuat setiap nilai, termasuk 24:00:00.
infinity, -infinity, BC dates and years past 9999NULLSkrip menulis tahun 1 sampai 9999, dan Oracle tidak punya infinity. Nilai itu menjadi NULL dan laporan menghitungnya.date_out_of_range
NaN and Infinity in numericNULLNUMBER di Oracle tidak punya NaN atau Infinity, jadi nilai itu menjadi NULL dan laporan menghitungnya.invalid_value_null
NOT NULL columns with values that become NULLNOT NULL dihapusKolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti.not_null_relaxed
enum typesVARCHAR2 dengan CHECK labelnyaTeks dengan CHECK mempertahankan nilai yang sama.
enum columns holding values outside their labelsVARCHAR2 tanpa CHECKNilai yang tidak ada di label akan gagal di CHECK, jadi CHECK tidak dibuat.enum_check_skipped
uuid, inet, cidr, macaddrVARCHAR2Oracle tidak punya tipe seperti itu; teksnya mempertahankan setiap nilai.
byteaBLOBByte tetap byte.
bit(n), bit varyingNUMBER dengan nilai bit hingga 63 bit; digit teks jika lebihString bit disimpan sebagai angka yang dibentuk bit-bitnya.
oid, xid, cidNUMBER(10) dengan CHECK bahwa nilainya tidak negatifNUMBER memuat setiap nilai.
serial, identityGENERATED BY DEFAULT ON NULL AS IDENTITY, berlanjut setelah id tertinggiId yang disalin dimuat apa adanya, dan penghitung berlanjut setelah id tertinggi atau nilai berikutnya dari sequence, mana yang lebih tinggi.
a second serial or identity column in a tablebilangan bulat biasaOracle menghitung satu kolom identity per tabel; kolom lain mempertahankan nilainya tanpa penghitung.counter_dropped
sequences not owned by a columnCREATE SEQUENCE, pada nilai yang sudah dicapainyaSequence Oracle bekerja dengan cara yang sama.
generated columnskolom virtualOracle menghitung kolom generated hanya saat dibaca; kolom STORED menjadi virtual dengan nilai yang sama.stored_as_virtual
generated columns with functions Oracle lackskolom biasa berisi nilainyaRumus yang tidak bisa ditulis untuk Oracle menyisakan kolom biasa berisi nilai dari dump dan satu baris laporan.generated_not_translated
defaults with functions Oracle lacks, and defaults from a sequencetanpa defaultDefault yang tidak bisa ditulis untuk Oracle dihilangkan dan dilaporkan.default_not_translated
CHECK constraintsditerjemahkan, langsung di CREATE TABLECHECK di dalam tabel diuji saat setiap baris dimuat.
CHECK constraints with functions Oracle lackstidak dibuatCHECK yang tidak bisa ditulis untuk Oracle dihilangkan dan dilaporkan.check_skipped
CHECK ... NOT VALIDtidak dibuatPostgreSQL tidak pernah memeriksa baris yang sudah ada sebelumnya, jadi baris itu bisa melanggarnya.check_not_valid
gin, gist, brin and hash indexes, partial and expression indexes, and indexes on CLOB columnstidak dibuatIntoSQL menulis indeks b-tree pada kolom untuk Oracle, yang tidak bisa mengindeks CLOB; buat ulang indeks lainnya setelah pemuatan.index_skipped
foreign keyssetelah data ENABLE NOVALIDATE, lalu divalidasi dengan peringatan untuk baris tanpa indukKey langsung memeriksa baris baru dan divalidasi terakhir; baris tanpa induk membuatnya tetap tidak tervalidasi dengan peringatan, bukan menghentikan pemuatan.
ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULTdihapusForeign key di Oracle hanya bertindak saat penghapusan, dengan CASCADE atau SET NULL.foreign_key_action_unsupported
foreign keys to tables the dump doesn't createtidak dibuatKey tidak bisa merujuk ke tabel yang tidak ada.foreign_key_skipped
names over 128 bytesdipersingkatNama di Oracle 12.2 dan yang lebih baru memuat 128 byte, lebih dari 63 di PostgreSQL.name_shortened
partitioned tablessatu tabel dengan baris dari setiap partisiBarisnya sama; partisi ulang tabel di Oracle jika diperlukan.partitions_dropped
schemassatu skema, nama tabel diawali nama skemanyaSkrip dimuat ke skema pengguna yang menjalankannya, jadi tabel dari skema berbeda diawali nama skemanya; tabel di public mempertahankan namanya.schemas_merged
views, functions, procedures, triggers, rules, policies, extensions and typesdicantumkan di laporanKodenya ditulis dalam bahasa PostgreSQL, jadi dicantumkan agar Anda buat ulang.not_converted_objects
dumps without CREATE TABLE (--data-only)tipe dibaca dari nilainyaDump yang hanya berisi data hanya punya baris, jadi tipenya berasal dari nilainya.no_schema
expressions in INSERT valuesNULLKonverter yang tidak menjalankan database tidak bisa mengevaluasinya.expression_value
types IntoSQL doesn't knowCLOBTeks memuat nilai apa pun; ubah tipenya setelah pemuatan.unknown_type
text that isn't valid in its encodingbyte yang rusak menjadi karakter penggantiSkrip berupa UTF-8 dan dimuat dengan NLS_LANG=.AL32UTF8.invalid_utf8_replaced
text decoded twice (ñ)disalin apa adanyaDump berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya.mojibake_suspected

Muat skrip ke Oracle

Skrip membuat tabel, menyalin baris, lalu menambahkan kunci, indeks, dan foreign key, jadi pemuatan berjalan cepat dan berhenti di galat pertama.

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

Foreign key ditambahkan ENABLE NOVALIDATE, jadi baris baru langsung diperiksa, lalu divalidasi. Jika baris lama merujuk ke baris yang tidak ada, skrip menyebutkan constraint mana dan membiarkannya tidak tervalidasi, bukan gagal di tengah jalan.

Untuk dump yang besar, jalankan SQL*Plus di mesin yang sama dengan database. Skrip melakukan commit setiap 100 baris. Pengguna yang menjalankannya memerlukan CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER, dan CREATE PROCEDURE, serta kuota di tablespace-nya.

Buat dump PostgreSQL untuk hasil terbaik

Konverter membaca apa yang ada di dump. Opsi berikut membuat lebih banyak data Anda tetap ada di dalamnya:

  • --format=plain, default pg_dump, menulis SQL. Arsip custom atau directory (-Fc, -Fd) menjadi SQL dengan pg_restore -f dump.sql, tanpa server database.
  • --no-owner --no-privileges menghilangkan role dan grant, yang memang dilewati konverter, jadi dump lebih kecil.
  • pg_dumpall menyimpan setiap database dalam satu file; tabel masing-masing diberi nama sesuai database-nya, jadi tidak ada yang bentrok.

Yang tidak dikonversi

View, materialized view, fungsi, prosedur, trigger, rule, kebijakan keamanan baris, ekstensi, dan tipe ditulis dalam bahasa PostgreSQL sendiri. Semuanya dicantumkan di laporan berdasarkan nama, tidak pernah dibuang diam-diam, sehingga Anda bisa menulis ulang untuk Oracle.

Pertanyaan tentang PostgreSQL ke Oracle

Tidak terjawab di sini? Tulis ke kami dari halaman kontak, dan seseorang akan membalas. Halaman kontak

Apakah dump saya diunggah?

Tidak. Konverter berjalan di browser Anda dan membaca dump dari disk Anda sepotong demi sepotong, jadi dump tidak pernah meninggalkan komputer Anda. Aplikasi desktop dan command line juga mengonversi di komputer Anda.

Seberapa besar dump yang bisa dipakai?

Konverter tidak pernah menyimpan seluruh dump di memori: file dibaca dua kali, per rentang, dan skrip ditulis sambil berjalan. Dump berukuran beberapa gigabyte bisa dikonversi di browser, di aplikasi desktop, dan dengan command line.

Apakah arsip pg_dump -Fc bisa dibaca?

Tidak langsung: arsip custom adalah format biner. pg_restore -f dump.sql dump.backup mengubahnya menjadi SQL plain yang dibaca konverter, tanpa terhubung ke server. Konverter memberi tahu saat menerima arsip.

Dump dari versi PostgreSQL mana yang bisa dipakai?

Dump yang ditulis pg_dump dan pg_dumpall dari PostgreSQL 10 ke atas, dengan baris COPY atau INSERT. Setiap dump uji berasal dari PostgreSQL 13 dan 18 dan dibandingkan dengan sumbernya sel demi sel.

Apakah nilai serial dan identity dipertahankan?

Ya. Kolom serial atau identity setiap tabel menjadi kolom identity, setiap baris mempertahankan id-nya, dan id berikutnya berlanjut setelah id tertinggi. Sequence yang tidak dimiliki kolom menjadi sequence Oracle pada nilai yang sudah dicapainya.

Apa yang terjadi pada array, enum, dan tipe PostgreSQL lainnya?

Array menjadi array JSON, boolean menjadi NUMBER(1), timestamp dengan zona waktu menjadi TIMESTAMP WITH TIME ZONE, dan teks menjadi VARCHAR2 jika nilainya muat, selain itu CLOB. String kosong menjadi NULL, seperti yang disimpan Oracle, dan laporan menghitungnya.

Bagaimana dengan fungsi, trigger, dan view?

Semuanya dicantumkan di laporan berdasarkan nama dan tidak dikonversi, karena setiap database menulisnya dalam bahasanya sendiri.

Di versi Oracle mana skrip bisa dimuat?

Oracle 19c dan yang lebih baru. Setiap dump uji dimuat di 21c dan 23ai, dan berhenti di galat pertama jika ada yang salah.