ORACLE 会话级别临时表锁表

系统成本核算,比较复杂,因此采用 oracle 包与包体 内部嵌入 存储过程的方式进行结算,由于数据量比较大,每次结算在一个表中3千多万条数据出现多次检索与更新,因此采用会话级临时表将不同公司的计算隔离开,但是每月结算时,结完几家公司后临时表就会出现锁表,找不到原因,兄弟们谁遇到这个问题.怎么解决,部分代码展示:

function mainRun(lockId in varchar2) return varchar2 is
      --返回结果集
      --401 未找到要结算的单据
      --402 未找到上个月的月结单
      --200 正常
      resultSet number(5);
      monlockID varchar2(20);
      --接收赋值 公司 农场 月份
      corp varchar2(30);
      fa varchar2(30);
      mon varchar2(30);
    begin
      
      --清除临时表数据
      --execute immediate 'TRUNCATE TABLE PB_BALANCE_TMP_ACCOUNT';  
      --execute immediate 'TRUNCATE TABLE PB_BALANCE_TMP_ACCOUNT_DTL';
      --execute immediate 'TRUNCATE TABLE PB_BALANCE_TMP_PIG';
      --execute immediate 'TRUNCATE TABLE PB_BALANCE_TMP_PIG_DTL';
      
      DELETE FROM PB_BALANCE_TMP_ACCOUNT;
      DELETE FROM PB_BALANCE_TMP_ACCOUNT_DTL; 
      DELETE FROM PB_BALANCE_TMP_PIG;
      DELETE FROM PB_BALANCE_TMP_PIG_DTL;
      
      COMMIT;
    
      monlockID := lockId;
      --为公司,农场,月份赋值
      select t.corporation,t.month,t.farm into corp,mon,fa from pb_monthlock t where t.id=monlockID and t.monlockstate=0;
      if corp is null or mon is null or fa is null then
         resultSet := 401;
      else
         --前置验证数据
         resultSet := preProcess(corp,fa,mon);
      end if;
         --结算成本
      if resultSet = 200 then
        resultSet := account(corp,fa,mon);
      end if;
        --处理临时表数据
      if resultSet = 200 then
        resultSet := process_tmptable_cost(corp,fa,mon);
      end if;

      return resultSet;
end mainRun;**


你所的锁表问题,到底是表锁?还是行级锁?不管那种在Oracle是比较容易定位的,只要在发生问题时监控锁表对象,以及阻塞语句立刻就能定位到了。然后再根据SQL找代码基本就能定位。