İçeriğe geç
IntoSQL ana sayfası

SQL Server - Oracle dönüştürme

SSMS'in Generate Scripts aracının şema ve veriyle yazdığı betiği .sql veya .sql.gz, UTF-16 veya UTF-8 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_sqlserver.sqlÖrnek dosya, 11 kB
Veritabanınız

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

Göster

shop_2024_sqlserver.sql içindeki tablolarSQL Server dökümü · SQL Server Management Objects ile yazıldı · utf-8

  • ordersORDERS olarak yazıldı10 satır1
    11 sütun
    IDNUMBER(10) not null
    CUSTOMER_IDNUMBER(10) not null
    STATUSVARCHAR2(10 CHAR) not null
    TOTALNUMBER(19,4) not null
    ITEMSNUMBER(3) not null
    ORDERED_ATTIMESTAMP(0) not null
    SHIPPED_ATTIMESTAMP(7)
    NOTECLOB
    DETAILSCLOB
    ORDER_REFVARCHAR2(36 CHAR) not null
    TOTAL_WITH_TAXNUMBER(12,2)
  • customersCUSTOMERS olarak yazıldı8 satır1
    8 sütun
    IDNUMBER(10) not null
    NAMEVARCHAR2(100 CHAR) not null
    EMAILVARCHAR2(200 CHAR) not null
    COUNTRYVARCHAR2(2 CHAR) not null
    IS_ACTIVENUMBER(1) not null
    SIGNED_UPDATE
    CREATED_ATTIMESTAMP(0) WITH TIME ZONE not null
    ROW_VERSIONRAW(8)

Dönüştürülmedi

  • Görünüm paid_orders
  • Tetikleyici orders_no_negative

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

-- Written by IntoSQL from a SQL Server 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 "ORDERS" (
    "ID" NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1),
    "CUSTOMER_ID" NUMBER(10) NOT NULL,
    "STATUS" VARCHAR2(10 CHAR) DEFAULT 'pending' NOT NULL,
    "TOTAL" NUMBER(19,4) NOT NULL,
    "ITEMS" NUMBER(3) DEFAULT 1 NOT NULL,
    "ORDERED_AT" TIMESTAMP(0) NOT NULL,
    "SHIPPED_AT" TIMESTAMP(7),
    "NOTE" CLOB,
    "DETAILS" CLOB,
    "ORDER_REF" VARCHAR2(36 CHAR) NOT NULL,
    "TOTAL_WITH_TAX" NUMBER(12,2) GENERATED ALWAYS AS (CAST(CAST("TOTAL" * (1.16) AS NUMBER(12,2)) AS NUMBER(12,2))) VIRTUAL,
    CONSTRAINT "CK_ORDERS_ITEMS" CHECK ("ITEMS" >= 0),
    CONSTRAINT "CHECK2" CHECK ("STATUS" = 'cancelled' OR "STATUS" = 'shipped' OR "STATUS" = 'paid' OR "STATUS" = 'pending'),
    CONSTRAINT "CHECK3" CHECK ("TOTAL" >= (0))
);

CREATE TABLE "CUSTOMERS" (
    "ID" NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1),
    "NAME" VARCHAR2(100 CHAR) NOT NULL,
    "EMAIL" VARCHAR2(200 CHAR) NOT NULL,
    "COUNTRY" VARCHAR2(2 CHAR) DEFAULT 'US' NOT NULL,
    "IS_ACTIVE" NUMBER(1) DEFAULT 1 NOT NULL,
    "SIGNED_UP" DATE,
    "CREATED_AT" TIMESTAMP(0) WITH TIME ZONE DEFAULT SYSTIMESTAMP NOT NULL,
    "ROW_VERSION" RAW(8),
    CONSTRAINT "CK_CUSTOMERS_IS_ACTIVE" CHECK ("IS_ACTIVE" IN (0, 1))
);

BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
1,
'Ana Martínez',
'ana@example.com',
'MX',
1,
DATE '2023-01-15',
TIMESTAMP '2023-01-15 04:24:00.0000000 -06:00'
);
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,
DATE '2023-02-03',
TIMESTAMP '2023-02-03 09:11:42.0000000 +01:00'
);
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,
DATE '2023-03-21',
TIMESTAMP '2023-03-21 20:05:17.0000000 +01:00'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
4,
'李雷',
'lilei@example.cn',
'CN',
1,
DATE '2023-05-09',
TIMESTAMP '2023-05-09 10:40:00.0000000 +08:00'
);
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 15:00:00.0000000 +01:00'
);
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,
DATE '2024-01-02',
TIMESTAMP '2024-01-02 10:30:00.0000000 +01:00'
);
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,
DATE '2024-02-29',
TIMESTAMP '2024-03-01 05:29:59.0000000 +05:30'
);
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,
DATE '2024-04-12',
TIMESTAMP '2024-04-12 14:12:12.0000000 +02:00'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
1,
1,
'shipped',
129.9000,
3,
TIMESTAMP '2024-03-01 10:00:00.0000000',
TIMESTAMP '2024-03-02 16:30:00.1234567',
NULL,
'{"gift": false}',
'0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
2,
2,
'paid',
54.0000,
1,
TIMESTAMP '2024-03-02 11:15:00.0000000',
NULL,
'Gift wrap 🎁',
'{"gift": true, "wrap": "red"}',
'1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
3,
1,
'cancelled',
12.5000,
1,
TIMESTAMP '2024-03-03 09:45:00.0000000',
NULL,
'Customer changed their mind',
NULL,
'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
4,
4,
'shipped',
980.0000,
12,
TIMESTAMP '2024-03-05 02:10:00.0000000',
TIMESTAMP '2024-03-07 08:00:00.0000000',
'请小心轻放',
'{"fragile": true}',
'3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
5,
5,
'pending',
45.7500,
2,
TIMESTAMP '2024-03-08 17:20:00.0000000',
NULL,
'Leave at the door; ring twice',
NULL,
'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
6,
6,
'shipped',
310.4000,
5,
TIMESTAMP '2024-03-10 13:00:00.0000000',
TIMESTAMP '2024-03-11 09:00:00.0000000',
'Fragile: "glass"',
'{"fragile": true}',
'50f2917d-8e6c-4d3f-8baa-6f708192a3b4'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
7,
8,
'paid',
76.2000,
2,
TIMESTAMP '2024-03-11 18:45:00.0000000',
NULL,
NULL,
NULL,
'6103a28e-9f7d-4e40-9cbb-708192a3b4c5'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
8,
2,
'shipped',
19.9900,
1,
TIMESTAMP '2024-03-12 08:00:00.0000000',
TIMESTAMP '9999-12-31 23:59:59.9999999',
'Shipped date set to the maximum by an old import',
NULL,
'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
9,
3,
'shipped',
64.0000,
2,
TIMESTAMP '2024-03-14 15:30:00.0000000',
TIMESTAMP '2024-03-15 10:00:00.0000000',
'Two parcels',
'{"parcels": [1, 2]}',
'8325c4a0-b19f-4062-9edd-92a3b4c5d6e7'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
10,
7,
'paid',
1499.0000,
1,
TIMESTAMP '2024-03-15 21:05:00.0000000',
NULL,
'C:\Users\ravi\invoice.pdf',
NULL,
'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8'
);
COMMIT;
END;
/

