当我为函数调用表中不存在的值时:
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
答案 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模式中)并且它可以工作。