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.
18 satır dönüştürüldü, 2 düzeltme, reddedilen yok
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 ID NUMBER(10) not null NAME VARCHAR2(4000 CHAR) not null EMAIL VARCHAR2(750 CHAR) not null COUNTRY VARCHAR2(2 CHAR) not null IS_ACTIVE NUMBER(1) not null TAGS CLOB not null SIGNED_UP DATE CREATED_AT TIMESTAMP(6) WITH TIME ZONE not null ordersORDERS olarak yazıldı10 satır1
10 sütun ID NUMBER(10) not null CUSTOMER_ID NUMBER(10) not null STATUS VARCHAR2(9 CHAR) not null TOTAL NUMBER(10,2) not null ITEMS NUMBER(5) not null ORDERED_AT TIMESTAMP(6) not null SHIPPED_AT TIMESTAMP(6) NOTE VARCHAR2(4000 CHAR) DETAILS CLOB DELIVERY VARCHAR2(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
- customers tablosunun "tags" sütunu text[]; Oracle içinde bu tür yok, bu yüzden aynı değerlerle CLOB olur.
- 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çinde | Oracle içinde | Rapor satı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 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 values | NULLOracle 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 |
| citext | tam 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 precision | değ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 |
| 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. | 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. | 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 types | PostgreSQL'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, jsonb | CLOBOracle'ın JSON fonksiyonları her sürümde JSON'u metinden okur ve bir CLOB her boyuttaki değeri tutar. | |
| timestamp | TIMESTAMPSaat 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 ZONEHer 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 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 9999 | NULLBetik 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 numeric | NULLOracle'ı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 NULL | NOT 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 types | etiketlerini denetleyen bir CHECK ile VARCHAR2CHECK ile metin aynı değerleri korur. | |
| enum columns holding values outside their labels | CHECK olmadan VARCHAR2Etiketlerde adı geçmeyen değerler CHECK'ten geçemez; bu yüzden CHECK oluşturulmaz. | enum_check_skipped |
| uuid, inet, cidr, macaddr | VARCHAR2Oracle'da bu türler yoktur; metin her değeri korur. | |
| bytea | BLOBBaytlar 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 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 table | dü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 column | ulaştığı değerden CREATE SEQUENCEOracle sequence nesneleri aynı şekilde çalışır. | |
| generated columns | sanal 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 lacks | değ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 sequence | varsayı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 lacks | oluşturulmazOracle için yazılamayan bir CHECK kısıtı dışarıda bırakılır ve raporlanır. | check_skipped |
| CHECK ... NOT VALID | oluş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 columns | oluşturulmazIntoSQL, CLOB indeksleyemeyen Oracle için sütunlar üzerinde b-tree indeksleri yazar; diğerlerini yüklemeden sonra yeniden oluşturun. | index_skipped |
| foreign keys | veriden 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 DEFAULT | kaldı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 create | oluşturulmazBir anahtar, var olmayan bir tabloya başvuramaz. | foreign_key_skipped |
| names over 128 bytes | kısaltılırOracle 12.2 ve sonrasında adlar 128 bayt tutar, PostgreSQL'in 63 baytından fazla. | name_shortened |
| partitioned tables | her 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 |
| schemas | tek ş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 types | raporda 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 values | NULLVeritabanı çalıştırmayan bir dönüştürücü bunları hesaplayamaz. | expression_value |
| types IntoSQL doesn't know | CLOBMetin her değeri tutar; yüklemeden sonra türü değiştirin. | unknown_type |
| text that isn't valid in its encoding | hatalı 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.sqlYabancı 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.