-- Keys, indexes, foreign keys, counters and triggers, after the rows.
ALTER TABLE "ORDERS" ADD CONSTRAINT "PK_ORDERS" PRIMARY KEY ("ID");
ALTER TABLE "CUSTOMERS" ADD CONSTRAINT "PK_CUSTOMERS" PRIMARY KEY ("ID");
ALTER TABLE "CUSTOMERS" ADD CONSTRAINT "UQ_CUSTOMERS_EMAIL" UNIQUE ("EMAIL");
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 "FK_ORDERS" FOREIGN KEY ("CUSTOMER_ID") REFERENCES "CUSTOMERS" ("ID") ENABLE NOVALIDATE;
BEGIN
    EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" ENABLE VALIDATE CONSTRAINT "FK_ORDERS"';
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Foreign key ' || '"FK_ORDERS"' || ' 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 "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;
/
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';
DROP FUNCTION "INTOSQL_CLOB";
DROP FUNCTION "INTOSQL_BLOB";
COMMIT;
EXIT;

Düzeltmeler

  1. orders tablosunun "total_with_tax" sütunu kaynakta saklanıyor; Oracle onu okurken hesaplar.
  2. customers tablosunun "row_version" sütunu, SQL Server'ın kendisinin ayarladığı bir satır sürümüdür; dökümde bunun için değer yoktur, bu yüzden RAW(8) olur ve boş kalır.

Kontrol edilmeli

  • Kaynakta 6 metin sütunu büyük/küçük harf ayırmadan karşılaştırıyor; Oracle tam karşılaştırır, bu yüzden benzersiz anahtarlar ve aramalar farklı davranabilir. Gereken sütunlarda büyük/küçük harf duyarsız bir harmanlama veya sütun türü kullanın.
  • 2 görünüm, tetikleyici, rutin veya olay dönüştürülmedi; rapor her birini listeliyor. Bunları Oracle'de elle yeniden oluşturun.
  • orders üzerindeki check1 CHECK kısıtı Oracle için yazılamıyor (function isjson); bu yüzden oluşturulmadı. Önemliyse CHECK kısıtını elle yazın.
  • orders üzerindeki idx_orders_pending indeksi Oracle için yazılamayan bir ifade kullanıyor (filtered index); bu yüzden oluşturulmadı. Sorgular gerektiriyorsa indeksi elle oluşturun.
  • orders tablosundaki "order_ref" sütununun varsayılan değeri Oracle için yazılamıyor (function uuid); bu yüzden sütunun varsayılan değeri yok. Yeni satırlar gerektiriyorsa varsayılan değeri elle ekleyin.

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

Diğer örnekler:

