İçeriğe geç
IntoSQL ana sayfası

PostgreSQL - Oracle dönüştürme

pg_dump veya pg_dumpall ile alınmış düz bir dökümü .sql veya .sql.gz olarak bırakın ve aynı tablolar, anahtarlar, indeksler ve verilerle bir Oracle betiği indirin. Oracle'in olduğu gibi tutamadığı her değer ve taşımadığı her nesne raporda listelenir.

Dosyanız
sqlshop_2024_postgres.sqlÖrnek dosya, 6,2 kB
Veritabanınız

18 satır dönüştürüldü, 2 düzeltme, reddedilen yok

Göster

shop_2024_postgres.sql içindeki tablolarPostgreSQL 18.6 dökümü · pg_dump ile yazıldı · utf8mb4

  • customersCUSTOMERS olarak yazıldı8 satır1
    8 sütun
    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
  • ordersORDERS olarak yazıldı10 satır1
    10 sütun
    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)

Dönüştürülmedi

  • Görünüm paid_orders

Her veritabanı bunları kendi dilinde yazar. Bunları Oracle için yeniden yazın.

-- 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;

Düzeltmeler

  1. customers tablosunun "tags" sütunu text[]; Oracle içinde bu tür yok, bu yüzden aynı değerlerle CLOB olur.
  2. orders tablosunun "delivery" sütunu interval; Oracle içinde bu tür yok, bu yüzden aynı değerlerle VARCHAR2(100 CHAR) olur.

