Oracle PL/SQL - 使用“SELECT INTO”时出现 ORA-01403“未找到数据”

use*_*026 5 plsql oracle11g

我有一个 pl sql 代码,它按顺序执行三个查询以确定匹配级别并执行一些逻辑
问题是 - 当第一个查询没有结果(完全有效的场景)时,我得到 ORA-01403 找不到数据。
我知道我需要在 NO_DATA_FOUND 时加入 [Exception 子句]-但是如何添加它并继续下一个查询?

PL/SQL Code
     SELECT A into PARAM A FROM SAMPLE WHERE SOME CONDITION;
     --  GOT ORA-01403  No data found HERE 

     MATCH_LEVEL =1;
     if A is null then 
          do some logic;
     end if


     SELECT A INTO PARAM_B FROM SAMPLE WHERE SOME OTHER CONDITION
     MATCH_LEVEL =2
     if A is null then 
          do some logic 2;
     end if



     SELECT A INTO PARAM_B FROM SAMPLE WHERE SOME OTHER CONDITION
     MATCH_LEVEL =3
     if A is null then 
          do some logic 3;
     end if

END    PL/SQL Code
Run Code Online (Sandbox Code Playgroud)

Nul*_*ull 6

Declare
--your declarations 
begin
SELECT A into PARAM A FROM SAMPLE WHERE SOME CONDITION;
 --  GOT ORA-01403  No data found HERE 

 Begin

   MATCH_LEVEL =1;
   if A is null then 
        do some logic;
   end if;
 EXCEPTION 
 WHEN NO_DATA_FOUND THEN 
  dbms_output.put_line ('Error...'); 
 END; 
 --- and son on for other blocks

end;
Run Code Online (Sandbox Code Playgroud)


T.S*_*.S. 5

只要你的周围SELECT INTObegin-end;

begin 

    -- your faulty statement here
Exception
When NO_DATA_FOUND Then
    -- Do what you want or nothing 
WHEN TOO_MANY_ROWS THEN
    -- what if you get more then one row? and need specific handler for this 
When OTHERS Then
    -- do something here or nothing (optional - may happen if you have more than your SELECT INTO between 'begin' and 'Exception')

end;
Run Code Online (Sandbox Code Playgroud)

这就像tryPL/Sql

使用此技术,您可以记录语句失败的原因。

  • 如果块的目标是捕获“NO_DATA_FOUND”,那么“WHEN OTHERS”充其量是毫无意义的,最糟糕的是危险。 (2认同)
  • 危险在于阅读该示例的人实际上将在该部分中什么也不做:`WHEN OTHERS THEN NULL;`,这将导致代码忽略除“NO_DATA_FOUND”之外的所有错误。 (2认同)
  • 我不认为任何人是白痴。然而,如果有人没有足够的经验来寻找“NO_DATA_FOUND”错误的解决方案,那么他们很可能不知道在 PL/SQL 中处理错误的最佳实践。在这种情况下,您的指令“在这里做或什么都不做”可以按字面意思阅读,这可能会导致错误的代码。这似乎值得评论。 (2认同)