Pular para o conteúdo
Início do IntoSQL

Leve uma exportação do Oracle para um Oracle mais antigo ou mais novo

Solte o arquivo .sql que o Database Export do SQL Developer ou o SQLcl escreve, com suas tabelas e Insert, e baixe um script que carrega no Oracle 19c ou posterior. NUMBER, DATE, TIMESTAMP, LOBs, identities e sequências ficam como estão, XMLTYPE e JSON guardam seu texto em um CLOB, e cada mudança é listada no relatório.

Seu arquivo
sqlshop_2024_oracle.sqlArquivo de exemplo, 9,3 kB
Seu banco de dados

18 linhas convertidas, nenhuma correção, nenhuma rejeitada

Mostrar

Tabelas em shop_2024_oracle.sqlDump do Oracle · gerado por SQL Developer · utf-8

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

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

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

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

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

Correções

Nada precisou de correção.

Seu arquivo é convertido neste computador e nunca é enviado.

Outros exemplos:

O que muda entre o arquivo e o script

Cada linha é uma regra que o conversor aplica, com a linha do relatório que ele escreve quando a regra muda algo nos seus dados.

  • BOOLEAN (23ai)

    BOOLEAN no 23ai, senão NUMBER(1) com um CHECK de 0 e 1

    TRUE e FALSE continuam sendo true e false.

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

    os mesmos tipos, com seus tamanhos BYTE ou CHAR

    Os mesmos tipos de texto; LONG vira CLOB, que toda versão desde a 8 prefere.

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

    VARCHAR2(4000 CHAR) quando todo valor cabe em 4000 bytes, senão CLOB

    Um VARCHAR2 comporta 4000 bytes por padrão e o Oracle não indexa um CLOB, então o texto fica VARCHAR2 quando seus valores cabem e vira CLOB quando não cabem.

    Linha do relatório: text_as_lob

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

    os mesmos tipos NUMBER

    Os mesmos tipos NUMBER e FLOAT, com todos os dígitos.

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    os mesmos tipos INTERVAL

    Os mesmos intervalos.

  • DATE, TIMESTAMP(p)

    DATE e TIMESTAMP(p), como declarados

    Os mesmos tipos, então cada data mantém sua hora até o segundo.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    os mesmos tipos

    O Oracle mantém os fusos de -12:00 a +14:00; um valor com fuso além de -12:00 é escrito em UTC, o mesmo instante.

  • JSON (21c), and CLOB holding JSON

    JSON no 21c e posteriores, senão CLOB

    Os mesmos valores JSON; um NULL do SQL que a exportação escreveu como 'null' continua NULL.

  • BLOB, RAW(n), LONG RAW

    os mesmos tipos; LONG RAW como BLOB

    Bytes continuam bytes.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    CLOB com o texto deles

    XMLTYPE, ROWID e UROWID mantêm o texto em um CLOB, então o script carrega em todas as versões a partir do 19c.

    Linha do relatório: type_replaced

  • collations that ignore case (BINARY_CI)

    comparação exata

    As collations das colunas não são escritas, então uma coluna que ignorava maiúsculas (BINARY_CI) agora diferencia Ana de ana.

    Linha do relatório: case_insensitive_collation

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

    GENERATED BY DEFAULT ON NULL AS IDENTITY, continuando depois do maior id

    Os ids copiados carregam como estão, e o contador continua depois do maior deles. Uma coluna que um gatilho preenche a partir de uma sequência (o jeito de antes do 12c) também é de identidade.

  • identity columns the target can't count

    um inteiro simples

    O Oracle conta uma coluna identity por tabela; qualquer outra mantém seus valores sem contador.

    Linha do relatório: counter_dropped

  • CREATE SEQUENCE

    CREATE SEQUENCE com as mesmas opções

    A exportação escreve até onde uma sequência chegou como o seu START WITH, então ela continua dali.

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

    colunas virtuais

    As mesmas colunas virtuais.

    Linha do relatório: stored_as_virtual

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

    uma coluna simples

    Uma fórmula que não pode ser escrita para o Oracle deixa uma coluna simples e uma linha no relatório; os valores que a exportação escreveu para colunas virtuais ficam de fora, e o Oracle não tem nenhum para calcular.

    Linha do relatório: generated_not_translated

  • defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)

    sem valor padrão

    Um valor padrão que não pode ser escrito fica de fora e é informado.

    Linha do relatório: default_not_translated

  • CHECK constraints

    traduzidos

    Os mesmos CHECKs, testados à medida que cada linha carrega.

  • CHECK constraints with functions IntoSQL doesn't write

    não criado

    Um CHECK que não pode ser escrito fica de fora e é informado.

    Linha do relatório: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    não criado

    O Oracle não aplica esses CHECKs às linhas que já existiam, então as linhas podem violá-los.

    Linha do relatório: check_not_enforced

  • function-based, bitmap and domain indexes

    não criado

    O IntoSQL escreve índices b-tree sobre colunas inteiras; crie os outros de novo depois da carga.

    Linha do relatório: index_skipped

  • foreign keys

    depois dos dados ENABLE NOVALIDATE, e então validada com um aviso sobre órfãos

    A chave verifica as linhas novas na hora e é validada por último; linhas sem pai a deixam sem validação com um aviso, em vez de parar a carga.

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

    descartado

    As chaves estrangeiras do Oracle só agem na exclusão, com CASCADE ou SET NULL.

    Linha do relatório: foreign_key_action_unsupported

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

    não criada

    Uma chave não pode apontar para uma tabela que não existe, e uma que o Oracle não verifica pode ter linhas sem pai.

    Linha do relatório: foreign_key_skipped

  • names longer than Oracle 12.1 allows

    encurtados

    A partir do 12.2, os nomes no Oracle comportam 128 bytes; um nome mais longo é encurtado.

    Linha do relatório: name_shortened

  • partitioned tables

    uma tabela com as linhas de todas as partições

    As linhas são as mesmas; particione a tabela de novo no Oracle se precisar.

    Linha do relatório: partitions_dropped

  • several schemas in one export

    um schema, tabelas com o nome do schema na frente

    O script carrega no schema do usuário que o executa, então tabelas de schemas diferentes recebem o nome do schema na frente; uma exportação de um só schema mantém os nomes das suas tabelas.

    Linha do relatório: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL removido

    Uma coluna cujos valores tiveram de virar NULL não pode manter NOT NULL, senão a carga pararia.

    Linha do relatório: not_null_relaxed

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

    listados no relatório

    O código deles é escrito em PL/SQL, então eles são listados para você recriá-los.

    Linha do relatório: not_converted_objects

  • exports without CREATE TABLE (data only)

    tipos lidos dos valores

    Uma exportação só de dados tem apenas linhas, então os tipos vêm dos valores.

    Linha do relatório: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Um conversor que não executa um banco de dados não consegue avaliá-las; to_date, to_timestamp, TO_CLOB, HEXTORAW e as outras que as exportações escrevem são lidas.

    Linha do relatório: expression_value

  • types IntoSQL doesn't know, and object types

    CLOB

    O texto aceita qualquer valor; mude o tipo depois da carga.

    Linha do relatório: unknown_type

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

    NULL

    Um valor que não é uma data vira NULL e o relatório o conta.

    Linha do relatório: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NaN e Infinity mantidos

    Os tipos de ponto flutuante do Oracle comportam NaN e infinito.

  • NUL characters in text

    mantido

    VARCHAR2 e CLOB aceitam o caractere NUL, então o valor é copiado como está.

  • text that isn't valid in its encoding

    os bytes inválidos como o caractere de substituição

    O script é UTF-8 e todo valor precisa ser texto válido.

    Linha do relatório: invalid_utf8_replaced

  • text decoded twice (ñ)

    copiado como está

    O script contém exatamente esses caracteres, então eles são copiados; o relatório os aponta.

    Linha do relatório: mojibake_suspected

