programing

PL/SQL 블록 문제:데이터를 찾을 수 없음 오류

sourcejob 2023. 2. 23. 22:44
반응형

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;

위의 코드는 "Oracle PL/SQL by example, 4th Edition 2009"라는 책에서 인용한 것입니다.내 문제는, 내가 를 입력했을 때,student_id테이블에 존재하지 않는 경우 다음 오류를 반환합니다.

오류 보고서: ORA-01403: 데이터를 찾을 수 없습니다.ORA-06512: 회선701403. 00000 - "데이터를 찾을 수 없습니다"* 원인:*액션:

하지만 책에 따르면 Null 값을 반환한 후 케이스 플로우를 따라야 합니다.

INTO 변수를 선택하고 있는데 레코드가 반환되지 않으면 NO DATA FOUND 오류가 발생합니다.위의 코드를 올바르게 쓰는 방법은 SELECT 문을 자체 BEGIN/EXCEPTION/END 블록으로 감싸는 것이라고 생각합니다.예:

...
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
      ...

다른 방법이 있습니다. 제가 의지할 수 없을 때EXCEPTION내 절차의 맨 아래에 차단이 있어.처음에 변수를 선언했습니다.

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;

당신의 책에 대한 에라타 섹션을 온라인으로 확인해 볼 가치가 있을 것이다.

http://www.dba-oracle.com/sf_ora_01403_no_data_found.htm 에 이 예외를 처리하는 예를 나타냅니다.

당신의.SELECT스테이트먼트는 찾고 있는 데이터를 찾을 수 없습니다.즉, 에 기록이 없습니다.ENROLLMENT주어진 것과 함께 식사하다STUDENT_ID그리고.SECTION_ID. 조금 넣어보는게 좋을 것 같아요.DBMS_OUTPUT.PUT_LINE쿼리 실행 전 문, 값 인쇄v_student_id그리고.v_section_id당신이 원하는 것을 담고 있지 않을 수 있습니다.

이 데이터를 찾을 수 없습니다.사용하고 있는 데이터 타입이 원인입니다.

예를 들어 empid를 v_test로 선택합니다.

위의 empid 및 v_test는 숫자 타입이어야 하며, 데이터만 저장됩니다.

따라서 이 오류가 발생할 때 데이터 유형을 추적하는 것이 도움이 될 수 있습니다.

언급URL : https://stackoverflow.com/questions/1256112/pl-sql-block-problem-no-data-found-error

반응형