7
votes

MySQL Sélectionner une fonction

J'essaie d'écrire une fonction MySQL avec un SELECT INTÉRIEUR, mais obtenez toujours un retour nul

CREATE FUNCTION test (i CHAR)
RETURNS CHAR
NOT DETERMINISTIC
BEGIN
DECLARE select_var CHAR;
SET select_var = (SELECT name FROM table WHERE id = i);
RETURN select_var;
END$$

mysql> SELECT test('1')$$
+-----------------+
|    test('1')    |
+-----------------+
| NULL            | 
+-----------------+
1 row in set, 1 warning (0.00 sec)

mysql> 
mysql> 
mysql> SHOW WARNINGS
    -> $$
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'i' at row 1 | 
+---------+------+----------------------------------------+
1 row in set (0.00 sec)


6 commentaires

Cela pourrait être évident mais y a-t-il une rangée dans la table avec ID = 1?


Lorsque j'exécute le choix seul, il revient avec un résultat.


Ne pensez pas que cela causerait cette erreur.


est la colonne "nom" de type char?


Vous avez oublié de nous dire quel était le résultat attendu, ou quel est le schéma de la table, ou à quoi ressemblent son contenu.


Le résultat est que j'ai reçu le nom (Varchar). Mais vous ne pouvez pas faire retour varchar .


5 Réponses :


3
votes

Essayez de spécifier la taille du type de retour . Par exemple, si le nom peut être de 20 caractères, essayez xxx


1 commentaires

Merci!! Pensait que juste définir que le caractère serait automatique.



9
votes

fonctionne avec ceci:

CREATE FUNCTION test (i CHAR)
 RETURNS VARCHAR(SIZE)
 NOT DETERMINISTIC
 BEGIN
  DECLARE select_var VARCHAR(SIZE);
  SET select_var = (SELECT name FROM table WHERE id = i);
  RETURN select_var;
 END$$


0 commentaires

0
votes

Vous avez une table nommée table? Échappez ce nom si c'est vraiment ce qu'il est: xxx

ou mettre le nom de la table dans .... Il semble manquant


0 commentaires

1
votes

Vous avez une erreur dans votre code, si vous n'avez besoin que d'un résultat, vous l'obtenez à partir d'une simple sélection d'une affiliation avec le mot dans comme ceci, rappelez-vous, il renvoie la dernière. < Pré> xxx


0 commentaires

0
votes
DELIMITER $$

USE `mydatabase`$$

DROP FUNCTION IF EXISTS `fnGetActiveEventId`$$

CREATE DEFINER=`mydbuser`@`%` FUNCTION `fnGetActiveEventId`() RETURNS INT(11)
BEGIN   
    SET @eventId = (SELECT EventId FROM `Events` WHERE isActive=1 ORDER BY eventId DESC LIMIT 1);   
    
    RETURN @eventId;
    END$$

DELIMITER ;

0 commentaires