Oracle 存储过程速度慢

开发之路 2010-08-12 10:40:20
有个游标

cursor c1(v_mcode varchar2, v_ifchk varchar2) is
select *
from a
where (a.mrlmcode = v_mcode or v_mcode is null) and
a.mrlrdate>=to_date(P_SDATE, 'yyyymmdd')
and a.mrlifchk = v_ifchk
order by a.mrlrdate;

view_mrl a%rowtype;

open c1(P_MICODE, P_ISCHK);
loop
fetch c1 into view_mrl;


执行c1用时0.047秒
测试到 fetch c1 into view_mrl; 停了几秒
我觉得是这影响了速度,不知道是什么原因
最后也能执行成功,就是速度慢

...全文
576 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
开发之路 2010-08-13
  • 打赏
  • 举报
回复
我们解决了,有高人
开发之路 2010-08-12
  • 打赏
  • 举报
回复
我改了调试

fetch c1 BULK COLLECT into v_mrlmcode,v_mrlsl,v_mrlrdate,v_mrlprdate,v_mrlifchk

还是慢
minitoy 2010-08-12
  • 打赏
  • 举报
回复
v_mrlrdate相当于一个数组,你需要用first和last来for循环取

FOR i IN names.FIRST .. names.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(' Employee ' || names(i) || ': $' || sals(i));
END LOOP;
开发之路 2010-08-12
  • 打赏
  • 举报
回复
编译报错

TYPE t_mrlrdate IS TABLE OF a.mrlrdate%TYPE;
v_mrlrdate t_mrlrdate;

在loop里
if v_mrlrdate>=to_date(p_edate,'yyyymmdd')
编译错误

错误:PLS-00306: 调用 '>=' 时参数个数或类型错误
行:55
文本:if v_mrlrdate>=to_date(p_edate,'yyyymmdd') and c1%rowcount=1 then
开发之路 2010-08-12
  • 打赏
  • 举报
回复
是要把用的字段全用变量取出来吧
minitoy 2010-08-12
  • 打赏
  • 举报
回复
view_mrl这个得改成table变量。
DECLARE
TYPE NameList IS TABLE OF employees.last_name%TYPE;
TYPE SalList IS TABLE OF employees.salary%TYPE;
CURSOR c1 IS SELECT last_name, salary FROM employees WHERE salary > 10000;
names NameList;
sals SalList;
TYPE RecList IS TABLE OF c1%ROWTYPE;
recs RecList;
v_limit PLS_INTEGER := 10;
PROCEDURE print_results IS
BEGIN
IF names IS NULL OR names.COUNT = 0 THEN -- check if collections are empty
DBMS_OUTPUT.PUT_LINE('No results!');
ELSE
DBMS_OUTPUT.PUT_LINE('Results: ');
FOR i IN names.FIRST .. names.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(' Employee ' || names(i) || ': $' || sals(i));
END LOOP;
END IF;
END;
BEGIN
DBMS_OUTPUT.PUT_LINE('--- Processing all results at once ---');
OPEN c1;
FETCH c1 BULK COLLECT INTO names, sals;
CLOSE c1;
print_results();
DBMS_OUTPUT.PUT_LINE('--- Processing ' || v_limit || ' rows at a time ---');
OPEN c1;
LOOP
FETCH c1 BULK COLLECT INTO names, sals LIMIT v_limit;
EXIT WHEN names.COUNT = 0;
print_results();
END LOOP;
CLOSE c1;
DBMS_OUTPUT.PUT_LINE('--- Fetching records rather than columns ---');
OPEN c1;
FETCH c1 BULK COLLECT INTO recs;
FOR i IN recs.FIRST .. recs.LAST
LOOP
-- Now all the columns from the result set come from a single record
DBMS_OUTPUT.PUT_LINE(' Employee ' || recs(i).last_name || ': $'
|| recs(i).salary);
END LOOP;
END;
/

开发之路 2010-08-12
  • 打赏
  • 举报
回复
fetch c1 BULK COLLECT into view_mrl;
报这个错
编译错误

错误:PLS-00497: 无法混合 INTO 列表中的单行和多行 (BULK)
行:40
文本:fetch c1 BULK COLLECT into view_mrl;
ngx20080110 2010-08-12
  • 打赏
  • 举报
回复
試一下
FETCH ... BULK COLLECT INTO ...
minitoy 2010-08-12
  • 打赏
  • 举报
回复
fetch慢?没遇到过。按理说有可能慢的应该是open吧。等高手。
开发之路 2010-08-12
  • 打赏
  • 举报
回复
我用plsql啊
gguxxing008 2010-08-12
  • 打赏
  • 举报
回复
你是怎么测试这里面每条语句的执行时间的??总不会是看timing吧

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