IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

[MySQL 5.7] #1415 - Not allowed to return a result set from a function


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 125
    Par défaut [MySQL 5.7] #1415 - Not allowed to return a result set from a function
    Salut,

    Je veux créer une fonction SQL sous MySQL, mais j'ai cette erreur :
    #1415 - Not allowed to return a result set from a function
    voici mon code de création de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    DELIMITER //
    CREATE FUNCTION funct_id_stockdate(idExercice int, magasin varchar(50)) RETURNS varchar(25) DETERMINISTIC
    BEGIN
        DECLARE val1 int;
        DECLARE val2, val3, val4, val5 varchar(25);
        -- Récupération de la dernièr valeur de val_seq pour la table StockDate
        SELECT val_seq INTO val1 FROM param_seq WHERE tables = 'StockDate';
        SET val1 = val1 + 1;
        -- Début formatige de la valeur auto-incrément sous le format 0001, 0002 , ..., 9999   
        IF(val1 < 10) THEN
        	SELECT CONVERT(val1, char);
            SET val2 = CONCAT('000',val1);
        ELSEIF(val1 <100 AND val1>9) THEN
            SELECT CONVERT(val1, char);
            SET val2 = CONCAT('00',val1);
        ELSEIF(val1 <1000 AND val1>99) THEN
            SELECT CONVERT(val1, char);
            SET val2 = CONCAT('0',val1);
        ELSE
        	SELECT CONVERT(val1, char);
            SET val2 = val1;
        END IF;
        -- Fin formatage
        -- conversion id EXERCICE en chaine de caractère
        SELECT CONVERT(idExercice, char);
        -- récupération des 3 premières lettre du nom du Magasin en majuscule
        SET val3 = SUBSTR(UPPER(magasin), 1, 3);
        -- Concaténation de l'ID exercice et 3 premières lettre du nom du Magasin en majuscule
    	SET val4 = CONCAT(idExercice,val3);
        -- concaténation de la chaine précédente (val4) et la chaine auto-incrément
        SET val5 = CONCAT(val4,val2);
     
         RETURN val5;
    END//
    DELIMITER ;
    Toutes les recherches que j'ai effectué me parle de la non utilisation de INTO dans une requête SELECT. Et pourtant dans mon cas j'ai respecté cette condition.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Je ne vois pas de clause INTO aux lignes 11, 14, 17, 20 ou 25. Et ce sont bien des commandes SELECT qui y sont exécutées.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 125
    Par défaut
    Merci. j'ai modifié le code ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    DELIMITER //
    CREATE FUNCTION getcodecentre(idExercice int, magasin varchar(50)) RETURNS varchar(25) DETERMINISTIC 
    BEGIN 
    	DECLARE val1 int; 
    	DECLARE val2, val3, val4, val5, val6 varchar(25); 
    	SELECT val_seq INTO val1 FROM param_seq WHERE tables = 'StockDate'; 
    	SET val1 = val1 + 1; 
    	IF(val1 < 10) THEN 
    		SELECT CONVERT(val1, char) INTO val6; 
    		SET val2 = CONCAT('000',val6); 
    	ELSEIF(val1 <100 AND val1>9) THEN 
    		SELECT CONVERT(val1, char) INTO val6; 
    		SET val2 = CONCAT('00',val6); 
    	ELSEIF(val1 <1000 AND val1>99) THEN 
    		SELECT CONVERT(val1, char) INTO val6; 
    		SET val2 = CONCAT('0',val6); 
    	ELSE 
    		SELECT CONVERT(val1, char) INTO val6; 
    		SET val2 = val6; 
    	END IF; 
     
    	SELECT CONVERT(idExercice, char) INTO val6; 
    	SET val3 = SUBSTR(UPPER(magasin), 1, 3); 
    	SET val4 = CONCAT(val6,val3); 
    	SET val5 = CONCAT(val4,val2); 
    	RETURN val5; 
    END
    DELIMITER ;
    et ça donne.

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 125
    Par défaut
    @Artemus24,
    en fait ma fonction est constituée de trois éléments, mais je prend en paramètre seulement deux. l'id sera de cette forme 2019ABC0001, donc je prend en paramètre les parties 2019 et ABC, mais la partie 0001 est récupéré par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT val_seq INTO val1 FROM param_seq WHERE tables = 'StockDate'; 
    SET val1 = val1 + 1;
    .
    Merci de votre proposition. je vais essayer de l'adapter.

  5. #5
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 878
    Par défaut
    Salut à tous.

    C'est ce genre de concaténation que vous cherchez à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    --------------
    CREATE FUNCTION `stock_date`(_idexercice integer,
                                 _magasin    text)
    RETURNS text
      DETERMINISTIC
      LANGUAGE SQL
    BEGIN
      RETURN concat(left(_magasin,3),right(concat('0000',_idexercice),4));
     
    END
    --------------
     
    --------------
    select stock_date(25,'abcdef')
    --------------
     
    +-------------------------+
    | stock_date(25,'abcdef') |
    +-------------------------+
    | abc0025                 |
    +-------------------------+
    --------------
     
    Appuyez sur une touche pour continuer...
    @+

  6. #6
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 878
    Par défaut
    Salut à tous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `param_seq`
    --------------
     
    --------------
    CREATE TABLE `param_seq`
    ( `id`        integer unsigned  NOT NULL auto_increment primary key,
      `val_seq`   integer unsigned  NOT NULL,
      `tables`    varchar(255)      NOT NULL,
      index `idx` (`tables`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `param_seq` (`tables`,`val_seq`) values
      ('StockDate', 3)
    --------------
     
    --------------
    select * from `param_seq`
    --------------
     
    +----+---------+-----------+
    | id | val_seq | tables    |
    +----+---------+-----------+
    |  1 |       3 | StockDate |
    +----+---------+-----------+
    --------------
    CREATE FUNCTION `stock_date`(_idexercice integer,
                                 _magasin    text)
    RETURNS text
      DETERMINISTIC
      LANGUAGE SQL
    BEGIN
      DECLARE val integer;
     
      update `param_seq` set val_seq=val_seq+1 where tables='StockDate';
     
      SET val = (select val_seq from `param_seq` where tables = 'StockDate');
     
      RETURN concat(right(concat('0000',_idexercice),4),left(_magasin,3),right(concat('0000',val),4));
     
    END
    --------------
     
    --------------
    select stock_date(2019,'abcdef')
    --------------
     
    +---------------------------+
    | stock_date(2019,'abcdef') |
    +---------------------------+
    | 2019abc0004               |
    +---------------------------+
    --------------
    select * from `param_seq`
    --------------
     
    +----+---------+-----------+
    | id | val_seq | tables    |
    +----+---------+-----------+
    |  1 |       4 | StockDate |
    +----+---------+-----------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    @+

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 125
    Par défaut
    Merci Artemus24.
    J'ai une question, supposons que la valeur de val_seq > 9999, alors quel sera le comportement de la fonction ?

  8. #8
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 878
    Par défaut
    Salut ibram_im.

    Le type de la colonne "val_seq" est "integer unsigned".
    Le maximum est alors 4 294 967 295.
    Si vous trouvez que ce maximum est trop petit, vous pouvez mettre "binint unsigned" comme type et le maximum sera de 1^64-1.

    Votre question est : que ce passe-t-il en cas de dépassement ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR 1264 (22003) at line 71: Out of range value for column 'val_seq' at row 1
    Un dépassement de capacité et donc une erreur !

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. The executeQuery method must return a result set
    Par maeva13 dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 16/01/2015, 11h51
  2. Procedures stockees, can't return a result set in the given context
    Par misterniark dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 10/07/2007, 10h32
  3. [Delphi] CommandText does not return a result set
    Par jdf-net dans le forum Bases de données
    Réponses: 1
    Dernier message: 11/12/2005, 16h26
  4. procedures stockées:can't return a result set in the given..
    Par ronando dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 27/10/2005, 15h55
  5. Réponses: 2
    Dernier message: 19/04/2005, 15h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo