Saltar al contenido
Inicio de IntoSQL

Pasa una exportación de Oracle a un Oracle más antiguo o más nuevo

Suelta el archivo .sql que escribe Database Export de SQL Developer o SQLcl, con sus tablas e Insert, y descarga un script que carga en Oracle 19c y posteriores. NUMBER, DATE, TIMESTAMP, los LOB, las identidades y las secuencias quedan igual, XMLTYPE y JSON guardan su texto en un CLOB, y cada cambio aparece en el informe.

Tu archivo
sqlshop_2024_oracle.sqlArchivo de ejemplo, 9,3 kB
Tu base de datos

18 filas convertidas, sin correcciones, ninguna rechazada

Mostrar

Tablas en shop_2024_oracle.sqlVolcado de Oracle · escrito por SQL Developer · utf-8

  • customersescrita como CUSTOMERS8 filas
    7 columnas
    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 filas
    9 columnas
    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;

Correcciones

No hubo nada que corregir.

Tu archivo se convierte en esta computadora y nunca se sube.

Otros ejemplos:

Qué cambia entre el archivo y el script

Cada fila es una regla que aplica el convertidor, con la línea que escribe en el informe cuando la regla cambia algo en tus datos.

  • BOOLEAN (23ai)

    BOOLEAN en 23ai, si no NUMBER(1) con un CHECK de 0 y 1

    TRUE y FALSE siguen siendo true y false.

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

    los mismos tipos, con sus longitudes BYTE o CHAR

    Los mismos tipos de texto; LONG se vuelve CLOB, que toda versión desde la 8 prefiere.

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

    VARCHAR2(4000 CHAR) cuando cada valor cabe en 4000 bytes, si no CLOB

    Un VARCHAR2 admite 4000 bytes por defecto y Oracle no puede indexar un CLOB, así que el texto se queda en VARCHAR2 cuando sus valores caben y es un CLOB cuando no.

    Línea del informe: text_as_lob

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

    los mismos tipos NUMBER

    Los mismos tipos NUMBER y FLOAT, con cada dígito.

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    los mismos tipos INTERVAL

    Los mismos intervalos.

  • DATE, TIMESTAMP(p)

    DATE y TIMESTAMP(p), como se declararon

    Los mismos tipos, así que cada fecha conserva su hora al segundo.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    los mismos tipos

    Oracle conserva los desfases de -12:00 a +14:00; un valor con un desfase más allá de -12:00 se escribe en UTC, el mismo instante.

  • JSON (21c), and CLOB holding JSON

    JSON en 21c y posteriores, si no CLOB

    Los mismos valores JSON; un NULL de SQL que la exportación escribió como 'null' sigue siendo NULL.

  • BLOB, RAW(n), LONG RAW

    los mismos tipos; LONG RAW como BLOB

    Los bytes siguen siendo bytes.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    CLOB con su texto

    XMLTYPE, ROWID y UROWID conservan su texto en un CLOB, así que el script carga en cada versión desde 19c.

    Línea del informe: type_replaced

  • collations that ignore case (BINARY_CI)

    comparación exacta

    Las intercalaciones de columna no se escriben, así que una columna que no distinguía mayúsculas (BINARY_CI) ahora distingue Ana de ana.

    Línea del informe: case_insensitive_collation

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

    GENERATED BY DEFAULT ON NULL AS IDENTITY, siguiendo después del id más alto

    Los ids copiados se cargan tal cual, y el contador sigue después del más alto. Una columna que un disparador llena desde una secuencia (la forma anterior a 12c) también es de identidad.

  • identity columns the target can't count

    un entero simple

    Oracle cuenta una columna de identidad por tabla; cualquier otra conserva sus valores sin contador.

    Línea del informe: counter_dropped

  • CREATE SEQUENCE

    CREATE SEQUENCE con las mismas opciones

    La exportación escribe hasta dónde llegó una secuencia como su START WITH, así que sigue desde ahí.

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

    columnas virtuales

    Las mismas columnas virtuales.

    Línea del informe: stored_as_virtual

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

    una columna simple

    Una fórmula que no se puede escribir para Oracle deja una columna simple y una línea en el informe; los valores que la exportación escribió para las columnas virtuales se omiten, y Oracle no tiene ninguno que calcular.

    Línea del informe: generated_not_translated

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

    sin valor predeterminado

    Un valor predeterminado que no se puede escribir se deja fuera y aparece en el informe.

    Línea del informe: default_not_translated

  • CHECK constraints

    traducidos

    Los mismos CHECK, comprobados al cargar cada fila.

  • CHECK constraints with functions IntoSQL doesn't write

    no se crea

    Un CHECK que no se puede escribir se deja fuera y aparece en el informe.

    Línea del informe: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    no se crea

    Oracle no aplica estos CHECK a las filas que ya estaban, así que las filas pueden no cumplirlos.

    Línea del informe: check_not_enforced

  • function-based, bitmap and domain indexes

    no se crea

    IntoSQL escribe índices b-tree sobre columnas completas; vuelve a crear los demás después de cargar.

    Línea del informe: index_skipped

  • foreign keys

    después de los datos, ENABLE NOVALIDATE, luego validada con una advertencia si hay huérfanas

    La clave comprueba las filas nuevas de inmediato y se valida al final; las filas sin padre la dejan sin validar con una advertencia en lugar de detener la carga.

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

    se descarta

    Las claves foráneas de Oracle solo actúan al eliminar, con CASCADE o SET NULL.

    Línea del informe: foreign_key_action_unsupported

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

    no se crea

    Una clave no puede nombrar una tabla que no existe, y una que Oracle no comprueba puede tener filas sin padre.

    Línea del informe: foreign_key_skipped

  • names longer than Oracle 12.1 allows

    acortado

    Desde Oracle 12.2 los nombres admiten 128 bytes; un nombre más largo se acorta.

    Línea del informe: name_shortened

  • partitioned tables

    una tabla con las filas de todas las particiones

    Las filas son las mismas; vuelve a particionar la tabla en Oracle si lo necesita.

    Línea del informe: partitions_dropped

  • several schemas in one export

    un esquema, con el nombre del esquema delante de cada tabla

    El script se carga en el esquema del usuario que lo ejecuta, así que las tablas de esquemas distintos llevan delante el nombre de su esquema; una exportación de un solo esquema conserva los nombres de sus tablas.

    Línea del informe: schemas_merged

  • NOT NULL columns with values that become NULL

    sin NOT NULL

    Una columna cuyos valores tuvieron que volverse NULL no puede conservar NOT NULL, o la carga se detendría.

    Línea del informe: not_null_relaxed

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

    listados en el informe

    Su código está escrito en PL/SQL, así que se listan para que los vuelvas a crear.

    Línea del informe: not_converted_objects

  • exports without CREATE TABLE (data only)

    tipos leídos de los valores

    Una exportación solo de datos solo tiene filas, así que los tipos salen de los valores.

    Línea del informe: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Un convertidor que no ejecuta una base de datos no puede evaluarlas; sí se leen to_date, to_timestamp, TO_CLOB, HEXTORAW y las demás que escriben las exportaciones.

    Línea del informe: expression_value

  • types IntoSQL doesn't know, and object types

    CLOB

    El texto admite cualquier valor; cambia el tipo después de cargar.

    Línea del informe: unknown_type

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

    NULL

    Un valor que no es una fecha se vuelve NULL y el informe lo cuenta.

    Línea del informe: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NaN e Infinity se conservan

    Los tipos de coma flotante de Oracle admiten NaN e infinito.

  • NUL characters in text

    se conserva

    VARCHAR2 y CLOB pueden contener un carácter NUL, así que el valor se copia tal cual.

  • text that isn't valid in its encoding

    los bytes incorrectos como carácter de reemplazo

    El script es UTF-8 y cada valor tiene que ser texto válido.

    Línea del informe: invalid_utf8_replaced

  • text decoded twice (ñ)

    se copia tal cual

    El script contiene exactamente estos caracteres, así que se copian; el informe los señala.

    Línea del informe: mojibake_suspected

