_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です。
わかりました、そのようなエクスポートファイルの作成が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;