PL/SQL函数返回ORA-06503:PL/SQL:函数返回时没有值
我必须编写一个pl/sql代码(实际上是一个函数),当将郊区作为参数时,它会返回一个邮政编码 代码如下所示:PL/SQL函数返回ORA-06503:PL/SQL:函数返回时没有值,sql,database,oracle,select,plsql,Sql,Database,Oracle,Select,Plsql,我必须编写一个pl/sql代码(实际上是一个函数),当将郊区作为参数时,它会返回一个邮政编码 代码如下所示: create or replace FUNCTION get_postCode(p_suburb IN varchar2) RETURN varchar2 IS -- v_postcode varchar2; -- CURSOR c1 IS SELECT locality, postcode FROM table_postcode; -- BEGIN -- FOR r1 IN c1
create or replace
FUNCTION get_postCode(p_suburb IN varchar2)
RETURN varchar2
IS
--
v_postcode varchar2;
--
CURSOR c1 IS
SELECT locality, postcode FROM table_postcode;
--
BEGIN
--
FOR r1 IN c1
loop
IF upper(r1.locality) = upper(p_suburb)
THEN
v_postcode := r1.postcode;
return v_postcode;
END IF;
exit WHEN c1%notfound;
END loop;
-- return v_postcode;
--
exception WHEN others then
v_postcode := null;
END;
表_的邮政编码是从邮局获得的,它包含郊区(地址列在表格中)和邮政编码以及与本案例无关的其他字段
当我使用该函数时,它返回正确的值;当我在SELECT子句的列上使用该函数时,只有在FROM子句之后不添加任何其他子句时,它才会返回。这对我来说很奇怪
情况是:
select street, suburb, get_postcode(suburb) from my_table;
上面的一行给出了结果,但是
select street, subur, get_postcode(suburb) from my_table order by suburb;
失败,并显示以下错误消息:
ORA-06503: PL/SQL: Function returned without value
ORA-06512: at "U11254683.GET_POSTCODE", line 25
06503. 00000 - "PL/SQL: Function returned without value"
*Cause: A call to PL/SQL function completed, but no RETURN statement was
executed.
*Action: Rewrite PL/SQL function, making sure that it always returns
a value of a proper type.
如果我调用块中的函数,如:
Declare
v_post varchar2(10);
Begin
v_post := get_postcode('Sydney');
DBMS_OUTPUT.PUT_LINE('The post code is '||v_post);
End;
结果是正确的,给了我2000英镑。你应该在什么都没有找到的情况下返回一些东西。在语句中的
异常注释之前
return v_postcode;
按照编写例程的方式,它可能找不到任何内容,然后到达函数末尾而不返回任何内容,因此出现错误“函数返回时没有值”。实际上就是这样
但是,通过直接选择郊区,您可以更轻松地完成此操作。但是,如果您获得多个郊区邮政编码(如果可能的话),您会怎么做
在这个版本中,如果一个郊区存在于多个邮政编码中,您将得到null。现在由您的设计决定如何处理这种情况。然后可以在异常中处理它
exception
when TOO_MANY_ROWS then
return '**Error** Several Values'; -- do something meaningful here
when NO_DATA_FOUND then
return null; -- if you want to return null on nothing found
试试这个:
CREATE OR REPLACE FUNCTION get_postCode
(p_suburb IN varchar2)
RETURN varchar2
IS
v_postcode varchar2;
CURSOR c1 IS
SELECT locality, postcode FROM table_postcode;
BEGIN
FOR r1 IN c1 LOOP
EXIT WHEN c1%notfound;
IF upper(r1.locality) = upper(p_suburb) THEN
v_postcode := r1.postcode;
EXIT;
END IF;
END LOOP;
return v_postcode;
exception WHEN others then
return null;
END;
/
通过在查找第一个post代码时退出FOR
循环,您可以确保不会引发行过多的异常。另外,通过将return
放在IF
语句之外,您可以确保在没有找到任何内容的情况下,至少返回一个NULL
。为什么要使用光标?要查看表并检查匹配项并获取邮政编码,我做错了吗?或者…简短回答:是的-SQL是一种基于集合的语言,最好用于基于集合的操作。有关使用函数的更好方法,请参见hol的答案。谢谢,这是一堂给初学者的好课谢谢你的建议。我已经试过了你的代码,事实上我遇到了行数过多错误的问题,这个错误现在正在中处理EXCEPTION@DilshatAbduwalli:别对我大喊大叫US@a_horse_with_no_name我也这么想,但不是每个人都知道大写的意思是喊叫。在这种情况下,我并没有把它解释为叫喊。事实上,是否有一个Stackoverflow规则,大写字母表示呼喊,或者这是来自一般的网络种族?@hol:据我所知,大写字母在任何“在线”对话(论坛、邮件、新闻组等)中都被认为是呼喊。@a_horse_,据我所知,也有_no_的名字,但我不止一次地观察到这不是(更多)常识:-)从那以后,我根据上下文来解释它的好坏。在你的代码中,它仍然不起作用,因为在异常发生后,它不会返回到代码(它得到异常的地方),并且仍然没有命中return
语句。好吧,在我的机器上,类似的代码对我来说非常有效!:DI的意思是,如果发生任何异常(不太可能是现在的编码方式),它将转到异常,然后不返回任何内容。@hol:是的,你是对的。我应该在异常块中放置一个返回null
。编辑。尽管如此,我相信我现在不太可能得到未找到数据
或太多行
异常。
CREATE OR REPLACE FUNCTION get_postCode
(p_suburb IN varchar2)
RETURN varchar2
IS
v_postcode varchar2;
CURSOR c1 IS
SELECT locality, postcode FROM table_postcode;
BEGIN
FOR r1 IN c1 LOOP
EXIT WHEN c1%notfound;
IF upper(r1.locality) = upper(p_suburb) THEN
v_postcode := r1.postcode;
EXIT;
END IF;
END LOOP;
return v_postcode;
exception WHEN others then
return null;
END;
/