Sql ORA-01403:未找到任何数据
我有一个SQL查询,如果输出为NULL,则不应发送警告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
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为空,为什么找不到数据出错?这是我的问题。你能在这方面提供帮助吗?请参阅答案的编辑部分以处理空值