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;