En el archivoEn el scriptLínea del informe
BOOLEAN (23ai)BOOLEAN en 23ai, si no NUMBER(1) con un CHECK de 0 y 1TRUE y FALSE siguen siendo true y false.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGlos mismos tipos, con sus longitudes BYTE o CHARLos mismos tipos de texto; LONG se vuelve CLOB, que toda versión desde la 8 prefiere.
VARCHAR2 and NVARCHAR2 past what the target's own types holdVARCHAR2(4000 CHAR) cuando cada valor cabe en 4000 bytes, si no CLOBUn VARCHAR2 admite 4000 bytes por defecto y Oracle no puede indexar un CLOB, así que el texto se queda en VARCHAR2 cuando sus valores caben y es un CLOB cuando no.text_as_lob
NUMBER, NUMBER(p,s), FLOAT(b)los mismos tipos NUMBERLos mismos tipos NUMBER y FLOAT, con cada dígito.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDlos mismos tipos INTERVALLos mismos intervalos.
DATE, TIMESTAMP(p)DATE y TIMESTAMP(p), como se declararonLos mismos tipos, así que cada fecha conserva su hora al segundo.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONElos mismos tiposOracle conserva los desfases de -12:00 a +14:00; un valor con un desfase más allá de -12:00 se escribe en UTC, el mismo instante.
JSON (21c), and CLOB holding JSONJSON en 21c y posteriores, si no CLOBLos mismos valores JSON; un NULL de SQL que la exportación escribió como 'null' sigue siendo NULL.
BLOB, RAW(n), LONG RAWlos mismos tipos; LONG RAW como BLOBLos bytes siguen siendo bytes.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYCLOB con su textoXMLTYPE, ROWID y UROWID conservan su texto en un CLOB, así que el script carga en cada versión desde 19c.type_replaced
collations that ignore case (BINARY_CI)comparación exactaLas intercalaciones de columna no se escriben, así que una columna que no distinguía mayúsculas (BINARY_CI) ahora distingue Ana de ana.case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assignsGENERATED BY DEFAULT ON NULL AS IDENTITY, siguiendo después del id más altoLos ids copiados se cargan tal cual, y el contador sigue después del más alto. Una columna que un disparador llena desde una secuencia (la forma anterior a 12c) también es de identidad.
identity columns the target can't countun entero simpleOracle cuenta una columna de identidad por tabla; cualquier otra conserva sus valores sin contador.counter_dropped
CREATE SEQUENCECREATE SEQUENCE con las mismas opcionesLa exportación escribe hasta dónde llegó una secuencia como su START WITH, así que sigue desde ahí.
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)columnas virtualesLas mismas columnas virtuales.stored_as_virtual
virtual columns with functions IntoSQL doesn't write, and the || operatoruna columna simpleUna fórmula que no se puede escribir para Oracle deja una columna simple y una línea en el informe; los valores que la exportación escribió para las columnas virtuales se omiten, y Oracle no tiene ninguno que calcular.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)sin valor predeterminadoUn valor predeterminado que no se puede escribir se deja fuera y aparece en el informe.default_not_translated
CHECK constraintstraducidosLos mismos CHECK, comprobados al cargar cada fila.
CHECK constraints with functions IntoSQL doesn't writeno se creaUn CHECK que no se puede escribir se deja fuera y aparece en el informe.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEno se creaOracle no aplica estos CHECK a las filas que ya estaban, así que las filas pueden no cumplirlos.check_not_enforced
function-based, bitmap and domain indexesno se creaIntoSQL escribe índices b-tree sobre columnas completas; vuelve a crear los demás después de cargar.index_skipped
foreign keysdespués de los datos, ENABLE NOVALIDATE, luego validada con una advertencia si hay huérfanasLa clave comprueba las filas nuevas de inmediato y se valida al final; las filas sin padre la dejan sin validar con una advertencia en lugar de detener la carga.
ON DELETE CASCADE that cascades in a cycle or along a second pathse descartaLas claves foráneas de Oracle solo actúan al eliminar, con CASCADE o SET NULL.foreign_key_action_unsupported
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesno se creaUna clave no puede nombrar una tabla que no existe, y una que Oracle no comprueba puede tener filas sin padre.foreign_key_skipped
names longer than Oracle 12.1 allowsacortadoDesde Oracle 12.2 los nombres admiten 128 bytes; un nombre más largo se acorta.name_shortened
partitioned tablesuna tabla con las filas de todas las particionesLas filas son las mismas; vuelve a particionar la tabla en Oracle si lo necesita.partitions_dropped
several schemas in one exportun esquema, con el nombre del esquema delante de cada tablaEl script se carga en el esquema del usuario que lo ejecuta, así que las tablas de esquemas distintos llevan delante el nombre de su esquema; una exportación de un solo esquema conserva los nombres de sus tablas.schemas_merged
NOT NULL columns with values that become NULLsin NOT NULLUna columna cuyos valores tuvieron que volverse NULL no puede conservar NOT NULL, o la carga se detendría.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggerslistados en el informeSu código está escrito en PL/SQL, así que se listan para que los vuelvas a crear.not_converted_objects
exports without CREATE TABLE (data only)tipos leídos de los valoresUna exportación solo de datos solo tiene filas, así que los tipos salen de los valores.no_schema
expressions in INSERT values other than the ones exports writeNULLUn convertidor que no ejecuta una base de datos no puede evaluarlas; sí se leen to_date, to_timestamp, TO_CLOB, HEXTORAW y las demás que escriben las exportaciones.expression_value
types IntoSQL doesn't know, and object typesCLOBEl texto admite cualquier valor; cambia el tipo después de cargar.unknown_type
dates before year 1 and time zones given as region namesNULLUn valor que no es una fecha se vuelve NULL y el informe lo cuenta.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENaN e Infinity se conservanLos tipos de coma flotante de Oracle admiten NaN e infinito.
NUL characters in textse conservaVARCHAR2 y CLOB pueden contener un carácter NUL, así que el valor se copia tal cual.
text that isn't valid in its encodinglos bytes incorrectos como carácter de reemplazoEl script es UTF-8 y cada valor tiene que ser texto válido.invalid_utf8_replaced
text decoded twice (ñ)se copia tal cualEl script contiene exactamente estos caracteres, así que se copian; el informe los señala.mojibake_suspected

