Chuyển đến nội dung
Trang chủ IntoSQL

Chuyển bản xuất Oracle sang Oracle cũ hơn hoặc mới hơn

Thả tệp .sql mà Database Export của SQL Developer hoặc SQLcl viết, với các bảng và câu lệnh Insert, và tải xuống tập lệnh nạp được trên Oracle 19c trở lên. NUMBER, DATE, TIMESTAMP, LOB, identity và sequence giữ nguyên, XMLTYPE và JSON giữ văn bản trong CLOB, và mọi thay đổi được liệt kê trong báo cáo.

Tệp của bạn
sqlshop_2024_oracle.sqlTệp mẫu, 9,3 kB
Cơ sở dữ liệu của bạn

Đã chuyển đổi 18 hàng, không có bản sửa, không hàng nào bị từ chối

Hiển thị

Các bảng trong shop_2024_oracle.sqlBản dump Oracle · do SQL Developer ghi · utf-8

  • customersghi thành CUSTOMERS8 hàng
    7 cột
    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
  • ordersghi thành ORDERS10 hàng
    9 cột
    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;

Bản sửa

Không có gì cần sửa.

Tệp được chuyển đổi ngay trên máy tính này và không bao giờ được tải lên.

Mẫu khác:

Những gì thay đổi giữa tệp và tập lệnh

