gpt4 book ai didi

sql - PL/SQL 函数返回 ORA-06503 : PL/SQL: Function returned without value

转载 作者:搜寻专家 更新时间:2023-10-30 20:02:11 25 4
gpt4 key购买 nike

我必须编写一个 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
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;

table_postcode 是从 Post Office 获得的,它包含郊区(locality 作为表格中的列)和 postcode 以及与本案例无关的其他字段。

当我使用该函数时,它返回正确的值,当我将此函数用作 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.

如果我像这样在 block 中调用函数:

Declare
v_post varchar2(10);
Begin
v_post := get_postcode('Sydney');
DBMS_OUTPUT.PUT_LINE('The post code is '||v_post);
End;

结果是正确的,给我 2000。

最佳答案

当什么都找不到时,你应该返回一些东西。在声明中的exception注释之前

return v_postcode;

您的例程的编写方式可能确实找不到任何内容,然后到达函数末尾而不返回任何内容,因此出现错误“函数返回无值”。字面上就是这样。

但是,您可以通过直接选择郊区来更轻松地完成此操作。但是,如果您有多个邮政编码到郊区(如果可能的话),您会怎么做?

create or replace FUNCTION get_postCode(i_suburb IN varchar2)
RETURN varchar2
IS
l_postcode varchar2;
BEGIN
select postcode
into l_postcode
where upper(i_suburb) = upper(locality);
--
return l_postcode;
exception
WHEN others then
return null;
END;

在此版本中,如果一个郊区存在于多个邮政编码中,您将得到 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

关于sql - PL/SQL 函数返回 ORA-06503 : PL/SQL: Function returned without value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16505223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com