programing

plsql %NOTFound

powerit 2023. 10. 15. 18:07
반응형

plsql %NOTFound

왜 이 코드가 작동하지 않는지 궁금할 뿐입니다.공급업체가 없습니다.id=1내 테이블에

DECLARE
    VAR SUPP_NM VARCHAR(100);
    VAR_SUPP_ID  NUMBER := 1;
    WHILE_VAR CHAR := 'Y';
BEGIN
    SELECT SUPP_NM
    INTO VAR_SUPP_NM
    FROM TEST.SUPPLIER
    WHERE SUPP_ID = VAR_SUPP_ID;
        
    IF SQL%NOTFOUND THEN
        DBMS_OUTPUT.PUT_LINE('SQL DATA NOT FOUND');
    ELSIF SQL%FOUND THEN
        DBMS_OUTPUT.PUT_LINE('DATA FOUND');
    END IF;    
END;

Toad에서 01403 오류가 발생하지만 다음과 같이 처리되지 않습니다.sql%notfound.

왜 그렇지 않습니까?sql%notfound일하는 중?

잡으려면NO_DATA_FOUND예외를 추가하여 코드를 다음과 같이 다시 작성합니다.exception섹션:

DECLARE
    VAR_SUPP_NM VARCHAR2(100);
    VAR_SUPP_ID  NUMBER := 1;
    WHILE_VAR CHAR := 'Y';
BEGIN
  SELECT SUPP_NM
    INTO VAR_SUPP_NM
    FROM TEST.SUPPLIER
   WHERE SUPP_ID = VAR_SUPP_ID;

 DBMS_OUTPUT.PUT_LINE('DATA FOUND');

exception
  when no_data_found 
  then DBMS_OUTPUT.PUT_LINE('SQL DATA NOT FOUND');

END;

체킹SQL%FOUND아니면SQL%NOTFOUND의 경우에는 의미가 없습니다select intostatement, select statement가 행을 반환하지 않으면 항상 상승하기 때문에no_data_found예외입니다. 단, 해당 select 문이 aggregate 함수를 호출하는 경우에는 항상 데이터를 반환하거나 행이 선택되지 않은 경우에는 null을 반환합니다.

사용하지않음varchar데이터 유형, 사용varchar2대신 데이터 유형을 입력합니다.

니콜라스의 대답은 당신이 사용하고 싶다면 원하는 것입니다.SELECT INTO. 그러나 사용할 수 있는 것이 더 중요하다면%FOUND아니면%NOTFOUND,고려하다FETCH대신 커서에서 호출:

DECLARE
    VAR SUPP_NM VARCHAR2(100);
    VAR_SUPP_ID  NUMBER := 1;
    WHILE_VAR CHAR := 'Y';
    CURSOR c1 IS
        SELECT SUPP_NM
        FROM TEST.SUPPLIER
        WHERE SUPP_ID = VAR_SUPP_ID;
BEGIN
    OPEN c1;
    FETCH c1 INTO VAR_SUPP_NM;

    IF c1%NOTFOUND THEN
            DBMS_OUTPUT.PUT_LINE('SQL DATA NOT FOUND');
    ELSIF c1%FOUND THEN
            DBMS_OUTPUT.PUT_LINE('DATA FOUND');
    END IF;

    CLOSE c1;
END;

닉의 대답이 맞습니다.

오라클 문서에는 다음과 같이 명시되어 있습니다.SQL%NOTFOUND함께 일함SELECT INTO확인하기도 전에SQL%NOTFOUND참인 경우 오류는 다음과 같이 발생합니다.no_data_found.

사용하기 위하여SQL%NOTFOUND먼저 손을 대야 합니다.no_data_found오류를 범실.

DECLARE
    VAR SUPP_NM VARCHAR(100);
    VAR_SUPP_ID  NUMBER := 1;
    WHILE_VAR CHAR := 'Y';
BEGIN
    BEGIN
        SELECT SUPP_NM
        INTO VAR_SUPP_NM
        FROM TEST.SUPPLIER
        WHERE SUPP_ID = VAR_SUPP_ID;

        EXCEPTION 
            WHEN NO_DATA_FOUND THEN
                null; -- or write something here if u want.
    END;
    IF SQL%NOTFOUND THEN
        DBMS_OUTPUT.PUT_LINE('SQL DATA NOT FOUND');
    ELSIF SQL%FOUND THEN
        DBMS_OUTPUT.PUT_LINE('DATA FOUND');
    END IF;    
END;

그래서 제가 한 것은 내부에 추가된 것입니다.BEGIN-END블록을 에워싸다SELECT생성하는 문no_data_found예외.그 후에 당신은 다음의 값을 확인할 수 있습니다.SQL%NOTFOUND.

이에 대한 자세한 내용은 Oracle 문서에서 확인할 수 있습니다.내 시간에 있는 이 활성 링크에서 시작하기 https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/errors.htm#LNPLS00703

언급URL : https://stackoverflow.com/questions/13075538/pl-sql-notfound

반응형