Carga el script en Oracle

El script crea las tablas, copia las filas y luego agrega claves, índices y claves foráneas, así que carga rápido y se detiene en el primer error.

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

Las claves foráneas se agregan ENABLE NOVALIDATE, así que las filas nuevas se comprueban de inmediato, y luego se validan. Si una fila antigua apunta a una fila que no existe, el script dice qué restricción es y la deja sin validar, en lugar de fallar a medias.

Para un volcado grande, ejecuta SQL*Plus en la misma máquina que la base de datos. El script confirma cada 100 filas. El usuario que lo ejecuta necesita CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER y CREATE PROCEDURE, y cuota en su tablespace.

Haz el volcado de Oracle para el mejor resultado

El convertidor lee lo que contiene el volcado. Estas opciones conservan más de tus datos en él:

  • En SQL Developer, elige Tools, Database Export, con DDL y el formato de datos Insert. SQLcl escribe lo mismo con SET SQLFORMAT INSERT.
  • Ejecuta ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' antes de exportar: el formato predeterminado escribe las fechas sin su hora ni su siglo.
  • Un archivo .dmp de exp o expdp es binario: impórtalo en una base de datos Oracle, por ejemplo Oracle Database Free en Docker, y expórtalo con SQL Developer.

Qué no se convierte