Kontrol edilmeli

  • 1 görünüm, tetikleyici, rutin veya olay dönüştürülmedi; rapor her birini listeliyor. Bunları Oracle'de elle yeniden oluşturun.
  • customers tablosundaki "tags" sütununun varsayılan değeri Oracle için yazılamıyor (a value its type can't hold); bu yüzden sütunun varsayılan değeri yok. Yeni satırlar gerektiriyorsa varsayılan değeri elle ekleyin.
  • orders üzerindeki idx_orders_details indeksi Oracle için yazılamayan bir ifade kullanıyor (a gin index); bu yüzden oluşturulmadı. Sorgular gerektiriyorsa indeksi elle oluşturun.
  • orders tablosunun "shipped_at" sütunundaki 1 değer, infinity gibi Oracle'in saklayamadığı bir tarih; bu yüzden NULL yapıldı. Oracle sonsuzluk olmadan 1 ile 9999 arası yılları saklar; bu tarihler önemliyse kaynakta değiştirin.

Dosyan bu bilgisayarda dönüştürülür ve asla yüklenmez.

Diğer örnekler:

PostgreSQL ile Oracle arasında neler değişir

Her satır, dönüştürücünün uyguladığı bir kuraldır; yanında, kural verilerinizde bir şeyi değiştirdiğinde yazılan rapor satırı yer alır.

  • boolean

    0 ve 1'i denetleyen bir CHECK ile NUMBER(1)

    Oracle 21c'de boolean sütun türü yoktur; 1 ve 0 her sürümde true ve false'u korur.

  • varchar(n), char(n)

    karakter sayan VARCHAR2(n CHAR)

    Uzunluklar PostgreSQL'deki gibi karakter sayar.

  • text

    her değer 4000 bayta sığıyorsa (anahtarda 750 karakter) VARCHAR2(4000 CHAR), değilse CLOB

    Bir VARCHAR2 varsayılan olarak 4000 bayt tutar ve Oracle bir CLOB'u indeksleyemez; bu yüzden metin, değerleri sığıyorsa VARCHAR2 olarak kalır, sığmıyorsa CLOB olur.

    Rapor satırı: text_as_lob

  • empty strings and empty bytea values

    NULL

    Oracle boş bir dizeyi NULL olarak saklar, bu yüzden ' olan bir değer NULL olarak okunur. Rapor bunları sütun başına sayar.

    Rapor satırı: empty_string_null

  • citext

    tam karşılaştırma

    Oracle, PostgreSQL'in metni gibi, aksi belirtilmedikçe metni tam karşılaştırır; citext sütunları büyük/küçük harfi yok saymayı kaybeder.

    Rapor satırı: case_insensitive_collation

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

    değerleri 38 basamağa sığıyorsa NUMBER, değilse VARCHAR2

    Oracle'ın NUMBER türü her ölçekte 38 basamak tutar. Daha geniş sayılar her basamak tam kalsın diye metin olarak korunur.

    Rapor satırı: decimal_as_text

  • money

    NUMBER(19,2)

    Oracle'da para türü yoktur. Tutar, sunucunun yerel ayarının eklediği para birimi simgesi olmadan sayı olarak korunur.

    Rapor satırı: type_replaced

  • interval

    PostgreSQL'in metniyle VARCHAR2(100 CHAR)

    Bir interval ayları gün ve saniyelerle karıştırır, Oracle bunları iki farklı türde tutar; metin her parçayı korur.

    Rapor satırı: type_replaced

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

    JSON dizisiyle CLOB

    Oracle'da dizi yoktur. Bir JSON dizisi her öğeyi ve NULL'u korur ve JSON_TABLE onu okur.

    Rapor satırı: type_replaced

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

    PostgreSQL'in metniyle VARCHAR2 veya CLOB

    Oracle'da karşılık gelen bir tür yoktur, bu yüzden her değer PostgreSQL'in yazdığı metni korur.

    Rapor satırı: type_replaced

  • json, jsonb

    CLOB

    Oracle'ın JSON fonksiyonları her sürümde JSON'u metinden okur ve bir CLOB her boyuttaki değeri tutar.

  • timestamp

    TIMESTAMP

    Saat dilimi olmayan bir timestamp, Oracle'ın TIMESTAMP türü gibi bir duvar saati okumasıdır. date, DATE olur; bu tür gece yarısında kalan bir günün saatini de tutar.

  • timestamp with time zone

    UTC'de TIMESTAMP WITH TIME ZONE

    Her değer UTC'de yazılır; döküm hangi farkı yazmış olursa olsun an aynıdır.

  • time

    gece yarısından itibaren INTERVAL DAY TO SECOND

    Oracle'da günün saati türü yoktur; gece yarısından itibaren bir interval, 24:00:00 dahil, her değeri tutar.

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

    NULL

    Betik 1 ile 9999 arası yılları yazar ve Oracle'da sonsuzluk yoktur. Bu değerler NULL olur ve rapor onları sayar.

    Rapor satırı: date_out_of_range

  • NaN and Infinity in numeric

    NULL

    Oracle'ın NUMBER türünde NaN veya Infinity yoktur, bu yüzden bu değerler NULL olur ve rapor onları sayar.

    Rapor satırı: invalid_value_null

  • NOT NULL columns with values that become NULL

    NOT NULL kaldırılır

    Değerleri NULL olmak zorunda kalan bir sütun NOT NULL kısıtını koruyamaz, yoksa yükleme durur.

    Rapor satırı: not_null_relaxed

  • enum types

    etiketlerini denetleyen bir CHECK ile VARCHAR2

    CHECK ile metin aynı değerleri korur.

  • enum columns holding values outside their labels

    CHECK olmadan VARCHAR2

    Etiketlerde adı geçmeyen değerler CHECK'ten geçemez; bu yüzden CHECK oluşturulmaz.

    Rapor satırı: enum_check_skipped

  • uuid, inet, cidr, macaddr

    VARCHAR2

    Oracle'da bu türler yoktur; metin her değeri korur.

  • bytea

    BLOB

    Baytlar bayt olarak kalır.

  • bit(n), bit varying

    63 bite kadar bitlerin değeriyle NUMBER; ötesi metin basamakları

    Bit dizileri, bitlerinin oluşturduğu sayı olarak saklanır.

  • oid, xid, cid

    negatif olmadığını denetleyen bir CHECK ile NUMBER(10)

    NUMBER her değeri tutar.

  • serial, identity

    en yüksek id'den sonra devam eden GENERATED BY DEFAULT ON NULL AS IDENTITY

    Kopyalanan id'ler olduğu gibi yüklenir ve sayaç, en yüksek id'den veya sequence'ın sonraki değerinden (hangisi büyükse) sonra devam eder.

  • a second serial or identity column in a table

    düz bir tam sayı

    Oracle tablo başına tek kimlik sütunu sayar; diğerleri değerlerini sayaçsız korur.

    Rapor satırı: counter_dropped

  • sequences not owned by a column

    ulaştığı değerden CREATE SEQUENCE

    Oracle sequence nesneleri aynı şekilde çalışır.

  • generated columns

    sanal sütunlar

    Oracle üretilen sütunları yalnızca okurken hesaplar; STORED sütunlar aynı değerlerle sanal olur.

    Rapor satırı: stored_as_virtual

  • generated columns with functions Oracle lacks

    değerleriyle düz bir sütun

    Oracle için yazılamayan bir formül, dökümün değerleriyle düz bir sütun ve bir rapor satırı bırakır.

    Rapor satırı: generated_not_translated

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

    varsayılan değer yok

    Oracle için yazılamayan bir varsayılan değer dışarıda bırakılır ve raporlanır.

    Rapor satırı: default_not_translated

  • CHECK constraints

    çevrilir, CREATE TABLE içinde satır içi

    Satır içi CHECK kısıtları her satır yüklenirken test edilir.

  • CHECK constraints with functions Oracle lacks

    oluşturulmaz

    Oracle için yazılamayan bir CHECK kısıtı dışarıda bırakılır ve raporlanır.

    Rapor satırı: check_skipped

  • CHECK ... NOT VALID

    oluşturulmaz

    PostgreSQL daha önce var olan satırları hiç denetlemedi, bu yüzden satırlar onu ihlal edebilir.

    Rapor satırı: check_not_valid

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

    oluşturulmaz

    IntoSQL, CLOB indeksleyemeyen Oracle için sütunlar üzerinde b-tree indeksleri yazar; diğerlerini yüklemeden sonra yeniden oluşturun.

    Rapor satırı: index_skipped

  • foreign keys

    veriden sonra ENABLE NOVALIDATE, ardından yetim satırlar için uyarıyla doğrulanır

    Anahtar yeni satırları hemen denetler ve en son doğrulanır; üst satırı olmayan satırlar varsa yüklemeyi durdurmak yerine anahtar bir uyarıyla doğrulanmamış kalır.

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

    kaldırılır

    Oracle'ın yabancı anahtarları yalnızca silmede, CASCADE veya SET NULL ile işlem yapar.

    Rapor satırı: foreign_key_action_unsupported

  • foreign keys to tables the dump doesn't create

    oluşturulmaz

    Bir anahtar, var olmayan bir tabloya başvuramaz.

    Rapor satırı: foreign_key_skipped

  • names over 128 bytes

    kısaltılır

    Oracle 12.2 ve sonrasında adlar 128 bayt tutar, PostgreSQL'in 63 baytından fazla.

    Rapor satırı: name_shortened

  • partitioned tables

    her bölümün satırlarını içeren tek tablo

    Satırlar aynıdır; gerekiyorsa tabloyu Oracle'da yeniden bölümleyin.

    Rapor satırı: partitions_dropped

  • schemas

    tek şema, tabloların adı önce şemalarının adıyla başlar

    Betik, onu çalıştıran kullanıcının şemasına yüklenir; bu yüzden farklı şemaların tablolarının başına şemanın adı eklenir; public içindeki tablolar adlarını korur.

    Rapor satırı: schemas_merged

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

    raporda listelenir

    Kodları PostgreSQL'in dilinde yazılmıştır, bu yüzden yeniden oluşturmanız için listelenirler.

    Rapor satırı: not_converted_objects

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

    değerlerden okunan türler

    Yalnızca veri içeren bir dökümde yalnızca satırlar vardır, bu yüzden türler değerlerden gelir.

    Rapor satırı: no_schema

  • expressions in INSERT values

    NULL

    Veritabanı çalıştırmayan bir dönüştürücü bunları hesaplayamaz.

    Rapor satırı: expression_value

  • types IntoSQL doesn't know

    CLOB

    Metin her değeri tutar; yüklemeden sonra türü değiştirin.

    Rapor satırı: unknown_type

  • text that isn't valid in its encoding

    hatalı baytlar yerine koyma karakteri olarak

    Betik UTF-8'dir ve NLS_LANG=.AL32UTF8 ile yüklenir.

    Rapor satırı: invalid_utf8_replaced

  • text decoded twice (ñ)

    olduğu gibi kopyalanır

    Döküm tam olarak bu karakterleri içerir, bu yüzden kopyalanırlar; rapor onları gösterir.

    Rapor satırı: mojibake_suspected

PostgreSQL içindeOracle içindeRapor satırı
boolean0 ve 1'i denetleyen bir CHECK ile NUMBER(1)Oracle 21c'de boolean sütun türü yoktur; 1 ve 0 her sürümde true ve false'u korur.
varchar(n), char(n)karakter sayan VARCHAR2(n CHAR)Uzunluklar PostgreSQL'deki gibi karakter sayar.
texther değer 4000 bayta sığıyorsa (anahtarda 750 karakter) VARCHAR2(4000 CHAR), değilse CLOBBir VARCHAR2 varsayılan olarak 4000 bayt tutar ve Oracle bir CLOB'u indeksleyemez; bu yüzden metin, değerleri sığıyorsa VARCHAR2 olarak kalır, sığmıyorsa CLOB olur.text_as_lob
empty strings and empty bytea valuesNULLOracle boş bir dizeyi NULL olarak saklar, bu yüzden ' olan bir değer NULL olarak okunur. Rapor bunları sütun başına sayar.empty_string_null
citexttam karşılaştırmaOracle, PostgreSQL'in metni gibi, aksi belirtilmedikçe metni tam karşılaştırır; citext sütunları büyük/küçük harfi yok saymayı kaybeder.case_insensitive_collation
numeric(p,s) past 38 digits; numeric without a precisiondeğerleri 38 basamağa sığıyorsa NUMBER, değilse VARCHAR2Oracle'ın NUMBER türü her ölçekte 38 basamak tutar. Daha geniş sayılar her basamak tam kalsın diye metin olarak korunur.decimal_as_text
moneyNUMBER(19,2)Oracle'da para türü yoktur. Tutar, sunucunun yerel ayarının eklediği para birimi simgesi olmadan sayı olarak korunur.type_replaced
intervalPostgreSQL'in metniyle VARCHAR2(100 CHAR)Bir interval ayları gün ve saniyelerle karıştırır, Oracle bunları iki farklı türde tutar; metin her parçayı korur.type_replaced
arrays (integer[], text[]...)JSON dizisiyle CLOBOracle'da dizi yoktur. Bir JSON dizisi her öğeyi ve NULL'u korur ve JSON_TABLE onu okur.type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension typesPostgreSQL'in metniyle VARCHAR2 veya CLOBOracle'da karşılık gelen bir tür yoktur, bu yüzden her değer PostgreSQL'in yazdığı metni korur.type_replaced
json, jsonbCLOBOracle'ın JSON fonksiyonları her sürümde JSON'u metinden okur ve bir CLOB her boyuttaki değeri tutar.
timestampTIMESTAMPSaat dilimi olmayan bir timestamp, Oracle'ın TIMESTAMP türü gibi bir duvar saati okumasıdır. date, DATE olur; bu tür gece yarısında kalan bir günün saatini de tutar.
timestamp with time zoneUTC'de TIMESTAMP WITH TIME ZONEHer değer UTC'de yazılır; döküm hangi farkı yazmış olursa olsun an aynıdır.
timegece yarısından itibaren INTERVAL DAY TO SECONDOracle'da günün saati türü yoktur; gece yarısından itibaren bir interval, 24:00:00 dahil, her değeri tutar.
infinity, -infinity, BC dates and years past 9999NULLBetik 1 ile 9999 arası yılları yazar ve Oracle'da sonsuzluk yoktur. Bu değerler NULL olur ve rapor onları sayar.date_out_of_range
NaN and Infinity in numericNULLOracle'ın NUMBER türünde NaN veya Infinity yoktur, bu yüzden bu değerler NULL olur ve rapor onları sayar.invalid_value_null
NOT NULL columns with values that become NULLNOT NULL kaldırılırDeğerleri NULL olmak zorunda kalan bir sütun NOT NULL kısıtını koruyamaz, yoksa yükleme durur.not_null_relaxed
enum typesetiketlerini denetleyen bir CHECK ile VARCHAR2CHECK ile metin aynı değerleri korur.
enum columns holding values outside their labelsCHECK olmadan VARCHAR2Etiketlerde adı geçmeyen değerler CHECK'ten geçemez; bu yüzden CHECK oluşturulmaz.enum_check_skipped
uuid, inet, cidr, macaddrVARCHAR2Oracle'da bu türler yoktur; metin her değeri korur.
byteaBLOBBaytlar bayt olarak kalır.
bit(n), bit varying63 bite kadar bitlerin değeriyle NUMBER; ötesi metin basamaklarıBit dizileri, bitlerinin oluşturduğu sayı olarak saklanır.
oid, xid, cidnegatif olmadığını denetleyen bir CHECK ile NUMBER(10)NUMBER her değeri tutar.
serial, identityen yüksek id'den sonra devam eden GENERATED BY DEFAULT ON NULL AS IDENTITYKopyalanan id'ler olduğu gibi yüklenir ve sayaç, en yüksek id'den veya sequence'ın sonraki değerinden (hangisi büyükse) sonra devam eder.
a second serial or identity column in a tabledüz bir tam sayıOracle tablo başına tek kimlik sütunu sayar; diğerleri değerlerini sayaçsız korur.counter_dropped
sequences not owned by a columnulaştığı değerden CREATE SEQUENCEOracle sequence nesneleri aynı şekilde çalışır.
generated columnssanal sütunlarOracle üretilen sütunları yalnızca okurken hesaplar; STORED sütunlar aynı değerlerle sanal olur.stored_as_virtual
generated columns with functions Oracle lacksdeğerleriyle düz bir sütunOracle için yazılamayan bir formül, dökümün değerleriyle düz bir sütun ve bir rapor satırı bırakır.generated_not_translated
defaults with functions Oracle lacks, and defaults from a sequencevarsayılan değer yokOracle için yazılamayan bir varsayılan değer dışarıda bırakılır ve raporlanır.default_not_translated
CHECK constraintsçevrilir, CREATE TABLE içinde satır içiSatır içi CHECK kısıtları her satır yüklenirken test edilir.
CHECK constraints with functions Oracle lacksoluşturulmazOracle için yazılamayan bir CHECK kısıtı dışarıda bırakılır ve raporlanır.check_skipped
CHECK ... NOT VALIDoluşturulmazPostgreSQL daha önce var olan satırları hiç denetlemedi, bu yüzden satırlar onu ihlal edebilir.check_not_valid
gin, gist, brin and hash indexes, partial and expression indexes, and indexes on CLOB columnsoluşturulmazIntoSQL, CLOB indeksleyemeyen Oracle için sütunlar üzerinde b-tree indeksleri yazar; diğerlerini yüklemeden sonra yeniden oluşturun.index_skipped
foreign keysveriden sonra ENABLE NOVALIDATE, ardından yetim satırlar için uyarıyla doğrulanırAnahtar yeni satırları hemen denetler ve en son doğrulanır; üst satırı olmayan satırlar varsa yüklemeyi durdurmak yerine anahtar bir uyarıyla doğrulanmamış kalır.
ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULTkaldırılırOracle'ın yabancı anahtarları yalnızca silmede, CASCADE veya SET NULL ile işlem yapar.foreign_key_action_unsupported
foreign keys to tables the dump doesn't createoluşturulmazBir anahtar, var olmayan bir tabloya başvuramaz.foreign_key_skipped
names over 128 byteskısaltılırOracle 12.2 ve sonrasında adlar 128 bayt tutar, PostgreSQL'in 63 baytından fazla.name_shortened
partitioned tablesher bölümün satırlarını içeren tek tabloSatırlar aynıdır; gerekiyorsa tabloyu Oracle'da yeniden bölümleyin.partitions_dropped
schemastek şema, tabloların adı önce şemalarının adıyla başlarBetik, onu çalıştıran kullanıcının şemasına yüklenir; bu yüzden farklı şemaların tablolarının başına şemanın adı eklenir; public içindeki tablolar adlarını korur.schemas_merged
views, functions, procedures, triggers, rules, policies, extensions and typesraporda listelenirKodları PostgreSQL'in dilinde yazılmıştır, bu yüzden yeniden oluşturmanız için listelenirler.not_converted_objects
dumps without CREATE TABLE (--data-only)değerlerden okunan türlerYalnızca veri içeren bir dökümde yalnızca satırlar vardır, bu yüzden türler değerlerden gelir.no_schema
expressions in INSERT valuesNULLVeritabanı çalıştırmayan bir dönüştürücü bunları hesaplayamaz.expression_value
types IntoSQL doesn't knowCLOBMetin her değeri tutar; yüklemeden sonra türü değiştirin.unknown_type
text that isn't valid in its encodinghatalı baytlar yerine koyma karakteri olarakBetik UTF-8'dir ve NLS_LANG=.AL32UTF8 ile yüklenir.invalid_utf8_replaced
text decoded twice (ñ)olduğu gibi kopyalanırDöküm tam olarak bu karakterleri içerir, bu yüzden kopyalanırlar; rapor onları gösterir.mojibake_suspected

Betiği Oracle veritabanına yükleyin

Betik tabloları oluşturur, satırları kopyalar, ardından anahtarları, indeksleri ve yabancı anahtarları ekler; böylece hızlı yüklenir ve ilk hatada durur.

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

Yabancı anahtarlar ENABLE NOVALIDATE ile eklenir, böylece yeni satırlar hemen denetlenir, ardından doğrulanır. Eski bir satır var olmayan bir satıra işaret ediyorsa betik, yarı yolda başarısız olmak yerine hangi kısıt olduğunu söyler ve onu doğrulanmamış bırakır.

Büyük bir döküm için SQL*Plus'ı veritabanıyla aynı makinede çalıştırın. Betik her 100 satırda bir commit yapar. Betiği çalıştıran kullanıcının CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER ve CREATE PROCEDURE yetkilerine ve tablo alanında kotaya ihtiyacı vardır.

En iyi sonuç için PostgreSQL dökümü nasıl alınır

Dönüştürücü, dökümün içerdiğini okur. Bu seçenekler verilerinizin daha fazlasını dökümde tutar:

  • --format=plain, pg_dump'ın varsayılanı, SQL yazar. Custom veya directory arşivi (-Fc, -Fd), veritabanı sunucusu olmadan pg_restore -f dump.sql ile SQL'e çevrilir.
  • --no-owner --no-privileges rolleri ve yetkileri dışarıda bırakır; dönüştürücü bunları zaten atlar, böylece döküm küçülür.
  • pg_dumpall her veritabanını tek dosyaya döker; her birinin tablolarının adı onun adıyla başlar, böylece hiçbir şey çakışmaz.

Neler dönüştürülmez

Görünümler, somutlaştırılmış görünümler, fonksiyonlar, saklı yordamlar, tetikleyiciler, kurallar, satır güvenlik ilkeleri, eklentiler ve türler PostgreSQL'in kendi dilinde yazılır. Raporda adlarıyla listelenirler, asla sessizce atlanmazlar; böylece onları Oracle için yeniden yazabilirsiniz.

PostgreSQL - Oracle dönüştürme hakkında sorular

Yanıtınızı bulamadınız mı? İletişim sayfasından bize yazın, bir kişi yanıt verir. İletişim sayfası

Dökümüm yükleniyor mu?

Hayır. Dönüştürücü tarayıcınızda çalışır ve dökümü diskinizden parça parça okur; böylece döküm bilgisayarınızdan hiç çıkmaz. Masaüstü uygulaması ve komut satırı da bilgisayarınızda dönüştürür.

Döküm ne kadar büyük olabilir?

Dönüştürücü dökümün tamamını asla bellekte tutmaz: dosyayı aralıklar halinde iki kez okur ve betiği ilerledikçe yazar. Birkaç gigabaytlık dökümler tarayıcıda, masaüstü uygulamasında ve komut satırıyla dönüştürülür.

pg_dump -Fc arşivlerini okuyor mu?

Doğrudan değil: custom arşiv ikili bir biçimdir. pg_restore -f dump.sql dump.backup, bir sunucuya bağlanmadan onu dönüştürücünün okuduğu düz SQL'e çevirir. Dönüştürücü bir arşiv aldığında bunu söyler.

Döküm hangi PostgreSQL sürümlerinden gelebilir?

PostgreSQL 10 ve sonrasından pg_dump ve pg_dumpall ile yazılmış, COPY veya INSERT satırları içeren dökümler. Her test dökümü PostgreSQL 13 ve 18'den gelir ve kaynağıyla hücre hücre karşılaştırılır.

serial ve identity değerleri korunuyor mu?

Evet. Her tablonun serial veya identity sütunu bir kimlik sütunu olur, her satır kendi id'sini korur ve sonraki id en yüksek id'den sonra devam eder. Bir sütuna ait olmayan sequence'lar, ulaştıkları değerden Oracle sequence'ı olur.

Diziler, enum'lar ve diğer PostgreSQL türleri ne olur?

Diziler JSON dizisi, boolean'lar NUMBER(1), saat dilimli timestamp'ler TIMESTAMP WITH TIME ZONE, metin ise değerleri sığıyorsa VARCHAR2, değilse CLOB olur. Boş dizeler, Oracle onları öyle sakladığı için NULL olur ve rapor bunları sayar.

Fonksiyonlar, tetikleyiciler ve görünümler ne olur?

Raporda adlarıyla listelenirler ve dönüştürülmezler, çünkü her veritabanı onları kendi dilinde yazar.

Betik hangi Oracle sürümlerinde yüklenir?

Oracle 19c ve sonrası. Her test dökümü 21c ve 23ai üzerinde yüklenir ve bir sorun çıkarsa ilk hatada durur.