0

我有返回关联数组的 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 函数,确保它总是返回一个正确类型的值。

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

4

1 回答 1

2

FOR游标循环将:

  1. 打开并解析 SELECT 语句
  2. 获取每一行
  3. 获取所有行后(或在激发循环时)关闭语句。

因此,它永远不会引发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;

另外值得一提的是,您永远不应该捕获意外的异常并默默地忽略它。这导致难以诊断错误。您可能认为您正在处理异常,但实际上您只是将它扫到地毯下。处理意外错误的最好办法是让它们传播,以便您知道它们发生了。

于 2013-08-14T15:20:43.220 回答