Mỗi hàng là một quy tắc trình chuyển đổi áp dụng, kèm dòng báo cáo được ghi khi quy tắc thay đổi dữ liệu của bạn.

  • BOOLEAN (23ai)

    BOOLEAN trên 23ai, nếu không thì NUMBER(1) kèm CHECK 0 và 1

    TRUE và FALSE vẫn là true và false.

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

    cùng các kiểu, với độ dài BYTE hoặc CHAR của chúng

    Cùng các kiểu văn bản; LONG thành CLOB, kiểu mà mọi phiên bản từ 8 trở đi ưu tiên.

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

    VARCHAR2(4000 CHAR) khi mọi giá trị vừa 4000 byte, nếu không thì CLOB

    VARCHAR2 mặc định chứa 4000 byte và Oracle không lập chỉ mục được CLOB, nên văn bản giữ VARCHAR2 khi giá trị vừa và là CLOB khi không vừa.

    Dòng báo cáo: text_as_lob

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

    cùng các kiểu NUMBER

    Cùng các kiểu NUMBER và FLOAT, với mọi chữ số.

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    cùng các kiểu INTERVAL

    Cùng các interval.

  • DATE, TIMESTAMP(p)

    DATE và TIMESTAMP(p), như đã khai báo

    Cùng các kiểu, nên mọi ngày giữ thời gian đến từng giây.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    cùng các kiểu

    Oracle giữ độ lệch từ -12:00 đến +14:00; giá trị có độ lệch vượt quá -12:00 được ghi theo UTC, cùng một thời điểm.

  • JSON (21c), and CLOB holding JSON

    JSON trên 21c trở lên, nếu không thì CLOB

    Cùng các giá trị JSON; NULL của SQL mà bản xuất ghi thành 'null' vẫn là NULL.

  • BLOB, RAW(n), LONG RAW

    cùng các kiểu; LONG RAW thành BLOB

    Byte vẫn là byte.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    CLOB với văn bản của chúng

    XMLTYPE, ROWID và UROWID giữ văn bản trong CLOB, nên tập lệnh nạp được trên mọi phiên bản từ 19c.

    Dòng báo cáo: type_replaced

  • collations that ignore case (BINARY_CI)

    so sánh chính xác

    Collation của cột không được viết, nên cột từng không phân biệt hoa thường (BINARY_CI) giờ phân biệt Ana và ana.

    Dòng báo cáo: case_insensitive_collation

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

    GENERATED BY DEFAULT ON NULL AS IDENTITY, tiếp tục sau id lớn nhất

    Các id đã sao chép được nạp nguyên trạng, và bộ đếm tiếp tục sau id lớn nhất. Cột được trình kích hoạt điền từ sequence (cách làm trước 12c) cũng là cột identity.

  • identity columns the target can't count

    một số nguyên thường

    Oracle đếm một cột identity mỗi bảng; cột khác giữ giá trị mà không có bộ đếm.

    Dòng báo cáo: counter_dropped

  • CREATE SEQUENCE

    CREATE SEQUENCE với cùng các tùy chọn

    Bản xuất ghi điểm sequence đã chạy đến làm START WITH của nó, nên nó tiếp tục từ đó.

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

    cột ảo

    Cùng các cột ảo.

    Dòng báo cáo: stored_as_virtual

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

    một cột thường

    Công thức không viết được cho Oracle để lại một cột thường và một dòng trong báo cáo; giá trị mà bản xuất ghi cho cột ảo bị bỏ qua, và Oracle không có gì để tính.

    Dòng báo cáo: generated_not_translated

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

    không có giá trị mặc định

    Giá trị mặc định không viết được sẽ bị bỏ và được báo cáo.

    Dòng báo cáo: default_not_translated

  • CHECK constraints

    được chuyển đổi

    Cùng các ràng buộc kiểm tra, được kiểm tra khi từng hàng được nạp.

  • CHECK constraints with functions IntoSQL doesn't write

    không được tạo

    Ràng buộc kiểm tra không viết được sẽ bị bỏ và được báo cáo.

    Dòng báo cáo: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    không được tạo

    Oracle không áp dụng các ràng buộc kiểm tra này cho các hàng đã có sẵn, nên các hàng có thể vi phạm chúng.

    Dòng báo cáo: check_not_enforced

  • function-based, bitmap and domain indexes

    không được tạo

    IntoSQL ghi chỉ mục b-tree trên toàn bộ cột; hãy tạo lại các chỉ mục khác sau khi nạp.

    Dòng báo cáo: index_skipped

  • foreign keys

    sau dữ liệu với ENABLE NOVALIDATE, rồi xác thực kèm cảnh báo về hàng mồ côi

    Khóa kiểm tra hàng mới ngay và được xác thực sau cùng; hàng không có hàng cha khiến khóa ở trạng thái chưa xác thực kèm cảnh báo thay vì dừng quá trình nạp.

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

    bị bỏ

    Khóa ngoại của Oracle chỉ hành động khi xóa, với CASCADE hoặc SET NULL.

    Dòng báo cáo: foreign_key_action_unsupported

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

    không được tạo

    Khóa không thể tham chiếu tới bảng không tồn tại, và khóa mà Oracle không kiểm tra có thể có hàng không có hàng cha.

    Dòng báo cáo: foreign_key_skipped

  • names longer than Oracle 12.1 allows

    rút ngắn

    Từ 12.2, tên trong Oracle tối đa 128 byte; tên dài hơn sẽ được rút ngắn.

    Dòng báo cáo: name_shortened

  • partitioned tables

    một bảng chứa các hàng của mọi phân vùng

    Các hàng giữ nguyên; hãy phân vùng lại bảng trong Oracle nếu cần.

    Dòng báo cáo: partitions_dropped

  • several schemas in one export

    một schema, mỗi bảng có tên schema ở đầu

    Tập lệnh nạp vào schema của người dùng chạy nó, nên bảng của các schema khác nhau có tên schema ở đầu; bản xuất của một schema giữ nguyên tên bảng.

    Dòng báo cáo: schemas_merged

  • NOT NULL columns with values that become NULL

    bỏ NOT NULL

    Cột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.

    Dòng báo cáo: not_null_relaxed

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

    được liệt kê trong báo cáo

    Mã của chúng viết bằng PL/SQL, nên được liệt kê để bạn tạo lại.

    Dòng báo cáo: not_converted_objects

  • exports without CREATE TABLE (data only)

    kiểu suy ra từ giá trị

    Bản xuất chỉ có dữ liệu thì chỉ có các hàng, nên kiểu được suy ra từ giá trị.

    Dòng báo cáo: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Trình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng; to_date, to_timestamp, TO_CLOB, HEXTORAW và các hàm khác mà bản xuất ghi thì vẫn được đọc.

    Dòng báo cáo: expression_value

  • types IntoSQL doesn't know, and object types

    CLOB

    Văn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp.

    Dòng báo cáo: unknown_type

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

    NULL

    Giá trị không phải ngày sẽ thành NULL và báo cáo đếm nó.

    Dòng báo cáo: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NaN và Infinity được giữ

    Các kiểu số dấu phẩy động của Oracle chứa được NaN và vô cực.

  • NUL characters in text

    được giữ

    VARCHAR2 và CLOB chứa được ký tự NUL, nên giá trị được sao chép nguyên trạng.

  • text that isn't valid in its encoding

    byte lỗi thành ký tự thay thế

    Tập lệnh là UTF-8 và mọi giá trị phải là văn bản hợp lệ.

    Dòng báo cáo: invalid_utf8_replaced

  • text decoded twice (ñ)

    sao chép nguyên trạng

    Tập lệnh chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng.

    Dòng báo cáo: mojibake_suspected

