Oracle: 游标语句中使用自定义函数效率低
Oracle 11G 环境:
游标语句中使用自定义函数效率低,
有个报表测试期间,很快出结果 , 运行一个多月了,用户也没有反映不能出结果问题。然而,我今天 再测试时,不能出结果了。
调试报表程序,跟踪发现执行到游标时,无法打开游标。
原来存储过程中有一个游标语句中使用了自定义函数,结果运行一个小时 也不结束。
无法解释原因。
自定义函数: f_get_salesrep_name( p_salesrep_id in number ) 返回 销售员姓名,;
FUNCTION f_get_salesrep_name(iv_salesrep_id NUMBER) RETURN VARCHAR2 IS
v_salesrep_name ra_salesreps_all.name%TYPE;
BEGIN
SELECT NAME
INTO v_salesrep_name
FROM ra_salesreps_all
WHERE salesrep_id = iv_salesrep_id
AND rownum = 1;
RETURN v_salesrep_name;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END f_get_salesrep_name;
存储过程游标语句中调用自定义函数,
例子:
CREATE PROCEDURE APPS.CUX_TEST_P ( P_DATE_FROM DATE ,P_DATE_TO IN DATE ) IS
CURSOR CUR1 IS
SELECT OOH.ORDER_NUMBER,
f_get_salesrep_name(OOH.salesrep_id ) as salesrep_name ,
ooh.ordered_date
from ont.oe_order_headers_all ooh
where ordered_date >= p_date_from
and ordered_date <= p_date_to ;
begin
for R1 IN CUR1 LOOP -- 跟踪发现,游标在此停住,一直不能打开 。
DBMS_OUTPUT.PUT_LINE(' ORDER NUMBER = ' || R1.ORDER_NUMBER );
END;
end;
解决方式
不要在游标语句中使用自定义函数。
以后开发过程注意,避开这种情况的出现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了