【讨论】请教 一个优化问题 谢谢!

[复制链接]
查看11 | 回复9 | 2014-4-17 06:00:17 | 显示全部楼层 |阅读模式
function GET_TIMES_BY_TYPE(p_planstartdate date,

p_prodlineidnumber,

p_scheduletypenumber)return STT


pipelined is
l_start_time date;
l_end_time date;
l_currentdatedate;
l_scheduleTypeTime STT;

cursor c_schedule is
select s.starttime, s.endtime, s.scheduleid, s.scheduletype
from bms
s,

bmc
ct,

bmcg ctg,

bmp
pl
where s.cid = ct.cid
and ct.cgroupid = ctg.cgroupid
and ctg.cgroupid = pl.cgroupid
and pl.pid = p_pid
order by ct.ctorder, s.sno asc;
begin
if p_scheduletype0 and p_scheduletype1 then
raise G_INPUTTYPE_NOT_RIGHT;
end if;
l_currentdate := p_planstartdate;

for r_s in c_s loop

l_start_time := to_date(to_char(l_currentdate, 'YYYY-MM-DD') || ' ' ||

to_char(r_s.starttime, 'HH24:MI:SS'),

'YYYY-MM-DD HH24:MI:SS');


if to_char(r_s.starttime, 'HH24') =
to_char(r_s.endtime, 'HH24') then
if to_char(r_s.starttime, 'MI') >
to_char(r_s.endtime, 'MI') then
l_currentdate := l_currentdate + 1;
elsifto_char(r_s.starttime, 'MI') =
to_char(r_s.endtime, 'MI') then

if to_char(r_s.starttime, 'SS') >

to_char(r_s.endtime, 'SS') then

l_currentdate := l_currentdate + 1;


end if;

end if;
elsif to_char(r_s.starttime, 'HH24') >

to_char(r_s.endtime, 'HH24') then
l_currentdate := l_currentdate + 1;
end if;

l_end_time := to_date(to_char(l_currentdate, 'YYYY-MM-DD') || ' ' ||

to_char(r_s.endtime, 'HH24:MI:SS'),

'YYYY-MM-DD HH24:MI:SS');
if r_s.scheduletype = p_scheduletype then
l_scheduleTypeTime.starttime:= l_start_time;
l_scheduleTypeTime.endtime:= l_end_time;
l_scheduleTypeTime.scheduletype := p_scheduletype;
PIPE ROW(l_scheduleTypeTime);
end if;

end loop;
end;复制代码这个要怎么优化 谢谢!
下面是我修改的不知道会不会好些?
function GET_TIMES_BY_TYPE(p_planstartdate date,

p_prodlineidnumber,

p_scheduletypenumber)return STT


pipelined is
l_start_time date;
l_end_time date;
l_currentdatedate;
l_scheduleTypeTime STT;

cursor c_s is
select s.starttime, s.endtime, s.scheduleid, s.scheduletype
from bms
s,

bmc
ct,

bmcg ctg,

bmp
pl
where s.cid = ct.cid
and ct.cgroupid = ctg.cgroupid
and ctg.cgroupid = pl.cgroupid
and pl.pid = p_pid
order by ct.ctorder, s.sno asc;


TYPE bms_rec_type IS RECORD
(
starttimebms.starttime%TYPE,
endtimebms.endtime%TYPE,
scheduleid bms.scheduleid%TYPE,
scheduletype bms.scheduletype%TYPE
);

TYPE nested_bms_type IS TABLE OF bms_rec_type;
r_s nested_bms_type;

v_limit PLS_INTEGER := 5;
begin
if p_scheduletype0 and p_scheduletype1 then
raise G_INPUTTYPE_NOT_RIGHT;
end if;
l_currentdate := p_planstartdate;

OPEN c_s;
LOOP
FETCH c_s
BULK COLLECT INTO r_s
LIMIT v_limit;

EXIT WHEN r_s.COUNT = 0;
FOR i IN r_s.FIRST .. r_s.LAST
LOOP


l_start_time := to_date(to_char(l_currentdate, 'YYYY-MM-DD') || ' ' ||

to_char(r_s(i).starttime, 'HH24:MI:SS'),

'YYYY-MM-DD HH24:MI:SS');


if to_char(r_s(i).starttime, 'HH24:MI:SS') >

to_char(r_s(i).endtime, 'HH24:MI:SS') THEN

l_currentdate := l_currentdate + 1;

end if;


l_end_time := to_date(to_char(l_currentdate, 'YYYY-MM-DD') || ' ' ||

to_char(r_s(i).endtime, 'HH24:MI:SS'),

'YYYY-MM-DD HH24:MI:SS');

if r_s(i).scheduletype = p_scheduletype then

l_scheduleTypeTime.starttime:= l_start_time;

l_scheduleTypeTime.endtime:= l_end_time;

l_scheduleTypeTime.scheduletype := p_scheduletype;

PIPE ROW(l_scheduleTypeTime);

end if;
END LOOP;
END LOOP;
CLOSE c_s;
end;复制代码



回复

使用道具 举报

千问 | 2014-4-17 06:00:17 | 显示全部楼层
注意提问的方法, 不要把你工作的实际问题直接问, 用简单的数据举例, 并把结果列出, 说明一下规则
回复

使用道具 举报

千问 | 2014-4-17 06:00:17 | 显示全部楼层
目测for/loop里可以用bulk collect
回复

使用道具 举报

千问 | 2014-4-17 06:00:17 | 显示全部楼层
转换太多,if可以合并。
回复

使用道具 举报

千问 | 2014-4-17 06:00:17 | 显示全部楼层
visual2006 发表于 2014-9-10 10:47
目测for/loop里可以用bulk collect

谢谢你的回答! 如果内存比较小用bulk collect 是不是有问题?
回复

使用道具 举报

千问 | 2014-4-17 06:00:17 | 显示全部楼层
zhjfit 发表于 2014-9-10 11:15
谢谢你的回答! 如果内存比较小用bulk collect 是不是有问题?

没有问题
回复

使用道具 举报

千问 | 2014-4-17 06:00:17 | 显示全部楼层
bell6248 发表于 2014-9-10 10:42
注意提问的方法, 不要把你工作的实际问题直接问, 用简单的数据举例, 并把结果列出, 说明一下规则

这是别人之前写好的 叫我优化提高效率 关键没有思路


回复

使用道具 举报

千问 | 2014-4-17 06:00:17 | 显示全部楼层
本帖最后由 zhjfit 于 2014-9-10 13:53 编辑
〇〇 发表于 2014-9-10 13:10
没有问题

谢谢你的回答!
如果 Oracle数据库的内存较小不足以保存Bulk Collect批查询结果 会不会比单纯用游标的效率低
回复

使用道具 举报

千问 | 2014-4-17 06:00:17 | 显示全部楼层
zhjfit 发表于 2014-9-10 13:47
这是别人之前写好的 叫我优化提高效率 关键没有思路

你看看能不能不用PL/SQL。 直接用一句SQL实现
回复

使用道具 举报

千问 | 2014-4-17 06:00:17 | 显示全部楼层
优化哪里啊?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行