Come sbarazzarsi di “Errore 1329: Nessun dato: zero file recuperati, selezionati o elaborati”

Ho una stored procedure che non ha bisogno di restituire alcun valore. Funziona senza problemi e senza problemi. Tuttavia, emette un messaggio di errore dopo aver terminato la sua esecuzione:

Errore: nessun dato: zero file recuperate, selezionate o elaborate

Come posso sbarazzarmi di questo messaggio di errore?

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 

Immagino che tu abbia appena dimenticato di includere la seguente riga nel tuo post:

 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

Il tuo codice è corretto, ma un comportamento bug / strano di mysql fa apparire l’avviso anche se è stato gestito. È ansible evitare che aggiungendo un’istruzione “fittizia” alla fine della procedura che invova una tabella e abbia esito positivo, questo cancellerà l’avviso. (Vedi http://dev.mysql.com/doc/refman/5.5/en/show-warnings.html ) Nel tuo caso:

 SELECT name INTO l_name FROM customer_tbl LIMIT 1; 

dopo la fine del ciclo. Su MySQL 5.5.13 l’avviso scompare, su Linux e Windows. Ho commentato MySQL Bug 60840 e spero che lo risolveranno un po ‘di tempo in futuro …

È necessario definire un gestore di continuità come:

 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

Quindi sembrerebbe:

 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; 

Mi sono imbattuto in questo e tirato fuori i miei capelli fino a che non ho trovato questo nei documenti mysql ufficiali

Prima di MySQL 5.6.3, se un’istruzione che genera un avviso o un errore causa l’invocazione di un gestore di condizioni, il gestore potrebbe non cancellare l’area diagnostica. Ciò potrebbe portare all’aspetto che il gestore non è stato richiamato. La seguente discussione illustra il problema e offre una soluzione alternativa.

Fare clic sul collegamento e scorrere verso il basso per i dettagli, ma la correzione doveva includere una selezione di successo INSIDE the CONTINUE HANDLER:

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

Ho provato le soluzioni qui e nessuna, compreso il gestore continua ha funzionato per me. Ricevo ancora i messaggi nel log degli errori MySQL. L’ho scoperto anche con il mio “selezionare … in …” che aveva senso, ma pensavo davvero che il gestore continua avrebbe funzionato per i cursori. In entrambi i casi ho trovato usando “found_rows ()” per scoprire se tutte le righe sono state restituite perfettamente funzionanti. Ciò significa che le semplici istruzioni “select into” devono essere convertite in cursori, ma non è molto lavoro e risolve il problema.

 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; 

Ho scritto questo sul mio blog personale qui: http://tinky2jed.wordpress.com/technical-stuff/mysql/mysql-no-data-zero-rows-fetched-how-to-code-for-it/

Non so se questo risolve il problema del cursore, ma mi sono imbattuto in questo avviso con una funzione memorizzata e ho scoperto che se si utilizza:

 RETURN (SELECT x From myTable...); 

invece di

 SELECT x into myVar...return myVar 

Ho ottenuto questo da questo utile documento: http://bugs.mysql.com/bug.php?id=42834

Normalmente ciò accade quando si supera un intervallo di cursore, quindi controllare le condizioni del ciclo in cui si trova l’istruzione FETCH