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;
解决方式
不要在游标语句中使用自定义函数。
以后开发过程注意,避开这种情况的出现。