2010-12-01 15 views
2

J'ai cette fonction:fonction MySQL stockée, comment vérifier pour aucune ligne et ne pas générer un avertissement?

DROP FUNCTION IF EXISTS find_linkid; 
DELIMITER // 
CREATE FUNCTION `find_linkid`(pc1 VARCHAR(50) 
    RETURNS INT 
BEGIN 
    DECLARE linkId int; 
     SELECT a.id INTO linkId FROM PC_A a WHERE a.pc=pc1; 
ON   
    IF linkId IS NULL THEN 
     SELECT b.id INTO linkId FROM PC_B b WHERE b.pc=pc1; 
    END IF; 

    RETURN linkId; 
END 
// 

Fondamentalement, exécutez une requête, si cela ne retourne rien (la a.id est déclarée comme NOT NULL), exécutez une autre requête et retourne l'identifiant de lien. Si cela n'est pas trouvé non plus, linkId sera NULL, renvoyant NULL si pc1 n'est pas trouvé du tout est OK.

Cela fonctionne, mais donne des avertissements si la première requête ne retourne rien:

select find_linkid('12BD'); 
+------------------------------+ 
| find_linkid('12BD')   | 
+------------------------------+ 
|       667 | 
+------------------------------+ 
1 row in set, 1 warning (0.00 sec) 

mysql> show warnings; 
+---------+------+-----------------------------------------------------+ 
| Level | Code | Message            | 
+---------+------+-----------------------------------------------------+ 
| Warning | 1329 | No data - zero rows fetched, selected, or processed | 
+---------+------+-----------------------------------------------------+ 
1 row in set (0.00 sec) 

Quelle est la bonne façon d'exécuter une requête, si cela ne retourne rien, exécutez une autre requête?

Répondre

7

Vous pouvez utiliser un CONTINUE HANDLER pour attraper l'avertissement, puis définissez une variable si vous voulez, ou ignoreront simplement en donnant le CONTINUE HANDLER un corps vide.

Voici un exemple pour supprimer l'avertissement (j'ai aussi fixé une parenthèse manquante et enlevé ON étranger à partir de votre code):

DROP FUNCTION IF EXISTS find_linkid; 
DELIMITER // 
CREATE FUNCTION `find_linkid`(pc1 VARCHAR(50)) 
    RETURNS INT 
BEGIN 
DECLARE linkId int; 
DECLARE CONTINUE HANDLER FOR NOT FOUND BEGIN END; 
     SELECT a.id INTO linkId FROM PC_A a WHERE a.pc=pc1; 
    IF linkId IS NULL THEN 
     SELECT b.id INTO linkId FROM PC_B b WHERE b.pc=pc1; 
    END IF; 

    RETURN linkId; 
END 
// 
3

Essayez ce gestionnaire:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET linkId = NULL; 
3

est ici une autre possibilité avec moins boilerplate:

DECLARE _found, _id integer; 
SELECT count(*), sum(a.id) INTO _found, _id FROM PC_A AS a WHERE a.pc = pc1; 
IF _found THEN RETURN _id; END IF; 
SELECT b.id INTO _id FROM PC_B AS b WHERE b.pc = pc1; 
RETURN _id;