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; 

解决方式

不要在游标语句中使用自定义函数。

 以后开发过程注意,避开这种情况的出现。 

 

posted @ 2022-01-14 13:33  samrv  阅读(175)  评论(0编辑  收藏  举报