Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Oracle 函数返回null而不是预期值_Oracle_Plsql - Fatal编程技术网

Oracle 函数返回null而不是预期值

Oracle 函数返回null而不是预期值,oracle,plsql,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 )

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

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;
当我使用手动插入的PRZYJECIEID测试上次从功能中选择时 (我的表中不存在PACJENTID='1111')

结果是:0

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

结果是:1

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


我正在使用Oracle SQL Developer

我不知道是什么导致了这种行为;如果我能弄明白,我会再发一次

在任何情况下,以下版本都应该有效。我使用standard(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;
添加了:为了澄清。。。如果
selectinto…
没有返回任何行,PL/SQL应该引发异常,特别是
no\u DATA\u FOUND
异常。值得研究的秘密是,为什么PL/SQL在本例中没有引发此异常

最终编辑-似乎这一直是PL/SQL函数中的行为,而不是PL/SQL过程<代码>找不到数据是一个异常(可以用通常的方式处理),但不会引发该异常。请参阅AskTOM上的老讨论:

这意味着,当第一个
选择进入
时,没有返回任何数据,函数处于未处理的异常状态。这就是为什么第二个
选择进入
不会导致计数为0-执行甚至没有那么远

这也意味着您可以保持函数代码的原样,但需要添加异常处理块:

exception
  when no_data_found then return 0;
就在
结束之前


我在您的函数的“模型”上(在SCOTT模式中)测试了这个功能,它可以正常工作。

请适当标记。MySQL和Oracle是不同的,有不同的语法。我想我明白了。。。(请参见后续编辑)。
exception
  when no_data_found then return 0;