xj4150 发表于 2013-1-29 15:21:34

存储过程查询结果打印很慢,求解

存储过程查询结果打印很慢,不知为何,代码如下:

create or replace procedure sp_tbl_asset_sign (
jie_ASSET_NUMout int,--数量(借方)
jie_PRICE out FLOAT,--单价(借方)
jie_JINE out FLOAT,--金额(借方)
dai_ASSET_NUMout int,--数量(贷方)
dai_PRICE out FLOAT ,      --)单价(贷方)
dai_JINEout FLOAT,      --金额(贷方)

jie_ASSET_NUM_MONTHout int,--数量(借方)
jie_PRICE_MONTHout FLOAT,--单价(借方)
jie_JINE_MONTH   out FLOAT,--金额(借方)
dai_ASSET_NUM_MONTH out int,--数量(贷方)
dai_PRICE_MONTHout FLOAT,      --)单价(贷方)
dai_JINE_MONTH   out FLOAT,      --金额(贷方)
SUMPRICE_MONTHout FLOAT,   --合计

jie_ASSET_NUM_YEARout int,--数量(借方)
jie_PRICE_YEARout FLOAT,--单价(借方)
jie_JINE_YEAR   out FLOAT,--金额(借方)
dai_ASSET_NUM_YEARout INTEGER,--数量(贷方)
dai_PRICE_YEARout FLOAT,      --)单价(贷方)
dai_JINE_YEAR   out FLOAT,      --金额(贷方)
SUMPRICE_YEARout FLOAT,   --合计

SUMPRICE_LAST_YEARout FLOAT, --上一年合计
SUMPRICEout FLOAT,   --合计
buy_dateout Date,   --购买日期
ASSET_CODEout VARCHAR2,--凭证号
MODEL1out VARCHAR2, --摘要
yearsin varchar2    --年(输入值)

)

as

startTime varchar2(100);   --开始时间(主要为了查询输入时间之前的所有信息)
         
moth1varchar2(20);         --类型
moth2 varchar2(20);          --类型
moth3varchar2(20);         --类型
moth4varchar2(20);         --类型

jie_lastSum float;         --之前总金额(借方)
dai_lastSum float;         --之前总金额(贷方)
jie_nowSum float;            --当前总金额(借方)
dai_nowSum float;            --当前总金额(贷方)
jie_nowNumSum int;         --当前数量总数(借方)
dai_nowNumSum int;         --当前数量总数(贷方)
jie_lastNumSum int;          --之前数量总数(借方)
dai_lastNumSum int;          --当前数量总数(贷方)

jie_nowSum_month float;            --当前总金额(借方)
dai_nowSum_month float;            --当前总金额(贷方)
jie_nowNumSum_month int;         --当前数量总数(借方)
dai_nowNumSum_month int;         --当前数量总数(贷方)

