系统成本核算,比较复杂,因此采用 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;**