ITPub博客

首页 > 数据库 > Oracle > 批量绑定中的SAVE EXCEPTION 子句

批量绑定中的SAVE EXCEPTION 子句

原创 Oracle 作者:yaanzy 时间:2008-07-06 12:48:36 0 删除 编辑

Oracle 从9i 开始增强了批 DML 在发生异常时处理的错误及失败的程序执行能力。这是通过
FORALL 语句的 SAVE EXCEPTION 子句来实现,其语法如下:

FORALL index in lower..upper save exceptions

SAVE EXCEPTIONS 子句是 oracle 9i 中引入的,它在一个隐式游标属性
SQL%BULK_EXCEPTIONS 中保存错误行,允许 FORALL 语句继续处理其余行。

下面这一段代码是 SQL%BULK_EXCEPTIONS 的应用例子:

[@more@]

create or replace procedure batch_dml(errnum outnumber,errtext outvarchar2)
is


type user_id_tab istableofnumberindexbybinary_integer;
type user_name_tab istableofvarchar2( 20 ) indexbybinary_integer;
type user_sex_tab istableofvarchar2( 2 ) indexbybinary_integer;

user_id user_id_tab;
user_name user_name_tab;
user_sex user_sex_tab;

bulk_bind_excep EXCEPTION;
pragmaexception_init(bulk_bind_excep,- 24381 );
begin
for idx in 1 .. 50000 loop --3?ê??ˉindex-by????
user_id(idx):=idx;
user_name(idx):= 'xxx' ||idx;
user_sex(idx):= 'F' ;
endloop;
user_id( 40000 ):= 39999 ;
user_id( 10000 ):= 9999 ;
deletefrom t_user;
forall idx in user_id.first..user_id.lastsaveexceptions
insertinto t_user values(user_id(idx), user_name(idx),user_sex(idx));
errnum:= 0 ;
errtext:= '' ;
exception
when bulk_bind_excep then
for i in 1 ..sql%bulk_exceptions.countloop
dbms_output.put_line( 'Iteration '
||SQL%bulk_exceptions(i).error_index|| 'failed with error '
||sqlerrm(sql%bulk_exceptions(i).error_code));
endloop;
commit;
whenothersthen
commit;
errnum:=sqlcode;
errtext:=sqlerrm;
end batch_dml;


这个例子是修改了上面的程序,加上 save exceptions 异常处理,当批 dml
发生异常时也能正常运行。

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

请登录后发表评论 登录
全部评论
  • 博文量
    108
  • 访问量
    760224