Ошибка в основной таблице при импорте одной таблицы с использованием Oracle DBMS_DATAPUMP - PullRequest
0 голосов
/ 03 октября 2018

Эта проблема была обнаружена только в Oracle 12.2.Oracle 12.1, кажется, в порядке.Я предоставляю все для воспроизведения, но вам также необходимо создать каталог Oracle.Я назвал его DUMP_DIRECTORY.

У нас есть 2 процедуры SQL:

  1. EXPORT_TABLE: экспорт таблицы.
  2. IMPORT_TABLE: импорт таблицы.

Сначала мы создаем простую таблицу:

create table MY_TABLE as select 1 as my_column from dual;

Во-вторых, мы вызываем процедуру экспорта:

call EXPORT_TABLE('MY_EXPORT_JOB', 'DUMP_DIRECTORY', 'file.dat', 'MY_TABLE', 'export.log');

В-третьих, мы удаляем таблицу:

drop table MY_TABLE;

Наконец, мы вызываем процедуру импорта:

call IMPORT_TABLE('MY_IMPORT_JOB', 'DUMP_DIRECTORY', 'file.dat', 'import.log');

Почти все выглядит нормально:

  • Процедуры успешно выполнены.
  • В * 1028 нет ошибокexport.log и import.log .
  • Таблица правильно импортирована обратно.

Но в основной таблице задания импорта есть ошибки:

select ERROR_COUNT, OBJECT_TYPE_PATH from MY_IMPORT_JOB where ERROR_COUNT > 0;

ERROR_COUNT OBJECT_TYPE_PATH
----------- -------------------------------------------------------------------
          1 SCHEMA_EXPORT/TABLE/TABLE
          1 SCHEMA_EXPORT/TABLE/TABLE

Как исправить или избежать этих ошибок?

Вот процедура EXPORT_TABLE:

create or replace procedure EXPORT_TABLE
(
    JOB_NAME varchar2,
    DIRECTORY_NAME varchar2,
    DMP_FILE_NAME varchar2,
    TABLE_NAME varchar2,
    LOG_FILE_NAME varchar2
)
as
begin
    declare
        handle number(24);
    begin
        -- Open the handle
        handle := DBMS_DATAPUMP.open('EXPORT', 'SCHEMA', NULL, JOB_NAME);

        -- Keep master table to be able to use get_status
        DBMS_DATAPUMP.set_parameter(handle, 'KEEP_MASTER', 1);

        -- Configure files
        DBMS_DATAPUMP.add_file(handle, DMP_FILE_NAME, DIRECTORY_NAME);
        DBMS_DATAPUMP.add_file(handle, LOG_FILE_NAME, DIRECTORY_NAME, null, DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);

        -- Filter on given table names
        DBMS_DATAPUMP.metadata_filter(handle, 'NAME_LIST', ''''||TABLE_NAME||'''', 'TABLE');
        DBMS_DATAPUMP.metadata_filter(handle, 'INCLUDE_PATH_EXPR', '= ''TABLE''');

        DBMS_DATAPUMP.start_job(handle);

        -- Disconnects a user session from a job.
        DBMS_DATAPUMP.detach(handle);
    end;
end;

Вот процедура IMPORT_TABLE:

create or replace procedure IMPORT_TABLE
(
    JOB_NAME varchar2,
    DIRECTORY_NAME varchar2,
    DMP_FILE_NAME varchar2,
    LOG_FILE_NAME varchar2
)
as
begin
    declare
        handle number(24);
    begin
        handle := DBMS_DATAPUMP.open('IMPORT', 'FULL', NULL, JOB_NAME);

        -- Keep master table to be able to use get_status
        DBMS_DATAPUMP.set_parameter(handle, 'KEEP_MASTER', 1);
        DBMS_DATAPUMP.set_parameter(handle, 'METRICS', 1);

        -- Configure files
        DBMS_DATAPUMP.add_file(handle, DMP_FILE_NAME, DIRECTORY_NAME);
        DBMS_DATAPUMP.add_file(handle, LOG_FILE_NAME, DIRECTORY_NAME, null, DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);

        -- Change default behavior
        DBMS_DATAPUMP.set_parameter(handle, 'TABLE_EXISTS_ACTION', 'REPLACE');

        -- Start the job
        DBMS_DATAPUMP.start_job(handle);

        -- Disconnects a user session from a job.
        DBMS_DATAPUMP.detach(handle);
    end;
end;
...