如下,建立了一个函数:CREATE OR REPLACE FUNCTION F_GETAUDITNAME(ID IN INTEGER, TYPE IN VARCHAR2)
  RETURN VARCHAR2 IS
  V_AUDITNAME VARCHAR2(50);
BEGIN
  SELECT PERSONNAME
    INTO V_AUDITNAME 
     FROM (SELECT PERSONNAME,
           ROW_NUMBER() OVER(PARTITION BY AU.AUDIT_ID, AU.AUDIT_TYPE ORDER BY AU.AUDIT_DATE) RN
           FROM V_tbl_ZZ AU
           WHERE AU.AUDIT_ID = ID AND AU.AUDIT_TYPE = TYPE)
  WHERE RN = 1;
RETURN V_AUDITNAME;
END;但之后我发现使用F_GETAUDITNAME返回的personname全部为空。SQL语句如下:
select F_GETAUDITNAME(t.id,'SD') from tbl_A t
后来我找了一个tbl_A中的存在的id,直接使用方法中的select语句查询,是有值的。如下:SELECT PERSONNAME
FROM (SELECT PERSONNAME,
ROW_NUMBER() OVER(PARTITION BY AU.AUDIT_ID, AU.AUDIT_TYPE ORDER BY AU.AUDIT_DATE) RN 
FROM V_tbl_ZZ AU
WHERE AU.AUDIT_ID = 49533
AND AU.AUDIT_TYPE = 'SD')
WHERE RN = 1;为什么select F_GETAUDITNAME(t.id,'SD') from tbl_A t返回的全部是空了??麻烦各位高手指点迷津。今天早上郁闷死了!!

解决方案 »

  1.   

    应该有值, SELECT PERSONNAME
        INTO V_AUDITNAME 
         FROM (SELECT PERSONNAME,
               ROW_NUMBER() OVER(PARTITION BY AU.AUDIT_ID, AU.AUDIT_TYPE ORDER BY AU.AUDIT_DATE) RN
               FROM V_tbl_ZZ AU
               WHERE AU.AUDIT_ID = ID AND AU.AUDIT_TYPE = TYPE)
      WHERE RN = 1;你的这个值查询出来没值早报错了。
      

  2.   


    加个异常处理看看
    CREATE OR REPLACE FUNCTION F_GETAUDITNAME(ID IN INTEGER, TYPE IN VARCHAR2)
      RETURN VARCHAR2 IS
      V_AUDITNAME VARCHAR2(50);
    BEGIN
      SELECT PERSONNAME
        INTO V_AUDITNAME 
         FROM (SELECT PERSONNAME,
               ROW_NUMBER() OVER(PARTITION BY AU.AUDIT_ID, AU.AUDIT_TYPE ORDER BY AU.AUDIT_DATE) RN
               FROM V_tbl_ZZ AU
               WHERE AU.AUDIT_ID = ID AND AU.AUDIT_TYPE = TYPE)
      WHERE RN = 1;
    RETURN V_AUDITNAME;
    exception 
    when others then
    dbms_output.put_line(sqlcode||' '||sqlerrm);
    END;
      

  3.   

    into语句必须要有值返回的。。
      

  4.   

    加了异常处理后,查询时直接报:ORA-06503:PL/SQL:函数无返回值。
    到底怎么回事了?我不是返回了吗??
      

  5.   


    --这样试试
    CREATE OR REPLACE FUNCTION F_GETAUDITNAME(ID IN INTEGER, TYPE IN VARCHAR2)
      RETURN VARCHAR2 IS
      V_AUDITNAME VARCHAR2(50);
    BEGIN
    begin
      SELECT PERSONNAME
        INTO V_AUDITNAME 
         FROM (SELECT PERSONNAME,
               ROW_NUMBER() OVER(PARTITION BY AU.AUDIT_ID, AU.AUDIT_TYPE ORDER BY AU.AUDIT_DATE) RN
               FROM V_tbl_ZZ AU
               WHERE AU.AUDIT_ID = ID AND AU.AUDIT_TYPE = TYPE)
      WHERE RN = 1;
    exception 
    when no_data_found then
    V_AUDITNAME:='无此值';
    null;
    end ;
    RETURN V_AUDITNAME;
    END;
      

  6.   

    谢谢大家的热情。我犯了个低级的错误,在oracle中ID是关键字,不能用ID作为函数的关键字的。换成别的就OK了。