我是通过plsql进行测试,并进行数据打印,查询数据大约在2千多条,总是显示在执行中,我首次写存储过程,希望大家多多指导。
代码如下:
create or replace procedure sp_tbl_asset_sign (
jie_ASSET_NUM out int,--数量(借方)
jie_PRICE out FLOAT, --单价(借方)
jie_JINE out FLOAT, --金额(借方)
dai_ASSET_NUM out int, --数量(贷方)
dai_PRICE out FLOAT , --)单价(贷方)
dai_JINE out FLOAT, --金额(贷方) jie_ASSET_NUM_MONTH out int,--数量(借方)
jie_PRICE_MONTH out FLOAT, --单价(借方)
jie_JINE_MONTH out FLOAT, --金额(借方)
dai_ASSET_NUM_MONTH out int, --数量(贷方)
dai_PRICE_MONTH out FLOAT, --)单价(贷方)
dai_JINE_MONTH out FLOAT, --金额(贷方)
SUMPRICE_MONTH out FLOAT, --合计 jie_ASSET_NUM_YEAR out int,--数量(借方)
jie_PRICE_YEAR out FLOAT, --单价(借方)
jie_JINE_YEAR out FLOAT, --金额(借方)
dai_ASSET_NUM_YEAR out INTEGER, --数量(贷方)
dai_PRICE_YEAR out FLOAT, --)单价(贷方)
dai_JINE_YEAR out FLOAT, --金额(贷方)
SUMPRICE_YEAR out FLOAT, --合计 SUMPRICE_LAST_YEAR out FLOAT, --上一年合计
SUMPRICE out FLOAT, --合计
buy_date out Date, --购买日期
ASSET_CODE out VARCHAR2, --凭证号
MODEL1 out VARCHAR2, --摘要
years in varchar2 --年(输入值))as
startTime varchar2(100); --开始时间(主要为了查询输入时间之前的所有信息)moth1 varchar2(20); --类型
moth2 varchar2(20); --类型
moth3 varchar2(20); --类型
moth4 varchar2(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 and value_4='1' and IS_DELETED='0' and USE_DEPT is not null) loop
--如果类型是购入时汇总
if lasts.move_method = moth1 then
jie_lastSum :=jie_lastSum + lasts.asset_num * lasts.price;
jie_lastNumSum := jie_lastNumSum + lasts.asset_num; --如果类型是调入时汇总
ELSIF lasts.move_method = moth3 then 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.Firstday and dateTimes.Lastday) and t.value_4='1' and t.IS_DELETED='0' and t.USE_DEPT is not null ) loop
--如果类型是购入时(单个数据)
if em.move_method = moth1 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;
--如果类型是调入时(单个数据)
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_JINE||'----天---'||dai_JINE||'----天----'||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_JINE_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;
DBMS_OUTPUT.put_line(jie_JINE_YEAR||'----年----'||dai_JINE_YEAR||'----年----'||SUMPRICE_YEAR);
end loop; end;
代码如下:
create or replace procedure sp_tbl_asset_sign (
jie_ASSET_NUM out int,--数量(借方)
jie_PRICE out FLOAT, --单价(借方)
jie_JINE out FLOAT, --金额(借方)
dai_ASSET_NUM out int, --数量(贷方)
dai_PRICE out FLOAT , --)单价(贷方)
dai_JINE out FLOAT, --金额(贷方) jie_ASSET_NUM_MONTH out int,--数量(借方)
jie_PRICE_MONTH out FLOAT, --单价(借方)
jie_JINE_MONTH out FLOAT, --金额(借方)
dai_ASSET_NUM_MONTH out int, --数量(贷方)
dai_PRICE_MONTH out FLOAT, --)单价(贷方)
dai_JINE_MONTH out FLOAT, --金额(贷方)
SUMPRICE_MONTH out FLOAT, --合计 jie_ASSET_NUM_YEAR out int,--数量(借方)
jie_PRICE_YEAR out FLOAT, --单价(借方)
jie_JINE_YEAR out FLOAT, --金额(借方)
dai_ASSET_NUM_YEAR out INTEGER, --数量(贷方)
dai_PRICE_YEAR out FLOAT, --)单价(贷方)
dai_JINE_YEAR out FLOAT, --金额(贷方)
SUMPRICE_YEAR out FLOAT, --合计 SUMPRICE_LAST_YEAR out FLOAT, --上一年合计
SUMPRICE out FLOAT, --合计
buy_date out Date, --购买日期
ASSET_CODE out VARCHAR2, --凭证号
MODEL1 out VARCHAR2, --摘要
years in varchar2 --年(输入值))as
startTime varchar2(100); --开始时间(主要为了查询输入时间之前的所有信息)moth1 varchar2(20); --类型
moth2 varchar2(20); --类型
moth3 varchar2(20); --类型
moth4 varchar2(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 and value_4='1' and IS_DELETED='0' and USE_DEPT is not null) loop
--如果类型是购入时汇总
if lasts.move_method = moth1 then
jie_lastSum :=jie_lastSum + lasts.asset_num * lasts.price;
jie_lastNumSum := jie_lastNumSum + lasts.asset_num; --如果类型是调入时汇总
ELSIF lasts.move_method = moth3 then 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.Firstday and dateTimes.Lastday) and t.value_4='1' and t.IS_DELETED='0' and t.USE_DEPT is not null ) loop
--如果类型是购入时(单个数据)
if em.move_method = moth1 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;
--如果类型是调入时(单个数据)
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_JINE||'----天---'||dai_JINE||'----天----'||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_JINE_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;
DBMS_OUTPUT.put_line(jie_JINE_YEAR||'----年----'||dai_JINE_YEAR||'----年----'||SUMPRICE_YEAR);
end loop; end;
解决方案 »
- oracel 索引使用
- 无法对所有EM相关账户解锁
- 还是刚才触发器问题,00036错误
- 问一个关于触发器的问题
- Eclipse连接Oracle11g数据库前如何配置它的环境变量?
- 大家好!有哪位高手知道在Oracle中R树索引的物理存储方式?
- 触发器问题?急,在线等
- 怎么把一个表里面的3个字段提取出来插到另外一张表中!数据非常大有1000多万!
- oracle developer 的FORM WHEN-BUTTON-PRESSED TRIGGER 中自动执行的创建VIEW的PL/SQL语句如何写?
- Oracle HTTP Server 的共享文件目录在那里
- oracle上亿条记录大表delete
- 我在C#的界面的一个textbox里输入了一个数据,然后我想把这个数据应用到我连接到的ORACLE数据库里做一个表名。请问有高手知道吗?数据
如果没问题,那就是存储过程的执行是需要时间的。