복붙노트

[SQL] PL / SQL 블록 문제 : 없음 데이터 오류를 발견

SQL

PL / SQL 블록 문제 : 없음 데이터 오류를 발견

SET SERVEROUTPUT ON
DECLARE
    v_student_id NUMBER := &sv_student_id;
    v_section_id NUMBER := 89;
    v_final_grade NUMBER;
    v_letter_grade CHAR(1);
BEGIN
    SELECT final_grade
    INTO v_final_grade
    FROM enrollment
    WHERE student_id = v_student_id
    AND section_id = v_section_id;

    CASE -- outer CASE
        WHEN v_final_grade IS NULL THEN
            DBMS_OUTPUT.PUT_LINE ('There is no final grade.');
        ELSE
            CASE -- inner CASE
                WHEN v_final_grade >= 90 THEN v_letter_grade := 'A';
                WHEN v_final_grade >= 80 THEN v_letter_grade := 'B';
                WHEN v_final_grade >= 70 THEN v_letter_grade := 'C';
                WHEN v_final_grade >= 60 THEN v_letter_grade := 'D';
                ELSE v_letter_grade := 'F';
            END CASE;

            -- control resumes here after inner CASE terminates
            DBMS_OUTPUT.PUT_LINE ('Letter grade is: '||v_letter_grade);
    END CASE;
    -- control resumes here after outer CASE terminates
END;

나는 테이블에 존재하는 student_id를하지 입력 할 때 나는이 책에서 촬영 한 위의 코드 "예에 의해 오라클 PL / SQL, 제 4 판 2009 년"내 문제는 나에게 다음과 같은 오류를 반환이다

Error report: ORA-01403: no data found
ORA-06512: at line 7
01403. 00000 -  "no data found"
*Cause:    
*Action:

하지만 책에 따라 NULL 값을 반환하고 사건의 흐름을 따라해야합니다.

해결법

  1. ==============================

    1.당신이 변수로 선택하고있다 때 레코드를 사용하면 데이터의 FOUND 오류가 발생한다 반환하지 않습니다. 나는 위의 코드를 작성하는 올바른 방법은 그 자체가 BEGIN / 예외 / END 블록으로 SELECT 문을 래핑하는 것입니다 생각합니다. 예:

    당신이 변수로 선택하고있다 때 레코드를 사용하면 데이터의 FOUND 오류가 발생한다 반환하지 않습니다. 나는 위의 코드를 작성하는 올바른 방법은 그 자체가 BEGIN / 예외 / END 블록으로 SELECT 문을 래핑하는 것입니다 생각합니다. 예:

    ...
    v_final_grade NUMBER;
    v_letter_grade CHAR(1);
    BEGIN
    
        BEGIN
        SELECT final_grade
          INTO v_final_grade
          FROM enrollment
         WHERE student_id = v_student_id
           AND section_id = v_section_id;
    
        EXCEPTION
          WHEN NO_DATA_FOUND THEN
            v_final_grade := NULL;
        END;
    
        CASE -- outer CASE
          WHEN v_final_grade IS NULL THEN
          ...
    
  2. ==============================

    2.책에 대한 정오표 섹션 온라인 체크 가치가 될 수 있습니다.

    책에 대한 정오표 섹션 온라인 체크 가치가 될 수 있습니다.

    여기 http://www.dba-oracle.com/sf_ora_01403_no_data_found.htm이 예외를 처리하는 예는있다

  3. ==============================

    3.귀하의 SELECT 문은 당신이 찾고있는 데이터를 찾을 수 없습니다. 즉, 주어진 STUDENT_ID와 SECTION_ID에 등록 테이블에 기록이 없습니다. 당신은 v_student_id 및 v_section_id의 값을 인쇄, 쿼리를 실행하기 전에 몇 가지 DBMS_OUTPUT.PUT_LINE 문을 넣어 시도 할 수 있습니다. 그들은 당신이 그 (것)들을 포함하는 기대가 포함되지 않을 수 있습니다.

    귀하의 SELECT 문은 당신이 찾고있는 데이터를 찾을 수 없습니다. 즉, 주어진 STUDENT_ID와 SECTION_ID에 등록 테이블에 기록이 없습니다. 당신은 v_student_id 및 v_section_id의 값을 인쇄, 쿼리를 실행하기 전에 몇 가지 DBMS_OUTPUT.PUT_LINE 문을 넣어 시도 할 수 있습니다. 그들은 당신이 그 (것)들을 포함하는 기대가 포함되지 않을 수 있습니다.

  4. ==============================

    4.내 절차의 하단에있는 예외 블록에 의존 수 없을 때 내가 사용하는 다른 방법이있다. 나는 변수 시작 부분에 선언했다 :

    내 절차의 하단에있는 예외 블록에 의존 수 없을 때 내가 사용하는 다른 방법이있다. 나는 변수 시작 부분에 선언했다 :

    my_value VARCHAR := 'default';
    number_rows NUMBER := 0;
    .
    .
    .
    SELECT count(*) FROM TABLE INTO number_rows (etc.)
    
    IF number_rows > 0 -- Then obtain my_value with a query or constant, etc.
    END IF;
    
  5. ==============================

    5.일부 데이터 유형의 우리가 사용하고 있기 때문에이 데이터는 원인을 찾을 수 없습니다.

    일부 데이터 유형의 우리가 사용하고 있기 때문에이 데이터는 원인을 찾을 수 없습니다.

    같은 v_test에 EMPID 선택

    EMPID 및 v_test는 숫자 형식이어야 위에 만 데이터가 저장된다.

    이 오류를 가져올 때 데이터 형식의 KEEP 트랙 그래서,이 뜻에 도움이 될 수 있습니다

  6. from https://stackoverflow.com/questions/1256112/pl-sql-block-problem-no-data-found-error by cc-by-sa and MIT license