更新数据映射是否在SQL中成功

时间:2015-12-24 14:24:12

标签: sql oracle oracle-sqldeveloper

我有两张表abcxyz。我将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_messgaeprocessed有2列。

我必须更新这些列值,例如,如果数据已成功插入abc/xyz,那么应填充processed列,并且应填充notcessfult error_message列。 任何想法我应该如何去做..我必须在我的开始块中插入这个逻辑

1 个答案:

答案 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违规。您可能不希望将其标记为统一表中的失败,但您仍可以将错误消息添加为警告或注释。