ITPub博客

首页 > Linux操作系统 > Linux操作系统 > DBMS_DATAPUMP的应用

DBMS_DATAPUMP的应用

原创 Linux操作系统 作者:love2008 时间:2009-07-04 15:59:25 0 删除 编辑

上周有个PUB网友问了一个问题

他的描述是这样的,写了个unix脚本运行impdp,并且想在impdp运行完以后运行另外一个脚本更新一些数据库的对象。可是问题来了:impdp一运行就退出了,数据导入的工作在后台继续运行,但是我的脚本却继续往下运行,但是后续的命令应该是在数据导入工作完成以后才进行的。怎么办?

他是利用DBMS_DATAPUMP脚本导出的。

这是我的测试案例

SQL> truncate table test;

表被截断。

SQL> declare
  2  h1   NUMBER;
  3  l1   varchar2(20);
  4  l_cnt number;
  5  begin
  6     h1 := dbms_datapump.open (operation => 'IMPORT', job_mode => 'TABLE', job_name => 'ddIMPORT_1231', version => 'COMPATIBLE');
  7     dbms_datapump.add_file(handle => h1, filename => 'imptest.log', directory => 'FILE_DIR', filetype => 3);
  8     dbms_datapump.set_parameter(handle => h1, name => 'KEEP_MASTER', value => 0);
  9     dbms_datapump.add_file(handle => h1, filename => 'TEST_DUMP.dmp', directory => 'FILE_DIR', filetype => 1);
 10     dbms_datapump.set_parameter(handle => h1, name => 'DATA_ACCESS_METHOD', value => 'AUTOMATIC');
 11     dbms_datapump.set_parameter(handle => h1, name => 'INCLUDE_METADATA', value => 0);
 12     dbms_output.put_line('start.....'||sysdate);
 13     dbms_datapump.start_job(handle => h1, skip_current => 0, abort_step => 0);
 14     dbms_datapump.detach(handle => h1);
 15     select count(*) into l_cnt from test;
 16     dbms_output.put_line('stop.....'||sysdate);
 17     dbms_output.put_line('cnt:'||l_cnt);
 18  end;
 19  /
start.....2009-07-02 18:02:55
stop.....2009-07-02 18:02:55
cnt:0

PL/SQL 过程已成功完成。

SQL> truncate table test;

表被截断。

SQL> declare
  2  h1   NUMBER;
  3  l1   varchar2(20);
  4  l_cnt number;
  5  begin
  6     h1 := dbms_datapump.open (operation => 'IMPORT', job_mode => 'TABLE', job_name => 'ddIMPORT_1231', version => 'COMPATIBLE');
  7     dbms_datapump.add_file(handle => h1, filename => 'imptest.log', directory => 'FILE_DIR', filetype => 3);
  8     dbms_datapump.set_parameter(handle => h1, name => 'KEEP_MASTER', value => 0);
  9     dbms_datapump.add_file(handle => h1, filename => 'TEST_DUMP.dmp', directory => 'FILE_DIR', filetype => 1);
 10     dbms_datapump.set_parameter(handle => h1, name => 'DATA_ACCESS_METHOD', value => 'AUTOMATIC');
 11     dbms_datapump.set_parameter(handle => h1, name => 'INCLUDE_METADATA', value => 0);
 12     dbms_output.put_line('start.....'||sysdate);
 13     dbms_datapump.start_job(handle => h1, skip_current => 0, abort_step => 0);
 14     dbms_datapump.WAIT_FOR_JOB(handle => h1, job_state=>l1);
 15     dbms_datapump.detach(handle => h1);
 16     select count(*) into l_cnt from test;
 17     dbms_output.put_line('stop.....'||sysdate);
 18     dbms_output.put_line('status.....'||l1);
 19     dbms_output.put_line('cnt:'||l_cnt);
 20  end;
 21  /
start.....2009-07-02 18:03:10
stop.....2009-07-02 18:03:14
status.....COMPLETED
cnt:20012

PL/SQL 过程已成功完成。

SQL>

 

主要是利用了WAIT_FOR_JOB来实现这个问题。因为START_JOB运行之后就完成了,而WAIT_FOR_JOB是等待这个JOB完成才退出的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/728254/viewspace-608320/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-10

  • 博文量
    78
  • 访问量
    1114188