上周有个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/