SQL Server 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.

  • bit

    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 değerleri korur.

  • char(n), varchar(n), nchar(n), nvarchar(n)

    karakter sayan VARCHAR2(n CHAR)

    Uzunluklar, SQL Server'ın nvarchar türündeki gibi karakter sayar.

  • varchar(max), nvarchar(max), text, ntext

    her değer 4000 bayta sığıyorsa 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 binary 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

  • decimal(p,s), money, smallmoney

    NUMBER(p,s); money NUMBER(19,4) olarak

    NUMBER, decimal gibi 38 basamak tutar, bu yüzden her değer tam kalır.

  • datetime, datetime2, smalldatetime

    TIMESTAMP(p)

    datetime, saniyenin dokuz basamağına kadar tutan 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.

  • datetimeoffset

    her değerin farkıyla TIMESTAMP WITH TIME ZONE

    Oracle -12:00 ile +14:00 arasındaki farkları tutar; farkı -12:00'ın ötesinde olan bir değer UTC'de yazılır, 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 her değeri tutar.

  • dates that aren't valid

    NULL

    Tarih olmayan bir değer NULL olur ve rapor onu sayar.

    Rapor satırı: date_out_of_range

  • json (SQL Server 2025)

    CLOB

    Aynı JSON değerleri; Oracle'ın JSON fonksiyonları bunları okur.

  • uniqueidentifier

    VARCHAR2(36)

    Aynı tanımlayıcılar, küçük harfle yazılır.

  • binary, varbinary, image

    RAW(n) ve BLOB

    Baytlar bayt olarak kalır.

  • geometry, geography

    SQL Server'ın kendi baytlarıyla BLOB

    SSMS uzamsal değerleri SQL Server'ın serileştirmesiyle yazar ve bu bayt bayt korunur.

    Rapor satırı: spatial_as_native

  • rowversion, timestamp

    BLOB, boş

    SQL Server satır sürümünü kendisi ayarlar ve SSMS bunun için değer yazmaz.

    Rapor satırı: rowversion_empty

  • xml, sql_variant, hierarchyid, vector

    her değerin metniyle VARCHAR2 veya CLOB

    Oracle'da karşılık gelen bir tür yoktur; xml ve sql_variant her değerin metnini, hierarchyid ise /1/2/ gibi yolunu korur.

    Rapor satırı: type_replaced

  • collations that ignore case (_CI_)

    tam karşılaştırma

    Oracle aksi belirtilmedikçe metni tam karşılaştırır, bu yüzden SQL Server'da büyük/küçük harfi yok sayan sütunlar artık Ana ile ana'yı ayırt eder.

    Rapor satırı: case_insensitive_collation

  • 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 sonra devam eder.

  • CREATE SEQUENCE

    aynı seçeneklerle CREATE SEQUENCE

    Oracle sequence nesneleri aynı şekilde çalışır. SSMS bir sequence'ın nereye ulaştığını yazmaz, bu yüzden oluşturulduğu değerden başlar.

  • computed columns

    sanal sütunlar

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

    Rapor satırı: stored_as_virtual

  • computed columns with functions Oracle lacks

    düz bir sütun

    Yazılamayan bir formül düz bir sütun ve bir rapor satırı bırakır; SSMS hesaplanan sütunlar için değer yazmaz.

    Rapor satırı: generated_not_translated

  • defaults with functions Oracle lacks, and NEXT VALUE FOR

    varsayılan değer yok

    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

    Aynı CHECK kısıtları, her satır yüklenirken denetlenir.

  • CHECK constraints with functions Oracle lacks

    oluşturulmaz

    Yazılamayan bir CHECK kısıtı dışarıda bırakılır ve raporlanır.

    Rapor satırı: check_skipped

  • CHECK constraints added WITH NOCHECK or disabled

    oluşturulmaz

    SQL Server bu CHECK kısıtlarını uygulamaz, bu yüzden satırlar onları ihlal edebilir.

    Rapor satırı: check_not_enforced

  • filtered and columnstore indexes, and indexes on CLOB columns

    oluşturulmaz

    IntoSQL tüm sütunlar üzerinde b-tree indeksler 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

  • names over 128 bytes

    kısaltılır

    Oracle 12.2 ve sonrasında adlar 128 bayt tutar; SQL Server'ınkiler 128 karakter tutar.

    Rapor satırı: name_shortened

  • 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

  • tables on a partition scheme

    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

  • temporal tables (SYSTEM_VERSIONING)

    iki tablo: mevcut satırlar ve geçmiş

    Tablo ve geçmiş tablosu düz tablolar olarak kopyalanır; Oracle geçmişi kendisi tutmaz.

    Rapor satırı: system_versioning_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ı şemalardaki tabloların adının başına şemalarının adı gelir; dbo içindeki tablolar adlarını korur.

    Rapor satırı: schemas_merged

  • 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

  • views, functions, procedures, triggers, synonyms, types and partition functions

    raporda listelenir

    Kodları T-SQL ile yazılmıştır, bu yüzden yeniden oluşturmanız için listelenirler.

    Rapor satırı: not_converted_objects

  • scripts without CREATE TABLE (data only)

    değerlerden okunan türler

    Yalnızca veri içeren bir betikte 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

  • NUL characters in text

    korunur

    VARCHAR2 ve CLOB bir NUL karakteri tutabilir, bu yüzden değer olduğu gibi kopyalanır.

  • text that isn't valid in its encoding

    hatalı baytlar yerine koyma karakteri olarak

    Betik UTF-8'dir ve her değer geçerli metin olmalıdır.

    Rapor satırı: invalid_utf8_replaced

  • text decoded twice (ñ)

    olduğu gibi kopyalanır

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

    Rapor satırı: mojibake_suspected

