日期:2014-05-17  浏览次数:20966 次

oracle9i中存储过程执行的怪问题
create   or   replace   procedure   FAULT_ARCHFAULTINFO_PROC(   sh_no   in   varchar2)
as
        v_flow_inst   number;
begin
        select   PROCESSINSTID   into   v_flow_inst  
                        from   FAULT_SHEET_TD   where             SHEET_NO=sh_no;
        insert   into   HISFAULT_SHEET_TD  
                        (select   *   from   FAULT_SHEET_TD   where   SHEET_NO=sh_no);
        ......
        ......
        ......
        delete   from   FAULT_SHEET_TD   where   SHEET_NO=sh_no;
        commit;
end   FAULT_ARCHFAULTINFO_PROC;

上面的一个存储过程是一个将记录归档的存储过程,就是把某张运行表的记录导入历史表,再将运行表中的记录删除。
现在出现的问题是,我通过
select   count(a.SHEET_NO)   from   fault_sheet_td   a,   hisfault_sheet_td   b  
            where   a.sheet_no=b.sheet_no
发现在运行表里和历史表里存在不少相同SHEET_NO的记录!!!注意,SHEET_NO字段在运行表和历史表都是主键。同一SHEET_NO的记录要么在运行表,要么被归档到历史表,不可能同时出现在两张表中。
        如果单是这样,还可以说是我的存储过程没有明确的开始事务造成的。但是我发现,在运行表中的记录,和历史表中的记录相比,有几个字段的值是空的,而且固定就是那几个字段,其他字段值和历史表中完全一样。
        如果只是事务问题,那么我delete运行表时,也不至于有的字段的值被删掉了,有的字段的值还存在啊。
        忒奇怪了,请高手相助!!!



------解决方案--------------------
是不是中间有报错
两个表结构完全一样吗

自己用TOAD跟踪一下
------解决方案--------------------
请从程序流程控制角度查原因,事务问题不大可能。
------解决方案--------------------
写触发器记录一下,然后对比一下每次的操作细节。
------解决方案--------------------
以上各位都说的很对,请照做以后再反馈