Las vistas, disparadores, procedimientos, funciones y otros objetos escritos en el propio lenguaje de Oracle aparecen en el informe por nombre, nunca se descartan en silencio, para que revises cada uno contra la versión de Oracle en la que cargas antes de recrearlo.

Preguntas sobre pasar Oracle entre versiones

¿No encuentras la respuesta? Escríbenos desde la página de contacto y te responde una persona. Página de contacto

¿Se sube mi volcado?

No. El convertidor se ejecuta en tu navegador y lee el volcado de tu disco por partes, así que nunca sale de tu computadora. La app de escritorio y la línea de comandos también convierten en tu computadora.

¿Qué tan grande puede ser el volcado?

El convertidor nunca tiene todo el volcado en memoria: lee el archivo dos veces, por rangos, y escribe el script sobre la marcha. Los volcados de varios gigabytes se convierten en el navegador, en la app de escritorio y con la línea de comandos.

¿Puedo convertir un archivo .dmp de exp o expdp?

No directamente: Data Pump y el Export original escriben un formato binario que solo Oracle lee. Impórtalo en cualquier base de datos Oracle, Oracle Database Free funciona en Docker, y expórtalo con Database Export de SQL Developer o con SQLcl. El convertidor te lo indica cuando recibe un archivo .dmp.

¿De qué versiones de Oracle puede venir la exportación?

Exportaciones de SQL Developer y SQLcl, con las definiciones de tabla de DBMS_METADATA, desde Oracle 11g en adelante. Cada exportación de prueba viene de Oracle 21c y 23ai, en sesiones estadounidenses, alemanas e ISO, y se compara con su origen celda por celda.

¿Qué pasa con NUMBER, DATE y los demás tipos de Oracle?

Se quedan tal cual: NUMBER con su precisión, DATE, TIMESTAMP, los intervalos, CHAR y VARCHAR2 con sus longitudes, RAW y los LOB. XMLTYPE y JSON conservan su texto en un CLOB, así que el script carga en 19c.

¿Se conservan las columnas de identidad y las secuencias?

Sí. Las columnas de identidad y las secuencias se quedan tal cual y siguen desde donde la exportación dice que llegaron.

¿Qué pasa con los paquetes, procedimientos y disparadores de PL/SQL?

Aparecen en el informe por nombre y no se convierten, para que puedas volver a crearlos una vez cargadas las tablas.

¿En qué versiones de Oracle carga el script?

Oracle 19c y posteriores. Cada exportación de prueba carga en 21c y 23ai, y se detiene en el primer error si algo sale mal.