在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/