Trong tệpTrong tập lệnhDòng báo cáo
BOOLEAN (23ai)BOOLEAN trên 23ai, nếu không thì NUMBER(1) kèm CHECK 0 và 1TRUE và FALSE vẫn là true và false.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGcùng các kiểu, với độ dài BYTE hoặc CHAR của chúngCùng các kiểu văn bản; LONG thành CLOB, kiểu mà mọi phiên bản từ 8 trở đi ưu tiên.
VARCHAR2 and NVARCHAR2 past what the target's own types holdVARCHAR2(4000 CHAR) khi mọi giá trị vừa 4000 byte, nếu không thì CLOBVARCHAR2 mặc định chứa 4000 byte và Oracle không lập chỉ mục được CLOB, nên văn bản giữ VARCHAR2 khi giá trị vừa và là CLOB khi không vừa.text_as_lob
NUMBER, NUMBER(p,s), FLOAT(b)cùng các kiểu NUMBERCùng các kiểu NUMBER và FLOAT, với mọi chữ số.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDcùng các kiểu INTERVALCùng các interval.
DATE, TIMESTAMP(p)DATE và TIMESTAMP(p), như đã khai báoCùng các kiểu, nên mọi ngày giữ thời gian đến từng giây.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEcùng các kiểuOracle giữ độ lệch từ -12:00 đến +14:00; giá trị có độ lệch vượt quá -12:00 được ghi theo UTC, cùng một thời điểm.
JSON (21c), and CLOB holding JSONJSON trên 21c trở lên, nếu không thì CLOBCùng các giá trị JSON; NULL của SQL mà bản xuất ghi thành 'null' vẫn là NULL.
BLOB, RAW(n), LONG RAWcùng các kiểu; LONG RAW thành BLOBByte vẫn là byte.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYCLOB với văn bản của chúngXMLTYPE, ROWID và UROWID giữ văn bản trong CLOB, nên tập lệnh nạp được trên mọi phiên bản từ 19c.type_replaced
collations that ignore case (BINARY_CI)so sánh chính xácCollation của cột không được viết, nên cột từng không phân biệt hoa thường (BINARY_CI) giờ phân biệt Ana và ana.case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assignsGENERATED BY DEFAULT ON NULL AS IDENTITY, tiếp tục sau id lớn nhấtCác id đã sao chép được nạp nguyên trạng, và bộ đếm tiếp tục sau id lớn nhất. Cột được trình kích hoạt điền từ sequence (cách làm trước 12c) cũng là cột identity.
identity columns the target can't countmột số nguyên thườngOracle đếm một cột identity mỗi bảng; cột khác giữ giá trị mà không có bộ đếm.counter_dropped
CREATE SEQUENCECREATE SEQUENCE với cùng các tùy chọnBản xuất ghi điểm sequence đã chạy đến làm START WITH của nó, nên nó tiếp tục từ đó.
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)cột ảoCùng các cột ảo.stored_as_virtual
virtual columns with functions IntoSQL doesn't write, and the || operatormột cột thườngCông thức không viết được cho Oracle để lại một cột thường và một dòng trong báo cáo; giá trị mà bản xuất ghi cho cột ảo bị bỏ qua, và Oracle không có gì để tính.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)không có giá trị mặc địnhGiá trị mặc định không viết được sẽ bị bỏ và được báo cáo.default_not_translated
CHECK constraintsđược chuyển đổiCùng các ràng buộc kiểm tra, được kiểm tra khi từng hàng được nạp.
CHECK constraints with functions IntoSQL doesn't writekhông được tạoRàng buộc kiểm tra không viết được sẽ bị bỏ và được báo cáo.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEkhông được tạoOracle không áp dụng các ràng buộc kiểm tra này cho các hàng đã có sẵn, nên các hàng có thể vi phạm chúng.check_not_enforced
function-based, bitmap and domain indexeskhông được tạoIntoSQL ghi chỉ mục b-tree trên toàn bộ cột; hãy tạo lại các chỉ mục khác sau khi nạp.index_skipped
foreign keyssau dữ liệu với ENABLE NOVALIDATE, rồi xác thực kèm cảnh báo về hàng mồ côiKhóa kiểm tra hàng mới ngay và được xác thực sau cùng; hàng không có hàng cha khiến khóa ở trạng thái chưa xác thực kèm cảnh báo thay vì dừng quá trình nạp.
ON DELETE CASCADE that cascades in a cycle or along a second pathbị bỏKhóa ngoại của Oracle chỉ hành động khi xóa, với CASCADE hoặc SET NULL.foreign_key_action_unsupported
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE oneskhông được tạoKhóa không thể tham chiếu tới bảng không tồn tại, và khóa mà Oracle không kiểm tra có thể có hàng không có hàng cha.foreign_key_skipped
names longer than Oracle 12.1 allowsrút ngắnTừ 12.2, tên trong Oracle tối đa 128 byte; tên dài hơn sẽ được rút ngắn.name_shortened
partitioned tablesmột bảng chứa các hàng của mọi phân vùngCác hàng giữ nguyên; hãy phân vùng lại bảng trong Oracle nếu cần.partitions_dropped
several schemas in one exportmột schema, mỗi bảng có tên schema ở đầuTập lệnh nạp vào schema của người dùng chạy nó, nên bảng của các schema khác nhau có tên schema ở đầu; bản xuất của một schema giữ nguyên tên bảng.schemas_merged
NOT NULL columns with values that become NULLbỏ NOT NULLCột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggersđược liệt kê trong báo cáoMã của chúng viết bằng PL/SQL, nên được liệt kê để bạn tạo lại.not_converted_objects
exports without CREATE TABLE (data only)kiểu suy ra từ giá trịBản xuất chỉ có dữ liệu thì chỉ có các hàng, nên kiểu được suy ra từ giá trị.no_schema
expressions in INSERT values other than the ones exports writeNULLTrình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng; to_date, to_timestamp, TO_CLOB, HEXTORAW và các hàm khác mà bản xuất ghi thì vẫn được đọc.expression_value
types IntoSQL doesn't know, and object typesCLOBVăn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp.unknown_type
dates before year 1 and time zones given as region namesNULLGiá trị không phải ngày sẽ thành NULL và báo cáo đếm nó.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENaN và Infinity được giữCác kiểu số dấu phẩy động của Oracle chứa được NaN và vô cực.
NUL characters in textđược giữVARCHAR2 và CLOB chứa được ký tự NUL, nên giá trị được sao chép nguyên trạng.
text that isn't valid in its encodingbyte lỗi thành ký tự thay thếTập lệnh là UTF-8 và mọi giá trị phải là văn bản hợp lệ.invalid_utf8_replaced
text decoded twice (ñ)sao chép nguyên trạngTập lệnh chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng.mojibake_suspected

