web-dev-qa-db-ja.com

DBMS_DATAPUMPを使用してSQLファイルを生成する方法

_DBMS_DATAPUMP_ apiを使用してSQLファイルを生成しようとしています。このタスクは、Oracleサポートノート1519981.1(DBMS_DATAPUMP APIを使用してSQLファイルを生成する方法)で具体的に対処されています。

上記のドキュメントで見つかったコードをコピーして貼り付けると、5行目で失敗してかなりわかりにくい

_ERROR at line 1:
ORA-39001: invalid argument value
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79
ORA-06512: at "SYS.DBMS_DATAPUMP", line 3444
ORA-06512: at "SYS.DBMS_DATAPUMP", line 3693
ORA-06512: at line 5
_

問題の行、つまり5行目は、パラメーター_filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_SQL_FILE_を指定したDBMS_DATAPUMP.add_file(...)です。

DBA権限を持つユーザーでスクリプトを実行しました。

MYDIRという名前のOracleディレクトリも作成しました。それが指すOSディレクトリが存在し、書き込み可能です。

失敗する完全なコードは(メモからコピー)です。

_DECLARE
  h1 NUMBER;
BEGIN
  h1 := DBMS_DATAPUMP.open(operation => 'SQL_FILE', job_mode => 'SCHEMA', job_name => 'j2');
 DBMS_DATAPUMP.add_file(handle => h1,
   filename => 'scott.dmp',
   directory => 'MYDIR',
   filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE);
 DBMS_DATAPUMP.add_file(handle => h1,
   filename => 'scott.sql',
   directory => 'MYDIR',
   filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_SQL_FILE );
 DBMS_DATAPUMP.start_job(handle => h1, skip_current => 0, abort_step => 0);
 DBMS_DATAPUMP.detach(handle => h1);
END;
/
_

バージョンは11.2.0.1です。

4

わかりました、そのようなエクスポートファイルの作成が2つのステップで構成されていることを知りませんでした。まず、通常のダンプファイルを作成する必要があります。次に、このダンプファイルを使用してSQLファイルを作成します。

そのようなダンプファイルを持っていなかったので、投稿されたスクリプトは機能しませんでした。

SQLファイルを作成できるように、2つのステップがあります。

declare

  datapump_job number;
  job_state    varchar2(20);

begin

  datapump_job := dbms_datapump.open(
    operation    => 'EXPORT',
    job_mode     => 'SCHEMA',
    remote_link  =>  null,
    job_name     => 'Export dump file',
    version      => 'LATEST'
  );

  dbms_output.put_line('datapump_job: ' || datapump_job);


  dbms_datapump.add_file(
    handle    =>  datapump_job,
    filename  => 'export.dmp',
    directory => 'DATAPUMP_DIR',
    filetype  =>  dbms_datapump.ku$_file_type_dump_file);


  dbms_datapump.start_job(
    handle       => datapump_job,
    skip_current => 0,
    abort_step   => 0);

  dbms_datapump.wait_for_job(datapump_job, job_state);

  dbms_output.put_line('Job state: ' || job_state);

  dbms_datapump.detach(datapump_job);

end;
/

sqlファイルを作成するスクリプト:

declare

  datapump_job number;
  job_state    varchar2(20);

begin

  datapump_job := dbms_datapump.open(
    operation    => 'SQL_FILE',
    job_mode     => 'SCHEMA',
    remote_link  =>  null,
    job_name     => 'Export SQL file',
    version      => 'LATEST'
  );

  dbms_output.put_line('datapump_job: ' || datapump_job);

  dbms_datapump.add_file(
    handle    =>  datapump_job,
    filename  => 'export.dmp',
    directory => 'DATAPUMP_DIR',
    filetype  =>  dbms_datapump.ku$_file_type_dump_file);

  dbms_datapump.add_file(
    handle    =>  datapump_job,
    filename  => 'schema.sql',
    directory => 'DATAPUMP_DIR',
    filetype  =>  dbms_datapump.ku$_file_type_sql_file);

  dbms_datapump.start_job(
    handle       => datapump_job,
    skip_current => 0,
    abort_step   => 0);

  dbms_datapump.wait_for_job(datapump_job, job_state);

  dbms_output.put_line('Job state: ' || job_state);

  dbms_datapump.detach(datapump_job);

end;
2