函数返回null而不是期望值

时间:2017-05-01 22:22:53

标签: oracle plsql

当我为函数调用表中不存在的值时:

SELECT pacjent_usun_PK_ERROR(5) from dual

(PESEL =' 5'我的表格中不存在)

该函数返回 NULL

但是当我传递一个有效值时:

SELECT pacjent_usun_PK_ERROR(1) from dual

(PESEL =' 1'存在于我的表格中)

该函数返回 1

这是我的功能:

CREATE OR REPLACE FUNCTION pacjent_usun_PK_ERROR
    ( PES IN NUMBER )
    RETURN NUMBER
IS
    ILE NUMBER;
    ZMIENNA NUMBER;
BEGIN
    SELECT PACJENTID INTO ZMIENNA FROM PACJENT WHERE PESEL=PES;

    SELECT COUNT(PRZYJECIEID) INTO ILE FROM PRZYJECIE_NA_ODDZIAL
    WHERE  PACJENTID=ZMIENNA and rownum=1;

    RETURN ILE;
END;

当我从我的函数测试我的最后一个SELECT时,手动插入PRZYJECIEID (PACJENTID =' 1111'我的表格中不存在)

SELECT COUNT(PRZYJECIEID) FROM PRZYJECIE_NA_ODDZIAL WHERE PACJENTID='1111' and rownum=1; 

结果是: 0

并使用PACJENTID进行测试=' 1' (存在于我的表中)

结果是: 1

我试图理解为什么函数在没有行的情况下返回 NULL 而不是0。

我正在使用Oracle SQL Developer

1 个答案:

答案 0 :(得分:2)

我不知道导致这种行为的原因;如果我能搞清楚,我会再次发布。

在任何情况下,以下版本都应该有效。我使用标准(Oracle)SCOTT模式中的表EMP和DEPT创建了一个类似的函数,我在下面显示的更改在该设置中工作。基本上我消除了中间变量;我在一个查询和分配中做了所有事情。

create or replace FUNCTION pacjent_usun_PK_ERROR
(PES IN NUMBER)
RETURN NUMBER
IS
  ILE NUMBER;
BEGIN
  SELECT COUNT(PRZYJECIEID) INTO ILE 
  FROM   PRZYJECIE_NA_ODDZIAL
  WHERE  PACJENTID=(SELECT PACJENTID FROM PACJENT WHERE PESEL=PES) 
     and rownum=1;
RETURN ILE;
end;

已添加:为了澄清......如果select into...没有返回任何行,PL / SQL应该引发异常,特别是NO_DATA_FOUND异常。值得研究的谜团是PL / SQL在这种情况下不会引发此异常的原因。

最终编辑 - 看起来这一直是PL / SQL函数中的行为,而不是PL / SQL过程。 NO_DATA_FOUND是一个例外(可以通常的方式处理),但不会引发。请参阅关于AskTOM的旧讨论:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::p11_question_id:10321465390114

这意味着当第一个select into没有返回数据时,该函数处于未处理的异常状态。这就是为什么第二个select into没有导致0的计数 - 执行甚至没有达到那么远。

这也意味着你可以保持你的功能代码完全一样,但你需要添加一个异常处理块:

exception
  when no_data_found then return 0;

end;之前

我在我的"模拟"上测试了这个。您的函数(在SCOTT模式中)并且它可以工作。