SQL Server içindeOracle içindeRapor satırı
bit0 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 değerleri korur.
char(n), varchar(n), nchar(n), nvarchar(n)karakter sayan VARCHAR2(n CHAR)Uzunluklar, SQL Server'ın nvarchar türündeki gibi karakter sayar.
varchar(max), nvarchar(max), text, ntexther değer 4000 bayta sığıyorsa 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 binary 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
decimal(p,s), money, smallmoneyNUMBER(p,s); money NUMBER(19,4) olarakNUMBER, decimal gibi 38 basamak tutar, bu yüzden her değer tam kalır.
datetime, datetime2, smalldatetimeTIMESTAMP(p)datetime, saniyenin dokuz basamağına kadar tutan 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.
datetimeoffsether değerin farkıyla TIMESTAMP WITH TIME ZONEOracle -12:00 ile +14:00 arasındaki farkları tutar; farkı -12:00'ın ötesinde olan bir değer UTC'de yazılır, 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 her değeri tutar.
dates that aren't validNULLTarih olmayan bir değer NULL olur ve rapor onu sayar.date_out_of_range
json (SQL Server 2025)CLOBAynı JSON değerleri; Oracle'ın JSON fonksiyonları bunları okur.
uniqueidentifierVARCHAR2(36)Aynı tanımlayıcılar, küçük harfle yazılır.
binary, varbinary, imageRAW(n) ve BLOBBaytlar bayt olarak kalır.
geometry, geographySQL Server'ın kendi baytlarıyla BLOBSSMS uzamsal değerleri SQL Server'ın serileştirmesiyle yazar ve bu bayt bayt korunur.spatial_as_native
rowversion, timestampBLOB, boşSQL Server satır sürümünü kendisi ayarlar ve SSMS bunun için değer yazmaz.rowversion_empty
xml, sql_variant, hierarchyid, vectorher değerin metniyle VARCHAR2 veya CLOBOracle'da karşılık gelen bir tür yoktur; xml ve sql_variant her değerin metnini, hierarchyid ise /1/2/ gibi yolunu korur.type_replaced
collations that ignore case (_CI_)tam karşılaştırmaOracle aksi belirtilmedikçe metni tam karşılaştırır, bu yüzden SQL Server'da büyük/küçük harfi yok sayan sütunlar artık Ana ile ana'yı ayırt eder.case_insensitive_collation
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 sonra devam eder.
CREATE SEQUENCEaynı seçeneklerle CREATE SEQUENCEOracle sequence nesneleri aynı şekilde çalışır. SSMS bir sequence'ın nereye ulaştığını yazmaz, bu yüzden oluşturulduğu değerden başlar.
computed columnssanal sütunlarOracle üretilen sütunları yalnızca okurken hesaplar; PERSISTED sütunlar aynı değerlerle sanal olur.stored_as_virtual
computed columns with functions Oracle lacksdüz bir sütunYazılamayan bir formül düz bir sütun ve bir rapor satırı bırakır; SSMS hesaplanan sütunlar için değer yazmaz.generated_not_translated
defaults with functions Oracle lacks, and NEXT VALUE FORvarsayılan değer yokYazılamayan bir varsayılan değer dışarıda bırakılır ve raporlanır.default_not_translated
CHECK constraintsçevrilirAynı CHECK kısıtları, her satır yüklenirken denetlenir.
CHECK constraints with functions Oracle lacksoluşturulmazYazılamayan bir CHECK kısıtı dışarıda bırakılır ve raporlanır.check_skipped
CHECK constraints added WITH NOCHECK or disabledoluşturulmazSQL Server bu CHECK kısıtlarını uygulamaz, bu yüzden satırlar onları ihlal edebilir.check_not_enforced
filtered and columnstore indexes, and indexes on CLOB columnsoluşturulmazIntoSQL tüm sütunlar üzerinde b-tree indeksler 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
names over 128 byteskısaltılırOracle 12.2 ve sonrasında adlar 128 bayt tutar; SQL Server'ınkiler 128 karakter tutar.name_shortened
foreign keys to tables the dump doesn't createoluşturulmazBir anahtar, var olmayan bir tabloya başvuramaz.foreign_key_skipped
tables on a partition schemeher 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
temporal tables (SYSTEM_VERSIONING)iki tablo: mevcut satırlar ve geçmişTablo ve geçmiş tablosu düz tablolar olarak kopyalanır; Oracle geçmişi kendisi tutmaz.system_versioning_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ı şemalardaki tabloların adının başına şemalarının adı gelir; dbo içindeki tablolar adlarını korur.schemas_merged
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
views, functions, procedures, triggers, synonyms, types and partition functionsraporda listelenirKodları T-SQL ile yazılmıştır, bu yüzden yeniden oluşturmanız için listelenirler.not_converted_objects
scripts without CREATE TABLE (data only)değerlerden okunan türlerYalnızca veri içeren bir betikte 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
NUL characters in textkorunurVARCHAR2 ve CLOB bir NUL karakteri tutabilir, bu yüzden değer olduğu gibi kopyalanır.
text that isn't valid in its encodinghatalı baytlar yerine koyma karakteri olarakBetik UTF-8'dir ve her değer geçerli metin olmalıdır.invalid_utf8_replaced
text decoded twice (ñ)olduğu gibi kopyalanırBetik 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 @sql_server.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 SQL Server 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:

  • SSMS'te veritabanına sağ tıklayın, Tasks, Generate Scripts'i seçin ve tabloları işaretleyin. dbatools, mssql-scripter ve aynı kitaplık üzerine kurulu diğer araçlar aynı betiği yazar.
  • Advanced altında Types of data to script ayarını Schema and data yapın. Yalnızca şemayı içeren bir betikte tablolar satırsızdır.
  • Betiği SSMS'in varsayılanı olan Unicode ya da UTF-8 olarak kaydedin: ikisi de aynı şekilde okunur, gzip de çalışır.

