提示:在oracle8i中,如果需要通过存储过程返回结果集, 需要使用游标!
create or replace package body “sms_pay”.”smsmaint”
is
–功能描述:查询代理银行交易流水信息 writer: wang haibo 2004-08-24
procedure getagtbankflow(areacode in varchar2,keyword in varchar2,starttradedate in varchar2,endtradedate in varchar2,re_cursor out t_cursor,ret out number)
is
isexists number;
strsql varchar2(2048);
begin
–检查临时表是否已经存在,如果不存在,则创建,否则插入数据 start
select count(*) into isexists from all_tables where table_name=tempagtbankflow;
if isexists=0 then
strsql:=create global temporary table sms_pay.tempagtbankflow
(agtid varchar2(13) ,bank_glide number(12),tradetype varchar2(20),trade_money number(14,2),
tradedate varchar2(10),tradetime varchar2(8),bankname varchar2(30),
areacode varchar2(30), areaname varchar2(30),state varchar2(30),checkflag number(1),
statusflag number(1),succflag number(1)) on commit preserve rows;
–把临时表的创建选项由on commit delete rows改为on commit preserve rows;
–否则在调用的时候,回出现ora-08103: object no longer exists
execute immediate strsql;
else
execute immediate truncate table sms_pay.tempagtbankflow;
end if;
–检查临时表是否已经存在,如果不存在,则创建,否则插入数据 end
—功能:把满足条件的一级代理商转帐信息导入数据库 start
/*strsql:=insert into tempagtbankflow
select a.agent_mobile,a.bank_glide,
decode(a.optcode,100,交款交易,101,交款冲正,900,抹帐交易,类型不明) as tradetype,a.trade_money,
to_char(to_date(a.trade_date,yyyymmdd),yyyy-mm-dd) as tradedate,
to_char(to_date(a.trade_time,hh24miss),hh24:mi:ss) as tradetime,b.bankname,c.areacode,c.areaname,
(case when checkflag=-1 then /images/state_rollback.gif when succflag=-1 then /images/state_cancel.gif when statusflag=-1 then /images/state_unnormal.gif else /images/state_normal.gif end) as state
from bank_stream_account a,bankinfoconfig b,areaconfig c,fstagtaccount d
where a.bank_id=b.bankcode and trim(a.agent_mobile)=d.agtid and c.citycode=d.citycode ;
if areacode!=0 then –条件1: 选择所有地区的信息
strsql:=strsql || and trim(c.areacode)= || areacode || ;
end if;
if tradedate!= then –条件2: 选择所有地区的信息,选择所有交易日期的信息
strsql:=strsql || and to_char(to_date(a.trade_date,yyyymmdd),yyyy-mm-dd)= || tradedate || ;
end if;
if keyword!= then –条件3: 选择所有地区的信息,选择所有交易日期的信息,选择和查询关键字匹配的信息
strsql:=strsql || and (d.agtid like% || keyword || % or to_char(a.bank_glide) like % || keyword || % or b.bankname like % || keyword ||%) ;
end if;
execute immediate strsql;
—功能:把满足条件的一级代理商转帐信息导入数据库 end
*/
—功能:把满足条件的二级代理商转帐信息导入数据库 start
strsql:=insert into tempagtbankflow
select a.agent_mobile,a.bank_glide,
decode(a.optcode,100,交款交易,101,交款冲正,900,抹帐交易,类型不明) as tradetype,a.trade_money,
to_char(to_date(a.trade_date,yyyymmdd),yyyy-mm-dd) as tradedate,
to_char(to_date(a.trade_time,hh24miss),hh24:mi:ss) as tradetime,b.bankname,c.areacode,c.areaname,
(case when checkflag=-1 then /images/state_rollback.gif when succflag=-1 then /images/state_cancel.gif when statusflag=-1 then /images/state_unnormal.gif else /images/state_normal.gif end) as state,
a.checkflag,a.statusflag,a.succflag
from bank_stream_account a,bankinfoconfig b,areaconfig c,secagtaccount d,fstagtaccount e
where a.bank_id=b.bankcode and trim(a.agent_mobile)=d.agtid and d.bossagtid=e.agtid and c.citycode=e.citycode ;
if areacode!=0 then –条件1: 选择所有地区的信息
strsql:=strsql || and trim(c.areacode)= || areacode || ;
end if;
if starttradedate!= then –条件2: 选择所有地区的信息,选择所有交易开始日期的信息
strsql:=strsql || and to_char(to_date(a.trade_date,yyyymmdd),yyyy-mm-dd)>= || starttradedate || ;
end if;
if endtradedate!= then –条件2: 选择所有地区的信息,选择所有交易截止日期的信息
strsql:=strsql || and to_char(to_date(a.trade_date,yyyymmdd),yyyy-mm-dd)<= || endtradedate || ;
end if;
if keyword!= then –条件3: 选择所有地区的信息,选择所有交易日期的信息,选择和查询关键字匹配的信息
strsql:=strsql || and (d.agtid like% || keyword || % or to_char(a.bank_glide) like % || keyword || % or b.bankname like % || keyword ||%) ;
end if;
execute immediate strsql;
—功能:把满足条件的二级代理商转帐信息导入数据库 end
open re_cursor for select * from sms_pay.tempagtbankflow order by agtid; –生成返回结果集的curso
ret:=0;
return;
exception
when others then
dbms_output.put_line(sqlerrm);
ret:=999;
return;
end getagtbankflow;
–功能描述:查询代理商钱包余额信息 writer: wang haibo 2004-08-24
procedure getagtbalance(areacode in varchar2,keyword in varchar2,re_cursor out t_cursor,ret out number)
is
pfstagtid varchar2(13);
psecagtid varchar2(13);
pagtbalance number(10,2);
pagtprofit number(10,2);
pareacode varchar2(10);
pareaname varchar2(30);
pagtcount number(10);
isexists number;
subagtnumber number;
type c_getbalance is ref cursor;
fstcursor c_getbalance;
strsql varchar2(1024);
begin
— 打开游标,根据sql语句获取1级代理商资料,然后根据1级代理商的资料获取2级代理的信息
if areacode!=0 and keyword= then
strsql:=select a.agtid,,a.agtcredit,a.agtprofit,
b.areacode,b.areaname,0 from sms_pay.fstagtaccount a,sms_pay.areaconfig b
where a.isactive=1 and a.citycode=b.citycode and b.areacode = || areacode ||;
elsif (trim(areacode)!=0 and keyword!= ) then
strsql:=select a.agtid,,a.agtcredit,a.agtprofit,
b.areacode,b.areaname,0 from sms_pay.fstagtaccount a,sms_pay.areaconfig b
where a.isactive=1 and a.citycode=b.citycode and b.areacode = || areacode ||
and (b.areaname like % || trim(keyword) || % or a.agtid like % || trim(keyword) || %);
elsif (trim(areacode)=0 and keyword= ) then
strsql:=select a.agtid,,a.agtcredit,a.agtprofit,
b.areacode,b.areaname,0 from sms_pay.fstagtaccount a,sms_pay.areaconfig b
where a.isactive=1 and a.citycode=b.citycode;
else
strsql:=select a.agtid,,a.agtcredit,a.agtprofit,
b.areacode,b.areaname,0 from sms_pay.fstagtaccount a,sms_pay.areaconfig b
where a.isactive=1 and a.citycode=b.citycode
and (b.areaname like % || keyword || % or a.agtid like % || keyword || %);
end if;
open fstcursor for strsql;
–检查临时表是否已经存在,如果不存在,则创建,否则插入数据 start
select count(*) into isexists from all_tables where trim(table_name)=tempagtbalance;
if isexists=0 then
strsql:=create global temporary table sms_pay.tempagtbalance
(fstagtid varchar2(13) ,secagtid varchar2(13),parentid varchar2(13),
agtbalance number(10,2),agtprofit number(10,2),areacode varchar2(10),
areaname varchar2(30),agtcount number(10)) on commit preserve rows;
–把临时表的创建选项由on commit delete rows改为on commit preserve rows;
–否则在调用的时候,回出现ora-08103: object no longer exists
–dbms_output.put_line(strsql);
execute immediate strsql;
else
execute immediate truncate table sms_pay.tempagtbalance;
end if;
–检查临时表是否已经存在,如果不存在,则创建,否则插入数据 end
loop
fetch fstcursor into pfstagtid,psecagtid, pagtbalance,pagtprofit,pareacode, pareaname, pagtcount ;
exit when fstcursor%notfound;
–1:写1级代理商查询信息
strsql:=insert into tempagtbalance(fstagtid,secagtid, parentid,agtbalance,agtprofit,areacode, areaname, agtcount)
values( || pfstagtid || ,null,null, || pagtbalance || , || pagtprofit || , || pareacode || ,
|| pareaname || , || pagtcount || );
execute immediate strsql;
–2:写2级代理商查询信息
strsql:=insert into tempagtbalance select null,agtid, || pfstagtid ||,agtcredit,agtprofit , || pareacode || , || pareaname || ,0 from secagtaccount where trim(bossagtid)= || pfstagtid || ;
execute immediate strsql;
–3:更新1级代理的下级别代理商数量
strsql:=select count(*) from tempagtbalance where secagtid is not null and parentid= || pfstagtid || ;
–dbms_output.put_line(strsql);
execute immediate strsql into subagtnumber;
–select count(*) into subagtnumber from tempagtbalance where secagtid is not null and parentid=pfstagtid;
dbms_output.put_line(subagtnumber);
strsql:=update tempagtbalance set agtcount= || subagtnumber || where secagtid is null and fstagtid= || pfstagtid || ;
execute immediate strsql;
–dbms_output.put_line(strsql);
–update tempagtbalance set agtcount=subagtnumber where secagtid is null and fstagtid=pfstagtid;
end loop;
close fstcursor;
open re_cursor for select * from sms_pay.tempagtbalance;
ret:=0;
return;
exception
when others then
dbms_output.put_line(sqlerrm);
ret:=999;
return;
end getagtbalance;
end ;