No arquivoNo scriptLinha do relatório
BOOLEAN (23ai)BOOLEAN no 23ai, senão NUMBER(1) com um CHECK de 0 e 1TRUE e FALSE continuam sendo true e false.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGos mesmos tipos, com seus tamanhos BYTE ou CHAROs mesmos tipos de texto; LONG vira CLOB, que toda versão desde a 8 prefere.
VARCHAR2 and NVARCHAR2 past what the target's own types holdVARCHAR2(4000 CHAR) quando todo valor cabe em 4000 bytes, senão CLOBUm VARCHAR2 comporta 4000 bytes por padrão e o Oracle não indexa um CLOB, então o texto fica VARCHAR2 quando seus valores cabem e vira CLOB quando não cabem.text_as_lob
NUMBER, NUMBER(p,s), FLOAT(b)os mesmos tipos NUMBEROs mesmos tipos NUMBER e FLOAT, com todos os dígitos.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDos mesmos tipos INTERVALOs mesmos intervalos.
DATE, TIMESTAMP(p)DATE e TIMESTAMP(p), como declaradosOs mesmos tipos, então cada data mantém sua hora até o segundo.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEos mesmos tiposO Oracle mantém os fusos de -12:00 a +14:00; um valor com fuso além de -12:00 é escrito em UTC, o mesmo instante.
JSON (21c), and CLOB holding JSONJSON no 21c e posteriores, senão CLOBOs mesmos valores JSON; um NULL do SQL que a exportação escreveu como 'null' continua NULL.
BLOB, RAW(n), LONG RAWos mesmos tipos; LONG RAW como BLOBBytes continuam bytes.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYCLOB com o texto delesXMLTYPE, ROWID e UROWID mantêm o texto em um CLOB, então o script carrega em todas as versões a partir do 19c.type_replaced
collations that ignore case (BINARY_CI)comparação exataAs collations das colunas não são escritas, então uma coluna que ignorava maiúsculas (BINARY_CI) agora diferencia Ana de ana.case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assignsGENERATED BY DEFAULT ON NULL AS IDENTITY, continuando depois do maior idOs ids copiados carregam como estão, e o contador continua depois do maior deles. Uma coluna que um gatilho preenche a partir de uma sequência (o jeito de antes do 12c) também é de identidade.
identity columns the target can't countum inteiro simplesO Oracle conta uma coluna identity por tabela; qualquer outra mantém seus valores sem contador.counter_dropped
CREATE SEQUENCECREATE SEQUENCE com as mesmas opçõesA exportação escreve até onde uma sequência chegou como o seu START WITH, então ela continua dali.
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)colunas virtuaisAs mesmas colunas virtuais.stored_as_virtual
virtual columns with functions IntoSQL doesn't write, and the || operatoruma coluna simplesUma fórmula que não pode ser escrita para o Oracle deixa uma coluna simples e uma linha no relatório; os valores que a exportação escreveu para colunas virtuais ficam de fora, e o Oracle não tem nenhum para calcular.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)sem valor padrãoUm valor padrão que não pode ser escrito fica de fora e é informado.default_not_translated
CHECK constraintstraduzidosOs mesmos CHECKs, testados à medida que cada linha carrega.
CHECK constraints with functions IntoSQL doesn't writenão criadoUm CHECK que não pode ser escrito fica de fora e é informado.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEnão criadoO Oracle não aplica esses CHECKs às linhas que já existiam, então as linhas podem violá-los.check_not_enforced
function-based, bitmap and domain indexesnão criadoO IntoSQL escreve índices b-tree sobre colunas inteiras; crie os outros de novo depois da carga.index_skipped
foreign keysdepois dos dados ENABLE NOVALIDATE, e então validada com um aviso sobre órfãosA chave verifica as linhas novas na hora e é validada por último; linhas sem pai a deixam sem validação com um aviso, em vez de parar a carga.
ON DELETE CASCADE that cascades in a cycle or along a second pathdescartadoAs chaves estrangeiras do Oracle só agem na exclusão, com CASCADE ou SET NULL.foreign_key_action_unsupported
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesnão criadaUma chave não pode apontar para uma tabela que não existe, e uma que o Oracle não verifica pode ter linhas sem pai.foreign_key_skipped
names longer than Oracle 12.1 allowsencurtadosA partir do 12.2, os nomes no Oracle comportam 128 bytes; um nome mais longo é encurtado.name_shortened
partitioned tablesuma tabela com as linhas de todas as partiçõesAs linhas são as mesmas; particione a tabela de novo no Oracle se precisar.partitions_dropped
several schemas in one exportum schema, tabelas com o nome do schema na frenteO script carrega no schema do usuário que o executa, então tabelas de schemas diferentes recebem o nome do schema na frente; uma exportação de um só schema mantém os nomes das suas tabelas.schemas_merged
NOT NULL columns with values that become NULLNOT NULL removidoUma coluna cujos valores tiveram de virar NULL não pode manter NOT NULL, senão a carga pararia.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggerslistados no relatórioO código deles é escrito em PL/SQL, então eles são listados para você recriá-los.not_converted_objects
exports without CREATE TABLE (data only)tipos lidos dos valoresUma exportação só de dados tem apenas linhas, então os tipos vêm dos valores.no_schema
expressions in INSERT values other than the ones exports writeNULLUm conversor que não executa um banco de dados não consegue avaliá-las; to_date, to_timestamp, TO_CLOB, HEXTORAW e as outras que as exportações escrevem são lidas.expression_value
types IntoSQL doesn't know, and object typesCLOBO texto aceita qualquer valor; mude o tipo depois da carga.unknown_type
dates before year 1 and time zones given as region namesNULLUm valor que não é uma data vira NULL e o relatório o conta.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENaN e Infinity mantidosOs tipos de ponto flutuante do Oracle comportam NaN e infinito.
NUL characters in textmantidoVARCHAR2 e CLOB aceitam o caractere NUL, então o valor é copiado como está.
text that isn't valid in its encodingos bytes inválidos como o caractere de substituiçãoO script é UTF-8 e todo valor precisa ser texto válido.invalid_utf8_replaced
text decoded twice (ñ)copiado como estáO script contém exatamente esses caracteres, então eles são copiados; o relatório os aponta.mojibake_suspected