Neler dönüştürülmez

Görünümler, fonksiyonlar, saklı yordamlar, tetikleyiciler, eş anlamlılar, kurallar ve güvenlik ilkeleri T-SQL ile yazılır. Raporda adlarıyla listelenirler, asla sessizce atlanmazlar; böylece onları Oracle için yeniden yazabilirsiniz.

SQL Server - 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.

SSMS'in kaydettiği UTF-16 dosyasını okuyor mu?

Evet. SSMS betikleri varsayılan olarak UTF-16 kaydeder ve dönüştürücü, gzip'li olsun olmasın, toplu işler arasında GO bulunan UTF-16 ve UTF-8 dosyalarını aynı şekilde okur.

Betik hangi SQL Server sürümlerinden gelebilir?

SSMS, dbatools veya mssql-scripter ile SQL Server 2017 ve sonrasından yazılmış betikler. Her test betiği SQL Server 2017, 2022 ve 2025'ten gelir ve kaynağıyla hücre hücre karşılaştırılır.

IDENTITY değerleri korunuyor mu?

Evet. IDENTITY sütunları kimlik sütunu olur, her satır kendi id'sini korur ve sonraki id en yüksek id'den sonra devam eder. Sequence'lar aynı seçeneklerle oluşturulur.

money, datetimeoffset ve diğer SQL Server türleri ne olur?

bit NUMBER(1), datetime2 her basamağıyla TIMESTAMP, datetimeoffset farkıyla TIMESTAMP WITH TIME ZONE, nvarchar(max) ise değerleri bir VARCHAR2'ye sığmadığında CLOB olur. Oracle boş dizeleri NULL olarak sakladığı için bunlar NULL olur ve rapor onları sayar.

Saklı yordamlar, 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 betiği 21c ve 23ai üzerinde yüklenir ve bir sorun çıkarsa ilk hatada durur.