Nạp tập lệnh vào Oracle

Tập lệnh tạo bảng, sao chép các hàng, rồi thêm khóa, chỉ mục và khóa ngoại, nên nạp nhanh và dừng ở lỗi đầu tiên.

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

Khóa ngoại được thêm với ENABLE NOVALIDATE, nên hàng mới được kiểm tra ngay, rồi được xác thực. Nếu một hàng cũ trỏ tới hàng không tồn tại, tập lệnh cho biết ràng buộc nào và để nó ở trạng thái chưa xác thực, thay vì thất bại giữa chừng.

Với bản dump lớn, hãy chạy SQL*Plus trên cùng máy với cơ sở dữ liệu. Tập lệnh commit sau mỗi 100 hàng. Người dùng chạy tập lệnh cần quyền CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER và CREATE PROCEDURE, cùng hạn mức trên tablespace của mình.

Tạo bản dump Oracle để có kết quả tốt nhất

Trình chuyển đổi đọc những gì bản dump chứa. Các tùy chọn sau giữ lại nhiều dữ liệu hơn trong đó:

  • Trong SQL Developer, chọn Tools, Database Export, với DDL và định dạng dữ liệu Insert. SQLcl ghi ra cùng nội dung với SET SQLFORMAT INSERT.
  • Chạy ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' trước khi xuất: định dạng mặc định ghi ngày mà không có giờ hay thế kỷ.
  • Tệp .dmp từ exp hoặc expdp là nhị phân: hãy nhập nó vào một cơ sở dữ liệu Oracle, chẳng hạn Oracle Database Free trong Docker, rồi xuất bằng SQL Developer.

