web-dev-qa-db-fra.com

Comment se débarrasser de «Erreur 1329: aucune donnée - zéro ligne récupérée, sélectionnée ou traitée»

J'ai une procédure stockée qui n'a pas besoin de renvoyer de valeurs. Il fonctionne sans problème et sans aucun problème. Cependant, il génère un message d'erreur après avoir terminé son exécution:

Erreur: aucune donnée - zéro ligne récupérée, sélectionnée ou traitée

Comment puis-je me débarrasser de ce message d'erreur?

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
30
Babibo

Je suppose que vous avez juste oublié d'inclure la ligne suivante dans votre message:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

Votre code est correct, mais un bug/comportement étrange de mysql fait apparaître l'avertissement même s'il a été géré. Vous pouvez éviter que si vous ajoutez une instruction "factice" à la fin de votre procédure qui invoque une table et réussit, cela effacera l'avertissement. (Voir http://dev.mysql.com/doc/refman/5.5/en/show-warnings.html ) Dans votre cas:

SELECT name INTO l_name FROM customer_tbl LIMIT 1;

après la fin de la boucle. Sur MySQL 5.5.13, l'avertissement disparaît, sous Linux et Windows. J'ai commenté le bogue 60840 de MySQL et j'espère qu'ils le corrigeront dans le futur ...

39
RobertG

Vous devez définir un gestionnaire continu comme:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

Cela ressemblerait donc à:

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;
27
robm

Je suis tombé sur cela et j'ai arraché mes cheveux jusqu'à ce que je le croise dans les documents officiels mysql

Avant MySQL 5.6.3, si une instruction qui génère un avertissement ou une erreur provoque l'appel d'un gestionnaire de conditions, le gestionnaire peut ne pas effacer la zone de diagnostic. Cela peut donner l'impression que le gestionnaire n'a pas été invoqué. La discussion suivante illustre le problème et fournit une solution de contournement.

Cliquez sur le lien et faites défiler vers le bas pour plus de détails, mais le correctif consistait à inclure une sélection réussie À L'INTÉRIEUR DU CONTINUATEUR:

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

J'ai essayé les solutions ici et aucune, y compris le gestionnaire de continuer a travaillé pour moi. Je reçois toujours les messages dans le journal des erreurs MySQL. J'ai découvert cela aussi avec mon "select ... into ..." qui avait du sens, mais je pensais vraiment que le gestionnaire continue fonctionnerait pour les curseurs. Quoi qu'il en soit, j'ai trouvé que l'utilisation de "found_rows ()" pour savoir si des lignes étaient retournées fonctionnait parfaitement. Cela signifie que les simples instructions "select into" doivent être converties en curseurs, mais cela ne demande pas beaucoup de travail et résout le problème.

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;

J'ai écrit ceci sur mon blog personnel ici: http://tinky2jed.wordpress.com/technical-stuff/mysql/mysql-no-data-zero-rows-fetched-how-to-code-for- it /

3
Jed

Je ne sais pas si cela résout le problème du curseur, mais j'ai rencontré cet avertissement avec une fonction stockée et j'ai constaté que si vous utilisez:

RETURN (SELECT x From myTable...);

au lieu de

SELECT x into myVar...return myVar

Je l'ai obtenu de ce document utile: http://bugs.mysql.com/bug.php?id=42834

1
user977109

Normalement, cela se produit lorsque vous dépassez une plage de curseurs. Vérifiez donc les conditions de boucle où se trouve l'instruction FETCH

1
Francisco Lemos