当前位置: 代码迷 >> Oracle开发 >> Oracle中函数被调用2次,请教怎么解释
  详细解决方案

Oracle中函数被调用2次,请教怎么解释

热度:53   发布时间:2016-04-24 06:36:03.0
Oracle中函数被调用2次,请问如何解释?

CREATE OR REPLACE PROCEDURE p_kkk1
IS
    CURSOR c_dl IS
        SELECT ID,
               ZZJGDM
          FROM T_FR_DL;
    c_row c_dl%ROWTYPE;
BEGIN
    FOR c_row IN c_dl LOOP
        BEGIN
            UPDATE T_FR
               SET QYZT = abc()
             WHERE ZZJGDM = c_row.ZZJGDM;
        END;
    END LOOP;

END p_kkk1;

T_FR_DL表中只有一条记录,当执行上述存储过程时,发现函数abc被调用2次,请问是何故?注:如果将更新语句改为:SET QYZT = (select abc() from dual)则发现abc函数被调用一次,请各位oracle大神不惜赐教!

另外,如果将update 部分独立执行(测试):

  UPDATE T_FR
               SET QYZT = abc()
             WHERE ZZJGDM = ‘’;

则发现函数abc被调用一次,请问如何解释?
------解决思路----------------------
很怪异的现象,感觉和你函数的实现有关,函数中是否有递归调用
另外有2个疑问
1、你用啥方法确认的调用几次
2、你的函数里都写了啥

------解决思路----------------------
LZ  你把调整用这个存储过程的语句,贴出来。

怀疑你的语句调用了两次
------解决思路----------------------
CREATE OR REPLACE PROCEDURE p_kkk1
IS
    CURSOR c_dl IS
        SELECT ID,
               ZZJGDM
          FROM T_FR_DL;
    c_row c_dl%ROWTYPE;
   intIndex NUMBER;
BEGIN
   intIndex :=0;
    FOR c_row IN c_dl LOOP
      intIndex :=  intIndex + 1;
     dbms_output.put_line('intIndex :'+intIndex );
        BEGIN
            UPDATE T_FR
               SET QYZT = abc()
             WHERE ZZJGDM = c_row.ZZJGDM;
        END;
    END LOOP;
 
END p_kkk1;

-----------
看看到底执行了几次
  相关解决方案