oracle - PL/SQL异常处理-函数返回无值

标签 oracle plsql exception-handling

在Oracle 12.1中,我有一个相当简单的PL / SQL例程。输出为单个值,即逗号分隔的名称列表或字符串“NO_DATA”。没有其他允许的输出。对于输入,只有一个值,即公司名称。如果我对公司名称进行硬编码,然后从SQL窗口运行SQL语句(而不是函数),则该语句运行良好,因此我知道SQL有效。这个问题与异常处理有关。如果我根本没有异常处理,并且将有效名称传递给该函数,那么它将为我提供有效输出。我需要能够处理找不到数据的情况,因此我添加了简单的异常处理。这是我的问题所在。使用异常处理代码,如果我传递了一个错误的值(也就是找不到的公司名称),我将得到“NO_DATA”,就像我应该的那样。如果传递一个好的值,则会收到PL / SQL错误ORA-06503:PL / SQL:函数返回的值没有值。这是我的代码。

   create or replace FUNCTION authorized_email(nn1 in varchar2)
   RETURN varchar2
   IS  
   thisName varchar2(4000);
   Output varchar2(4000);

-- this routine build the list of comma seperated authorized users   

BEGIN

 SELECT NN_Name,      
        nvl(replace(Upper(LISTAGG( Name, ',' ) WITHIN GROUP ( ORDER BY Name )), '@XYZ.COM', NULL), 'NO_DATA') AS Names
       into thisName, Output
FROM   (
  SELECT DISTINCT(NN_NAME),
         Name
  FROM   LINE_ITEMS
  UNPIVOT( name FOR typ IN ( 
        FMW_MGR_L3_EMAIL,
        FMW_MGR_L4_EMAIL,
        FMW_MGR_L5_EMAIL,
        FMW_MGR_L6_EMAIL,
        FMW_MGR_L7_EMAIL,
        FMW_EMAIL,
        HYBRID_MGR_L3_EMAIL,
        HYBRID_MGR_L4_EMAIL,
        HYBRID_MGR_L5_EMAIL,
        HYBRID_MGR_L6_EMAIL,
        HYBRID_MGR_L7_EMAIL,
        HYBRID_REP,
        TECH_MGR_L3_EMAIL,
        TECH_MGR_L4_EMAIL,
        TECH_MGR_L5_EMAIL,
        TECH_MGR_L6_EMAIL,
        TECH_MGR_L7_EMAIL,
        TECH_EMAIL) 
    ) )
where NN_NAME = nn1
GROUP BY NN_NAME;

EXCEPTION
  WHEN no_data_found then    
    Output := 'NO_DATA';

return Output;


END;

我的EXCEPTION HANDLING代码有问题,但是我无法确定它是什么。任何帮助表示赞赏!

最佳答案

在异常之前,您不返回任何值。

那你应该加

return Output;
EXCEPTION下面的语句
Output := 'NO_DATA';
return Output;

仅在触发NO_DATA_FOUND时执行。

因此,您的代码应该像
BEGIN
        SELECT NN_Name,      
                nvl(replace(Upper(LISTAGG( Name, ',' ) WITHIN GROUP ( ORDER BY Name )), '@XYZ.COM', NULL), 'NO_DATA') AS Names
               into thisName, Output
        FROM   (
          --skipped) 
            ) )
        where NN_NAME = nn1
        GROUP BY NN_NAME;
       return Output;   --     <---   code added
    EXCEPTION
      WHEN no_data_found then    
        Output := 'NO_DATA';
        return Output;
    END;

关于oracle - PL/SQL异常处理-函数返回无值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39055373/

相关文章:

ruby - 如何向 Ruby 中的异常消息添加信息?

java - 在 Java 中从方法中抛出异常记录参数值的简单方法

sql - oracle触发器上的编译错误

sql - Oracle SQL 约束 where 子句

sql - oracle提高查询性能

sql - Oracle Material View 与分析工作区

string - PLSQL修改VARCHAR2列数据

javascript - 在外部脚本文件中捕获 javascript 错误

sql - SUM 比循环慢

sql - 在 oracle 存储过程中将表名作为参数传递