我有两张表abc
和xyz
。我将consolidated_table
数据插入到这些表中,如。
create or replace
PACKAGE body XX_package_name
AS
procedure move_data
is
begin
insert into tabe abc
(colum1 ,
column2,
column3)
select column1,column3,column4 from consolidated_table;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line ('ERROR: print_out :: ' || SUBSTR (sqlerrm, 1, 230));
end;
begin
insert into tabe xyz
(colum1 ,
column2,
column3)
select column1,column3,column4 from consolidated_table;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line ('ERROR: print_out :: ' || SUBSTR (sqlerrm, 1, 230));
end;
end;
现在consolidated_table
error_messgae
和processed
有2列。
我必须更新这些列值,例如,如果数据已成功插入abc/xyz
,那么应填充processed
列,并且应填充notcessfult error_message
列。
任何想法我应该如何去做..我必须在我的开始块中插入这个逻辑
答案 0 :(得分:0)
您可能希望使用游标并循环遍历每个项目,如果它在没有错误的情况下插入到两个表中并更新统一表一切都很好,如果有错误它将回滚并更新统一表并显示错误你指定的消息。
create procedure move_data
is
temp_cur sys_refcursor;
tmpCol1 consolidated_tbl.col1%Type;
tmpCol2 consolidated_tbl.col2%Type;
tmpCol3 consolidated_tbl.col3%Type;
begin
begin
open temp_cur for
select col1, col2, col3
from consolidated_tbl
where processed = 'N';
loop
fetch temp_cur into tmpCol1, tmpCol2, tmpCol3;
exit when temp_cur%notfound;
begin
insert into abc (col1, col2, col3)
values (tmpCol1, tmpCol2, tmpCol3);
insert into xyz (col1, col2, col3)
values (tmpCol1, tmpCol2, tmpCol3);
update consolidated_tbl
set processed = 'Y', err_msg = null
where col1 = tmpCol1;
exception
when others then
begin
rollback;
dbms_output.put_line('Failure: Rollback.');
update consolidated_tbl
set processed = 'N', err_msg = 'Could not insert into tables.'
where col1 = tmpCol1;
end;
end;
commit;
end loop;
end;
end;
如果您希望更详细地使用错误消息来指定它所出错的表,可以将异常块添加到每个语句,并通过将消息连接在一起来更新具有正确消息的消息。然后在最后检查消息是否为null,如果它没有进行回滚并更新表中该消息的消息。
另外,作为关于异常使用的说明,这只是一个示例,在实际使用中,您应该捕获特定的异常,而不仅仅是others
。例如,假设您尝试插入表中并且记录已存在导致PK违规。您可能不希望将其标记为统一表中的失败,但您仍可以将错误消息添加为警告或注释。