Carregue o script no Oracle

O script cria as tabelas, copia as linhas e depois adiciona chaves, índices e chaves estrangeiras, então carrega rápido e para no primeiro erro.

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

As chaves estrangeiras são adicionadas ENABLE NOVALIDATE, então as linhas novas são verificadas na hora, e depois validadas. Se uma linha antiga aponta para uma linha que não existe, o script informa qual restrição e a deixa sem validação, em vez de falhar no meio do caminho.

Para um dump grande, execute o SQL*Plus na mesma máquina do banco de dados. O script faz commit a cada 100 linhas. O usuário que o executa precisa de CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER e CREATE PROCEDURE, e de cota no seu tablespace.

Gere o dump do Oracle para o melhor resultado

O conversor lê o que o dump contém. Estas opções mantêm mais dos seus dados nele:

  • No SQL Developer, escolha Tools, Database Export, com DDL e o formato de dados Insert. O SQLcl escreve o mesmo com SET SQLFORMAT INSERT.
  • Rode ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' antes de exportar: o formato padrão escreve as datas sem a hora nem o século.
  • Um arquivo .dmp do exp ou do expdp é binário: importe-o em um banco de dados Oracle, como o Oracle Database Free no Docker, e exporte-o com o SQL Developer.

O que não é convertido

