programing

"오류 1329: 데이터 없음 - 0 행 가져오기, 선택 또는 처리"를 제거하는 방법

sourcejob 2023. 9. 1. 20:51
반응형

"오류 1329: 데이터 없음 - 0 행 가져오기, 선택 또는 처리"를 제거하는 방법

값을 반환할 필요가 없는 저장 프로시저가 있습니다.그것은 부드럽고 문제없이 작동합니다.그러나 실행을 마친 후 다음과 같은 오류 메시지가 출력됩니다.

오류: 데이터 없음 - 0개의 행을 가져오거나 선택하거나 처리했습니다.

이 오류 메시지를 제거하려면 어떻게 해야 합니까?

CREATE PROCEDURE `testing_proc`()  
    READS SQL DATA  
BEGIN  
    DECLARE done INT DEFAULT 0;
    DECLARE l_name VARCHAR(20);
    DECLARE my_cur CURSOR FOR
        SELECT name FROM customer_tbl;
    OPEN my_cur;
        my_cur_loop:
        LOOP FETCH my_cur INTO l_name;
            IF done = 1 THEN
                LEAVE my_cur_loop;
            END IF;
            INSERT INTO names_tbl VALUES(l_name);
        END LOOP my_cur_loop;
    CLOSE my_cur;
END

제 생각에 당신은 당신의 게시물에 다음 행을 포함하는 것을 잊어버린 것 같습니다.

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

당신의 코드는 맞지만 mysql의 버그/이상한 행동으로 인해 처리되더라도 경고가 나타납니다.절차 끝에 테이블을 포함하는 "경고" 문을 추가하여 성공적으로 수행하면 경고가 지워지지 않습니다. (http://dev.mysql.com/doc/refman/5.5/en/show-warnings.html) 의 경우:

SELECT name INTO l_name FROM customer_tbl LIMIT 1;

루프가 끝난 후에.MySQL 5.5.13에서는 Linux 및 Windows에서 경고가 사라집니다.나는 MySQL Bug 60840에 대해 언급했고 나는 그들이 나중에 그것을 고쳐주기를 바랍니다...

다음과 같이 계속 처리기를 정의해야 합니다.

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

다음과 같이 표시됩니다.

DECLARE done INT DEFAULT 0;
DECLARE l_name VARCHAR(20);
DECLARE my_cur CURSOR FOR
    SELECT name FROM customer_tbl;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN my_cur;
    my_cur_loop:
    LOOP FETCH my_cur INTO l_name;
        IF done = 1 THEN
            LEAVE my_cur_loop;
        END IF;
        INSERT INTO names_tbl VALUES(l_name);
    END LOOP my_cur_loop;
CLOSE my_cur;

저는 이것과 마주쳤고 공식 mysql 문서에서 이것을 마주칠 때까지 제 머리를 뽑았습니다.

MySQL 5.6.3 이전 버전에서는 경고 또는 오류를 생성하는 문으로 인해 조건 처리기가 호출되는 경우 처리기가 진단 영역을 지우지 못할 수 있습니다.이로 인해 처리기가 호출되지 않은 것처럼 보일 수 있습니다.다음 토론에서는 문제를 설명하고 해결 방법을 제공합니다.

링크를 클릭하고 아래쪽으로 스크롤하여 세부 정보를 확인하지만, 수정 사항은 CONTINUE Handler 내부에 성공적으로 선택한 내용을 포함하는 것이었습니다.

DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
   SELECT 1 INTO @handler_invoked FROM (SELECT 1) AS t;
END;

여기서 해결책을 시도해봤지만, 계속 처리하는 사람을 포함해서 아무 것도 없었습니다.여전히 MySQL 오류 로그에 메시지가 표시됩니다.나는 또한 내 "선택..."에서 이것을 발견했습니다."..."로 변환하는 것이 타당했지만, 저는 커서를 위해 계속 핸들러가 작동할 것이라고 정말 생각했습니다.어느 쪽이든 "found_rows()"를 사용하여 반환된 행이 완벽하게 작동하는지 확인했습니다.이는 단순한 "선택" 문을 커서로 변환해야 한다는 것을 의미하지만, 작업이 많지 않고 문제를 의미합니다.

DECLARE v_rowcount      integer unsigned;
DECLARE cur_entries cursor for
        select app_name, proc_name, error_code, sum(occurrences) occurrences
        from that_table...; 
open cur_entries; 
set v_rowcount = found_rows();
if v_rowcount > 0 then
  fetch cur_entries into v_app_name, v_proc_name, v_error_code, v_occurrences;
  ...
end if;
close cur_entries;

저는 이것을 여기 제 개인 블로그에 썼습니다: http://tinky2jed.wordpress.com/technical-stuff/mysql/mysql-no-data-zero-rows-fetched-how-to-code-for-it/

범위를 때에서 일적으이현러로반오때발다생 따라서 루프 조건을 확인하십시오.FETCH은 "문"입니다.

이 방법으로 커서 문제가 해결되는지는 모르겠지만 저장된 기능으로 이 경고를 보고 다음을 사용하면 알 수 있습니다.

RETURN (SELECT x From myTable...);

대신에

SELECT x into myVar...return myVar

는 이 도움이 되는 의사로부터 이것을 얻었습니다: http://bugs.mysql.com/bug.php?id=42834 .

코드에서 동일한 오류가 발생했고, 루프 변수(루프하는 동안 사용)가 증가하지 않았다는 것을 깨달았습니다. 따라서 루프는 무한대로 진행되었습니다.

당신의 코드에서도 "완료"를 어디에서도 1로 설정하지 않고 있으며, 그로 인해 코드에 오류가 표시되는 것 같습니다.

아래 코드에서 변수 "done" 대신 테이블의 레코드 수로 초기화되고 삽입할 때마다 감소하는 변수 "count"를 추가했습니다.루프는 카운트=0:

CREATE PROCEDURE `testing_proc`()  
READS SQL DATA  
BEGIN
  DECLARE count INT;
  DECLARE l_name VARCHAR(20);

  SELECT count(*) into count from customer_tbl;

  DECLARE my_cur CURSOR FOR
    SELECT name FROM customer_tbl;

  OPEN my_cur;
    my_cur_loop:
    LOOP FETCH my_cur INTO l_name;
    INSERT INTO names_tbl VALUES(l_name);
    SET count = count - 1;

    IF count = 0 THEN
            LEAVE my_cur_loop;
    END IF;

    END LOOP my_cur_loop;
  CLOSE my_cur;
END

이것이 도움이 되길 바랍니다!

언급URL : https://stackoverflow.com/questions/3463283/how-to-get-rid-of-error-1329-no-data-zero-rows-fetched-selected-or-process

반응형