DBMS_DATAPUMP的应用

上周有个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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/728254/viewspace-608320/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值