Views, triggers, procedures, funções e outros objetos escritos na própria linguagem do Oracle aparecem no relatório pelo nome, nunca são descartados em silêncio, para você conferir cada um com a versão do Oracle em que vai carregar antes de recriá-lo.

Perguntas sobre levar o Oracle entre versões

Não encontrou a resposta? Escreva para nós pela página de contato e uma pessoa responde. Página de contato

Meu dump é enviado?

Não. O conversor roda no seu navegador e lê o dump do seu disco em partes, então ele nunca sai do seu computador. O app para desktop e a linha de comando também convertem no seu computador.

Qual o tamanho máximo do dump?

O conversor nunca guarda o dump inteiro na memória: ele lê o arquivo duas vezes, por intervalos, e escreve o script à medida que avança. Dumps de vários gigabytes são convertidos no navegador, no app para desktop e com a linha de comando.

Posso converter um arquivo .dmp do exp ou do expdp?

Não diretamente: o Data Pump e o Export original escrevem um formato binário que só o Oracle lê. Importe-o em qualquer banco de dados Oracle, o Oracle Database Free roda no Docker, e exporte-o com o Database Export do SQL Developer ou com o SQLcl. O conversor avisa quando recebe um arquivo .dmp.

De quais versões do Oracle a exportação pode vir?

Exportações do SQL Developer e do SQLcl, com as definições de tabela do DBMS_METADATA, a partir do Oracle 11g. Cada exportação de teste vem do Oracle 21c e 23ai, em sessões americanas, alemãs e ISO, e é comparada com a origem célula por célula.

O que acontece com NUMBER, DATE e os outros tipos do Oracle?

Eles ficam como estão: NUMBER com sua precisão, DATE, TIMESTAMP, os intervalos, CHAR e VARCHAR2 com seus tamanhos, RAW e os LOBs. XMLTYPE e JSON mantêm o texto em um CLOB, então o script carrega no 19c.

As colunas de identidade e as sequências são mantidas?

Sim. As colunas de identidade e as sequências ficam como estão e continuam de onde a exportação diz que chegaram.

E os pacotes, procedimentos e gatilhos em PL/SQL?

Eles aparecem no relatório pelo nome e não são convertidos, para que você possa recriá-los quando as tabelas estiverem prontas.

Em quais versões do Oracle o script carrega?

Oracle 19c e posteriores. Cada exportação de teste carrega no 21c e no 23ai e para no primeiro erro se algo der errado.