Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/SQL函数返回ORA-06503:PL/SQL:函数返回时没有值_Sql_Database_Oracle_Select_Plsql - Fatal编程技术网

PL/SQL函数返回ORA-06503: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

我必须编写一个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; 
表_的邮政编码是从邮局获得的,它包含郊区(地址列在表格中)和邮政编码以及与本案例无关的其他字段

当我使用该函数时,它返回正确的值;当我在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; 
/