oracle dbms awm,oracle – 如果出现错误,如何使DBMS_DATAPUMP错误?

我正在使用dbms_datapump包知道.以下过程在一个表中搜索将要导出的模式. BACKUP_INFO_MOD是一个PRAGMA AUTONOMOUS TRANSACTION的程序,它在另一个表中创建日志.

this document的例6.3给了我很多帮助.这是我的代码中的片段(附加注释):

CREATE OR REPLACE PROCEDURE BACKUP_EXECUTE (

threads in number := 1

, dir in varchar2 := 'DATA_PUMP_DIR'

) AS

schemas varchar2(255);

filename varchar2(255);

path varchar2(255);

errormsg varchar2(4000);

handle number;

job_state varchar2(30);

--variables under this line are important to error handling

logs ku$_LogEntry;

lindx pls_integer;

status ku$_Status;

exporterr exception; --our exception to handle export errors

[...]

BEGIN

[...]

schemas:=schema_list(indx).schema_name;

--Full dir path for logs

select directory_path into path from dba_directories where directory_name=dir;

--If data not found then automatically raise NO_DATA_FOUND

select to_char(sysdate, 'YYMMDDHH24MI-')||lower(schemas)||'.dmp' into filename from dual;

backup_info_mod('insert',path||filename,schemas);

begin --For inner exception handling on short fragment

handle := dbms_datapump.open('EXPORT','SCHEMA');

dbms_datapump.add_file(handle, filename, dir); --dump file

dbms_datapump.add_file(handle, filename||'.log', dir,null,DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE); --export log file

dbms_datapump.metadata_filter(handle, 'SCHEMA_EXPR', 'IN ('''||schemas||''')');

dbms_datapump.set_parallel(handle,threads);

backup_info_mod(file_name=>path||filename, curr_status=>'IN PROGRESS');

dbms_datapump.start_job(handle);

--If job didn't start due to some errors, then let's get some information

exception

when others then

dbms_datapump.get_status(handle,8,0,job_state,status);

--This will overwrite our job_state and status

end;

--Let's go handle error if job_state was overwritten

if job_state is not null then

raise exporterr;

else

job_state:='UNDEFINED';

end if;

--Checking in loop if errors occurred. I'm not using wait_for_job

--because it didn't work out

while (job_state != 'COMPLETED') and (job_state != 'STOPPED') loop

--Like before, let's get some information

dbms_datapump.get_status(handle,8,-1,job_state,status);

--Looking for errors using mask

if (bitand(status.mask,dbms_datapump.ku$_status_job_error) != 0) then

--If occurred: let's stop the export job and raise an error

dbms_datapump.stop_job(handle);

dbms_datapump.detach(handle);

raise exporterr;

exit;

end if;

end loop;

backup_info_mod(file_name=>path||filename, curr_status=>'COMPLETED');

dbms_datapump.detach(handle);

exception

when NO_DATA_FOUND then

backup_info_mod('insert',null,schemas,'ERROR','No '||dir||' defined in dba_directories');

when exporterr then

--Let's get all error messages and write it to errormsg variable

logs:=status.error;

lindx:=logs.FIRST;

while lindx is not null loop

errormsg:=errormsg||logs(lindx).LogText;

lindx:=logs.NEXT(lindx);

if lindx is not null then

errormsg:=errormsg||' | '; --Just to separate error messages

end if;

end loop;

backup_info_mod(

file_name=>path||filename,

curr_status=>'ERROR',

errormsg=>errormsg);

/*when other then --TODO

null;

*/

end;

END BACKUP_EXECUTE;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值