programing

Oracle에서 no_data_found ORA-01403이 예외인 이유는 무엇입니까?

muds 2023. 7. 15. 10:41
반응형

Oracle에서 no_data_found ORA-01403이 예외인 이유는 무엇입니까?

SELECT INTO 문이 하나 이상의 행을 반환하지 않으면 ORA-01403이 느려집니다.

다른 모든 DBMS에 대해서는 SELECT에서 정상적인 동작임을 알고 있습니다.오직 Oracle만이 SELECT INTO를 이렇게 처리합니다.

CREATE OR REPLACE PROCEDURE no_data_proc IS
   dummy dual.dummy%TYPE;
BEGIN
  BEGIN 
     SELECT dummy  
       INTO dummy
       FROM dual
      WHERE dummy = 'Y';   
  EXCEPTION 
     WHEN no_data_found THEN
        dbms_output.put_line('Why is this needed?');
  END;
END no_data_proc;

왜요?

제 생각에는 이 예외가 꼭 필요한 것은 아닙니다.그것은 너무 많은 비용이 듭니다.때로는 편리하지만 전체 BEGIN, EXECUMENT, WHEN, END Block을 작성해야 합니다.

제가 보지 못하는 본질적인 이유가 있나요?

예외 블록은 필요하지 않습니다. 상황에 따라 사용할 수도 있고 사용하지 않을 수도 있습니다.

여기서는 예외를 적극적으로 무시하지만(절차가 성공적으로 반환됨), 행을 반환하지 않는 경우 실패하도록 선택하려는 경우 대부분 다음 사항을 고려합니다.

PROCEDURE update_employee_salary (p_empno) IS
   l_salary NUMBER;
BEGIN
   SELECT sal INTO l_salary FROM emp WHERE empno = p_empno FOR UPDATE;
   /* do something with emp data */
END;

여기서 나는 만약 그것이 다음과 함께 호출된다면 나의 기능이 실패하기를 원합니다.empnoEMP 테이블에 존재하지 않습니다.의미 있는 오류 메시지를 표시하기 위해 예외가 발생할 수 있습니다.raise_application_error하지만 대부분의 경우 ORA-01403에 만족합니다.

일반적으로 허용해야 하는 예외는 예상되는 예외뿐입니다(즉, 이 예외가 모든 ORA-01403 또는 해당 문제에 대한 모든 예외를 허용하는 기준이 되어서는 안 됩니다).

그러나 여전히 "SELECT에 검색할 데이터가 없는 경우 예외가 발생하는 이유는 무엇입니까?"라는 질문에 답해야 합니다.

그렇지 않으면 간과될 수 있는 흔한 상황이기 때문에 저는 이것이 이루어졌다고 생각합니다.항상 데이터를 찾기를 기대하는 것처럼 코드를 쓰는 것은 일반적인 일이며, 만약 우리가 다음과 같은 오류 검사를 해야 한다면.

SELECT <something...>
IF SQLCODE = 100 THEN -- No data found
  <no-data handler>
END IF

IMHO는 SQLCODE = 100에 대한 검사를 자주 건너뜁니다.예외가 발생하면 A) 중요한 조건(데이터를 찾을 수 없음)이 발생하고 B) 이에 대한 허용이 없습니다.IMO에서 PL/SQL 엔진에 예외를 발생시키는 것이 실제로 데이터가 검색되지 않았을 때 데이터가 검색되었다는 가정 하에 프로그램이 즐겁게 계속 진행되도록 하는 것보다 낫습니다. 이는 모든 종류의 다른 문제를 야기할 수 있습니다.

공유하고 즐기세요.

사용 방지 예외 절에 대해 MIN을 사용할 수 있습니다.

 SELECT MIN(dummy)  
   INTO dummy
   FROM dual
  WHERE dummy = 'Y'; 

더미 변수는 NULL이 됩니다.

정확히 하나의 행이 필요한 SELECT INTO를 수행하고 있기 때문에(행이 더 많으면 오류도 발생합니다).

행이 하나이거나 없을 수 있는 경우 커서를 사용할 수 있습니다.

행 누락이 오류가 아니라고 판단하고 값을 null로 설정하는 것은 데이터베이스의 작업이 아닙니다.

sql MAX 또는 MIN 함수를 사용할 수도 있습니다.반환되는 행이 없으면 이러한 함수는 NULL을 반환합니다.

예:표에서 MAX(1열) 변수로 선택합니다. 여기서 1열 = '값';

MAX 함수는 Maximum 값을 반환하거나 행이 반환되지 않으면 NULL을 반환합니다.

MAX 기능이 작동합니다. 오류가 발생하지 않습니다. ORA-01403은 INTO를 선택하여 NULL이 반환될 때 작동합니다.

PL/SQL 엔진이 무엇을 해야 하는지 명확하지 않기 때문에 블록을 종료해야 합니까?변수에 NULL이 있는 상태로 눌러야 합니까?다음 블록에서 NOT NULL 열에 삽입하려고 하면 오류 위치를 어떻게 보고해야 합니까?예외로 설정하면 해당 항목에 대해 명시적이어야 합니다.

언급URL : https://stackoverflow.com/questions/3940522/why-is-no-data-found-ora-01403-an-exception-in-oracle

반응형