begin
   
    moth1:='购入';
    moth2:='报废';
    moth3:='调入';
    moth4:='调出';
    --初始化数值
    jie_lastSum:=0;
    dai_lastSum:=0;
    jie_nowSum :=0;
    dai_nowSum :=0;
    jie_nowNumSum :=0;
    dai_nowNumSum :=0;
    jie_lastNumSum :=0;
    dai_lastNumSum :=0;
   
    select to_char(to_date(mon, 'yyyymmdd'), 'yyyy/mm/dd')
            into startTime

          from (select years || to_char(aa, '09') || '01' mon, aa
                  from (select 1 aa
                        from dual

                        ));
   --查询之前信息
   --计算方式:总金额=总金额 + 数量*单价
   for lastS in( select * from TBL_ASSET_SIGN where to_char(buy_day,'yyyy/mm/dd') <= startTime andvalue_4='1' and IS_DELETED='0'and USE_DEPT is not null)
   
   loop
   --如果类型是购入时汇总
   if lasts.move_method =moth1then
   
      
   jie_lastSum :=jie_lastSum + lasts.asset_num * lasts.price;
   jie_lastNumSum := jie_lastNumSum + lasts.asset_num;
   
   --如果类型是调入时汇总
   ELSIF lasts.move_method =moth3then
   
   jie_lastSum :=jie_lastSum + lasts.asset_num * lasts.price;
   jie_lastNumSum := jie_lastNumSum + lasts.asset_num;
   
   else
   
   dai_lastSum :=dai_lastSum + lasts.asset_num * lasts.price;
   dai_lastNumSum := dai_lastNumSum + lasts.asset_num;
   
   end if;
   
   end loop;
   
   --之前所有金额计算,公式:借方-贷方

   SUMPRICE_LAST_YEAR :=jie_lastSum - dai_lastSum;
   
   --当前数据汇总
    for dateTimes in (            --遍历12个月份
      select to_char(to_date(mon, 'yyyymmdd'), 'yyyy/mm/dd')
               firstday,
               to_char(LAST_DAY(to_date(mon, 'yyyymmdd')), 'yyyy/mm/dd') lastday

          from (select years || to_char(aa, '09') || '01' mon, aa
                  from (select 1 aa
                        from dual
                        union
                        select 2 aa
                        from dual
                        union
                        select 3 aa
                        from dual
                        union
                        select 4 aa
                        from dual
                        union
                        select 5 aa
                        from dual
                        union
                        select 6 aa
                        from dual
                        union
                        select 7 aa
                        from dual
                        union
                        select 8 aa
                        from dual
                        union
                        select 9 aa
                        from dual
                        union
                        select 10 aa
                        from dual
                        union
                        select 11 aa
                        from dual
                        union
                        select 12 aa from dual)))loop
                        
       --初始化每月的金额和数目      
      jie_nowSum_month :=0;
      dai_nowSum_month :=0;
      jie_nowNumSum_month :=0;
      dai_nowNumSum_month :=0;
      
      
   ----循环
      for em in (select * from TBL_ASSET_SIGN t where(to_char(t.buy_day,'yyyy/mm/dd') between dateTimes.Firstdayand dateTimes.Lastday)andt.value_4='1' and t.IS_DELETED='0' and t.USE_DEPT is not null ) loop
   --如果类型是购入时(单个数据)
       if em.move_method =moth1then
          ASSET_CODE := em.ASSET_CODE;
          MODEL1 := em.MODEL;
          buy_date := em.buy_day;

          jie_ASSET_NUM:=em.asset_num;
          jie_PRICE := em.price;
          jie_JINE := jie_ASSET_NUM * jie_PRICE;


          dai_ASSET_NUM := 0;
          dai_PRICE := 0;
          dai_JINE := dai_ASSET_NUM * dai_PRICE;
      --如果类型是调入时(单个数据)
      ELSIF em.move_method =moth3 then

          ASSET_CODE := em.ASSET_CODE;
          MODEL1 := em.MODEL;
          buy_date := em.buy_day;

          jie_ASSET_NUM:=em.asset_num;
          jie_PRICE := em.price;
          jie_JINE := jie_ASSET_NUM * jie_PRICE;


          dai_ASSET_NUM := 0;
          dai_PRICE := 0;
          dai_JINE := dai_ASSET_NUM * dai_PRICE;
      else

          buy_date := em.BUY_DAY;
          ASSET_CODE := em.ASSET_CODE;
          MODEL1 := em.MODEL;

          jie_ASSET_NUM:=0;
          jie_PRICE :=0;
          jie_JINE := jie_ASSET_NUM * jie_PRICE;

          dai_ASSET_NUM := em.asset_num;
          dai_PRICE := em.price;
          dai_JINE := dai_ASSET_NUM * dai_PRICE;

   end if;

   
   dai_nowSum_month :=dai_nowSum_month +dai_JINE; --将每次计算的金额相加的出每月金额总和(贷方)
   dai_nowNumSum_month := dai_nowNumSum_month + dai_ASSET_NUM;--将每次计算的数目相加的出每月数目总和(贷方)
   
   jie_nowSum_month :=jie_nowSum_month+jie_JINE;   --将每次计算的金额相加的出每月金额总和(借方)
   jie_nowNumSum_month := jie_nowNumSum_month + jie_ASSET_NUM;--将每次计算的数目相加的出每月数目总和(借方)
   
   SUMPRICE := SUMPRICE_LAST_YEAR + jie_JINE - dai_JINE;      --计算当笔数据的总金额
   
      DBMS_OUTPUT.put_line(jie_ASSET_NUM||'----天----'||jie_PRICE||'----天----'||jie_JINE||'----天---'||dai_ASSET_NUM||'----天----'||dai_PRICE||'----天----'||dai_JINE_MONTH||'----天----'||SUMPRICE);
   end loop;
   
   ---一个月循环完成后计算本年信息
   
   dai_JINE_MONTH :=dai_nowSum_month; --将每次计算的金额相加的出每月金额总和(贷方)
   dai_ASSET_NUM_MONTH := dai_nowNumSum_month;--将每次计算的数目相加的出每月数目总和(贷方)
   
   jie_JINE_MONTH :=jie_nowSum_month;   --将每次计算的金额相加的出每月金额总和(借方)
   jie_ASSET_NUM_MONTH := jie_nowNumSum_month;--将每次计算的数目相加的出每月数目总和(借方)
   
    jie_nowSum := jie_nowSum + jie_JINE_MONTH;         --将每个月金额相加,便可对12个月进行信息的累加(借方)
               
    dai_nowSum := dai_nowSum + dai_JINE_MONTH ;      --将每个月金额相加,便可对12个月进行信息的累加(贷方)
   
    jie_nowNumSum :=jie_nowNumSum + jie_ASSET_NUM_MONTH;   --将每个月数目相加,便可对12个月进行信息的累加(借方)
   
    dai_nowNumSum :=dai_nowNumSum + dai_ASSET_NUM_MONTH;   --将每个月数目相加,便可对12个月进行信息的累加(袋方)
   
    jie_PRICE_MONTH :=0;
    dai_PRICE_MONTH :=0;
   
    SUMPRICE_MONTH := SUMPRICE_LAST_YEAR + jie_JINE_MONTH - dai_JINE_MONTH;         --计算每月的总金额   
   
    DBMS_OUTPUT.put_line(jie_ASSET_NUM_MONTH||'----月----'||jie_PRICE_MONTH||'----月----'||jie_JINE_MONTH||'----月----'||dai_ASSET_NUM_MONTH||'----月----'||dai_PRICE_MONTH||'----月----'||dai_JINE_MONTH||'----月----'||SUMPRICE_MONTH);
   

    jie_ASSET_NUM_YEAR := jie_nowNumSum;
   
    jie_PRICE_YEAR :=0;
   
   
    jie_JINE_YEAR :=jie_nowSum;
   
   
    dai_PRICE_YEAR :=0;
    dai_ASSET_NUM_YEAR :=dai_nowNumSum;
   
    dai_JINE_YEAR := dai_nowSum;
   
   
    SUMPRICE_YEAR := SUMPRICE_LAST_YEAR + jie_JINE_YEAR - dai_JINE_YEAR;

    end loop;

end;
页: [1]
查看完整版本: 存储过程查询结果打印很慢,求解