从PLSQL函数返回空关联数组时出现异常

时间:2013-08-14 15:12:57

标签: sql exception-handling plsql associative-array

我有PLSQL函数,它返回一个关联数组。 这是我的代码

TYPE ASSOC_ARR IS TABLE OF NUMBER INDEX BY VARCHAR(20)
FUNCTION GET_SAMPLE_MAP(ID IN NUMBER) RETURN ASSOC_ARR IS
  sample_map ASSOC_ARR;
BEGIN
 FOR rec IN (SELECT LOC.STATE, LOC.POPULATION FROM LOCATIONS LOC) LOOP
   sample_map(rec.STATE) := rec.POPULATION;
 END LOOP;

 EXCEPTION
  WHEN NO_DATA_FOUND THEN
  RETURN sample_map;
  WHEN OTHERS THEN
  RETURN sample_map;
END;

当我从一个过程调用此函数并且SQL查询没有返回任何数据时,将捕获返回sample_map的NO_DATA_FOUND异常。但我得到一个错误说

ORA-06503:PL / SQL:函数返回时没有值     *原因:对PL / SQL函数的调用已完成,但没有RETURN语句            执行。     *动作:重写PL / SQL函数,确保它始终返回            适当类型的值。

在这种情况下我应该从这个函数返回什么,以避免这个错误?

1 个答案:

答案 0 :(得分:2)

FOR cursor loop将:

  1. 打开并解析SELECT语句
  2. 获取每一行
  3. 在获取所有行时(或激活循环时)关闭语句。
  4. 因此,即使没有提取任何行,也不会引发NO_DATA_FOUND异常。

    因此,永远不会达到RETURN语句,导致ORA-06503

    你应该写:

    FUNCTION GET_SAMPLE_MAP(ID IN NUMBER) RETURN ASSOC_ARR IS
      sample_map ASSOC_ARR;
    BEGIN
     FOR rec IN (SELECT LOC.STATE, LOC.POPULATION FROM LOCATIONS LOC) LOOP
       sample_map(rec.STATE) := rec.POPULATION;
     END LOOP;
     RETURN sample_map;
    END;
    

    另外值得一提的是,您永远不应该捕获意外的异常并默默地忽略它。这导致hard to diagnose bugs。你可能会认为你正在处理这个例外,但实际上你只是在地毯上扫地。对意外错误做的最好的事情就是让它们传播,以便你知道它们发生了。