运用存储过程和游标,帮我写一个查询的语句,最后输出结果,可以先不考虑笛卡尔积

Comm.serv:用户表
正常在用用户:state = 2HA
CDMA用户:product_id = 379
Serv_id:用户编码 acct_nbr:用户号码

Comm.serv_acct:账户用户关联关系表
有效数据 state='10A'
Acct_id:账户编码

Comm.acct:账户表
Acct_name:账户名称

Acct.acct_balance:余额表
Balance:余额

Acct.ACCT_ITEM_201805:5月费用表
Amount:费用
Acct.ACCT_ITEM_201806:6月费用表
Amount:费用

Bill.acct_item_aggr_11807:实时费用表(在billdb)
Charge 实时费用

Acct.acct_credit:信用度表
Credit_amount:信用度值

Sms_info:短信发送表
Id:唯一值,消息ID
Msisdn:电话号码
FLAG:SEND
MSG:短信内容
Get_date:短信发送时间
Send_date = get_date
其他字段填空

欠费=余额-4、5月份话费-实时话费-信用度

要求:
1、统计出来所有用户欠费金额,统计信息包括:账户名称 ,账户ID,用户ID,余额、4月份话费、5月份话费、实时话费、信用度、欠费金额
2、对于欠费的用户,发送短信。短信内容:“xxx您好,截止到yyyy-mm-dd hh24:mi:ss,您已经欠费xx元,请您及时缴费! ”图片说明

这不是一个普通的查询吗?
短信 就是把欠费 小于0的插入到短信表里面

select c.acct_name,c.acct_id,a.servd_id,d.balance,e.amount_5,f.amount_6,g.charge,h.credit_amount,
d.balance - nvl(e.amount_5,0) - nvl(f.amount_6,0) - g.charge - h.credit_amount as Arrears
from serv a
join serv_acct b on (a.servd_id = b.servd_id and b.state = '10A')
join acct c on (b.acct_id = c.acct_id)
join balance d on (d.acct_id = b.acct_id)
left join (select serv_id,sum(amount) as amount_5 from acct_item_201805 group by serv_id) e
on (a.servd_id = e.servd_id)
left join (select serv_id,sum(amount) as amount_6 from acct_item_201806 group by serv_id) f
on (a.servd_id = f.servd_id)
left join (select serv_id,sum(charge) as charge from acct_item_aggr_11807@bill_228 group by serv_id) g
on (a.servd_id = g.servd_id)
left join acct_credit h on (h.acct_id = b.acct_id)
where a.state = '2HA'
and a.product_id = '379';

数据量大了 就是会慢啊 为什么要用游标?游标不更慢了

SQL中一个查询能出来的活 肯定这样写执行快啊 除非SQL复杂了执行计划不正确
看下执行计划 优化
用存储过程就是把这段SQL拆分,用临时表存储中间结果数据。