Những gì không được chuyển đổi

View, trigger, thủ tục, hàm và các đối tượng khác viết bằng ngôn ngữ riêng của Oracle được liệt kê theo tên trong báo cáo, không bao giờ bị bỏ âm thầm, để bạn kiểm tra từng cái với phiên bản Oracle bạn nạp vào trước khi tạo lại.

Câu hỏi về chuyển Oracle giữa các phiên bản

Chưa có câu trả lời ở đây? Hãy viết cho chúng tôi từ trang liên hệ, sẽ có người trả lời. Trang liên hệ

Bản dump của tôi có bị tải lên không?

Không. Trình chuyển đổi chạy trong trình duyệt và đọc bản dump từ ổ đĩa theo từng phần, nên nó không bao giờ rời khỏi máy tính của bạn. Ứng dụng máy tính và dòng lệnh cũng chuyển đổi ngay trên máy tính của bạn.

Bản dump có thể lớn đến đâu?

Trình chuyển đổi không bao giờ giữ toàn bộ bản dump trong bộ nhớ: nó đọc tệp hai lần, theo từng đoạn, và ghi tập lệnh trong lúc đọc. Bản dump nhiều gigabyte vẫn chuyển đổi được trong trình duyệt, trong ứng dụng máy tính và bằng dòng lệnh.

Tôi có chuyển đổi được tệp .dmp từ exp hoặc expdp không?

Không trực tiếp: Data Pump và Export gốc ghi một định dạng nhị phân mà chỉ Oracle đọc được. Hãy nhập nó vào bất kỳ cơ sở dữ liệu Oracle nào, Oracle Database Free chạy trong Docker, rồi xuất bằng Database Export của SQL Developer hoặc SQLcl. Trình chuyển đổi sẽ báo điều này khi nhận được tệp .dmp.

Bản xuất có thể đến từ những phiên bản Oracle nào?

Bản xuất từ SQL Developer và SQLcl, với định nghĩa bảng của DBMS_METADATA, từ Oracle 11g trở lên. Mọi bản xuất thử nghiệm đến từ Oracle 21c và 23ai, trong các phiên kiểu Mỹ, Đức và ISO, và được so với nguồn từng ô một.

NUMBER, DATE và các kiểu Oracle khác sẽ ra sao?

Chúng giữ nguyên: NUMBER với độ chính xác, DATE, TIMESTAMP, interval, CHAR và VARCHAR2 với độ dài, RAW và các kiểu LOB. XMLTYPE và JSON giữ văn bản trong CLOB, nên tập lệnh nạp được trên 19c.

Cột identity và sequence có được giữ không?

Có. Cột identity và sequence giữ nguyên và tiếp tục từ điểm mà bản xuất ghi là chúng đã đạt tới.

Còn gói PL/SQL, thủ tục và trình kích hoạt thì sao?

Chúng được liệt kê theo tên trong báo cáo và không được chuyển đổi, để bạn tạo lại sau khi đã nạp các bảng.

Tập lệnh nạp được trên những phiên bản Oracle nào?

Oracle 19c trở lên. Mọi bản xuất thử nghiệm đều nạp được trên 21c và 23ai, và dừng ở lỗi đầu tiên nếu có sự cố.