我有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函数,确保它始终返回 适当类型的值。
在这种情况下我应该从这个函数返回什么,以避免这个错误?
答案 0 :(得分:2)
因此,即使没有提取任何行,也不会引发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。你可能会认为你正在处理这个例外,但实际上你只是在地毯上扫地。对意外错误做的最好的事情就是让它们传播,以便你知道它们发生了。