【问题标题】:Exception while returning an empty Associative array from PLSQL function从 PLSQL 函数返回空关联数组时出现异常
【发布时间】:2013-08-16 15:08:07
【问题描述】:

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

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

【问题讨论】:

    标签: sql exception-handling plsql associative-array


    【解决方案1】:

    FOR cursor loop 将:

    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;
    

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

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多