Sql ORA-01403:未找到任何数据

Sql ORA-01403:未找到任何数据,sql,oracle,plsql,Sql,Oracle,Plsql,我有一个SQL查询,如果输出为NULL,则不应发送警告 l_sup_id NUMBER; begin SELECT per_all_assignments_f.supervisor_id INTO l_sup_id FROM per_all_assignments_f WHERE person_id = p_person_id AND trunc (sysdate) BETWEEN effective_start_date

我有一个SQL查询,如果输出为NULL,则不应发送警告

l_sup_id    NUMBER;

begin

SELECT  per_all_assignments_f.supervisor_id
    INTO  l_sup_id
FROM    per_all_assignments_f
WHERE   person_id = p_person_id
    AND     trunc (sysdate) BETWEEN effective_start_date
                    AND     effective_end_date
    AND     primary_flag = 'Y';

elsif (p_person_type = 'APPRAISER' AND  l_sup_id IS NOT NULL) then
        hr_utility.set_message(801, 'HR_51888_APR_APPRAISER_NULL');
        hr_utility.raise_error;
end if;
根据逻辑,每当l_sup_id为空时

  hr_utility.set_message(801, 'HR_51888_APR_APPRAISER_NULL');
不应该被执行

但只要l_sup_id为空,我就会得到

ORA-01403:未找到任何数据

日志中的错误


如果l_sup_id不为null,则应用程序工作正常,因为错误表明它指向该条件没有数据,要处理该情况,您需要使用“异常处理”,请参阅更改代码

declare
l_sup_id    NUMBER;

begin

SELECT  per_all_assignments_f.supervisor_id
    INTO  l_sup_id
FROM    per_all_assignments_f
WHERE   person_id = p_person_id
    AND     trunc (sysdate) BETWEEN effective_start_date
                    AND     effective_end_date
    AND     primary_flag = 'Y';

elsif (p_person_type = 'APPRAISER' AND  l_sup_id IS NOT NULL) then
        hr_utility.set_message(801, 'HR_51888_APR_APPRAISER_NULL');
        hr_utility.raise_error;
end if;
--changes start
exception
when no_Data_found then
dbms_output.put_line('No data exists for lsup '|| l_sup_id)

--changes end
end;
编辑:

   SQL> SELECT * FROM TESTEMP WHERE EMPNO=6677;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      6677 JUPITER    CLERK           7902 17-DEC-80        800                    20

SQL>
SQL>  declare
  2   l_count number;
  3   begin
  4   select comm into l_count from testemp where empno=6677 ;
  5   DBMS_OUTPUT.PUT_LINE('lcount is'||l_count);
  6   if (l_count IS NULL) then
  7   dbms_output.put_line('no data');
  8   else
  9   dbms_output.put_line('data');
 10   end if;
 11   end;
 12  /

lcount is
no data

PL/SQL procedure successfully completed.
如果您根据文档中的说明将其与NULL或您希望如何使用它进行比较,则您的条件根本不会进入if

未找到任何数据

SELECT INTO语句不返回行,或者程序引用 嵌套表中已删除的元素或嵌套表中未初始化的元素 按表索引

在PL/SQL代码中,选择。。INTO语句不返回任何行,因此会引发未找到数据的错误。它永远不会转到下一行,即您的
IF-ELSE
构造

如果要继续操作,则需要优雅地处理异常

比如说,

SQL> SET serveroutput ON
SQL>
SQL> DECLARE
  2    o_ename emp.ename%TYPE;
  3    i_empno emp.empno%TYPE;
  4  BEGIN
  5    SELECT ename INTO o_ename FROM emp WHERE empno = i_empno;
  6    -- Handle no_data_found
  7  EXCEPTION
  8  WHEN no_data_found THEN
  9    -- do something
 10    dbms_output.put_line('No records found for employee no '|| i_empno);
 11  END;
 12  /
No records found for employee no

PL/SQL procedure successfully completed.

SQL>

谢谢你的回复。 我创建了以下游标,而不是普通sql

cursor csr_supervisor_id 
                    is
        SELECT  supervisor_id
        FROM    per_all_assignments_f
        WHERE   person_id = p_person_id
            AND     trunc (sysdate) BETWEEN effective_start_date
                    AND     effective_end_date
            AND     primary_flag = 'Y';
然后用l_sup_id拿了过来

open csr_supervisor_id;
fetch csr_supervisor_id into l_sup_id;

现在没有接收到的数据错误。

在代码的中间,对应于你的ELSIF的代码是哪里?<代码>如果(pH-MySuxID是空的),那么如果pHyMySype=“鉴定者”,那么HyUntudio.StIdMead(801,'HRY51888ApPrAdsivieApple NULL);hr_实用程序。raise_错误;elsif(p_person_type='evaluator'和l_sup_id不为NULL)然后hr_实用程序.set_消息(801,'hr_51888_APR_evaluator_NULL');hr_实用程序。raise_错误;如果结束;如果结束
未找到任何数据
您的选择中出现错误。。将其转换为声明。因此,它永远不会转到下一行,即IF-ELSE构造。此处
选择每个\u所有\u分配\u f.主管\u id到l\u sup\u id中
将获得空值。我正在手动将
supervisor\u id
设置为空。因此,从逻辑上讲,不应该找不到任何数据来保持简单。。尝试
在l\u sup\u id
中选择最大值(每个所有工作分配\u f.主管\u id)(除非您没有任何其他非聚合列)!!另一方面,错误是,没有行适合您的搜索。。。这并不意味着它返回null。它不返回任何内容。此解决方案在以下情况下无效。l_sup_id为空,为什么找不到数据出错?这是我的问题。你能在这方面提供帮助吗?请参阅答案的编辑部分以处理空值