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 :

Fonction stockée créée, mais impossible de l'exécuter !


Sujet :

SQL Procédural MySQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut Fonction stockée créée, mais impossible de l'exécuter !
    Bonjour,

    Après une bonne semaine à tourner en rond sur Google, le site officiel de MySQL, et les forums, je me tourne vers vous pour l'aide, ou l'explication de ce phénomène que je n'arrive pas à comprendre.
    Le serveur est sous Debian, j'utilise MySQL: 5.1.49-0.
    Connecté au serveur par Putty, en root.


    Le problème : Je créé une fonction stockée, mais je ne peux pas l'exécuter.


    Création de la fonction stockée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    delimiter |
    CREATE FUNCTION hello(s CHAR(20)) RETURNS CHAR(50)
    RETURN CONCAT('Hello, ',s,'!');
    |
    OK, la fonction stockée est bien créée, puisque je la vois sous les tables de la BDD.


    Appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT hello("world");

    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #1305 - FUNCTION hello does not exist

    J'utilise pourtant les fonction stockée depuis un moment, mais ce serveur sous Debian ne semble pas en vouloir ! Et je ne comprends vraiment pas où ça cloche.

    Toute aide, ou information est la bienvenue, je ne sais plus où chercher.
    D'avance merci :)

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Par défaut
    Citation Envoyé par Petit-Bonhomme Voir le message
    Bonjour,

    Après une bonne semaine à tourner en rond sur Google, le site officiel de MySQL, et les forums, je me tourne vers vous pour l'aide, ou l'explication de ce phénomène que je n'arrive pas à comprendre.
    Le serveur est sous Debian, j'utilise MySQL: 5.1.49-0.
    Connecté au serveur par Putty, en root.


    Le problème : Je créé une fonction stockée, mais je ne peux pas l'exécuter.


    Création de la fonction stockée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    delimiter |
    CREATE FUNCTION hello(s CHAR(20)) RETURNS CHAR(50)
    RETURN CONCAT('Hello, ',s,'!');
    |
    OK, la fonction stockée est bien créée, puisque je la vois sous les tables de la BDD.


    Appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT hello("world");

    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #1305 - FUNCTION hello does not exist

    J'utilise pourtant les fonction stockée depuis un moment, mais ce serveur sous Debian ne semble pas en vouloir ! Et je ne comprends vraiment pas où ça cloche.

    Toute aide, ou information est la bienvenue, je ne sais plus où chercher.
    D'avance merci
    cela ne serait pas un probleme de droit ?
    http://forums.mysql.com/read.php?46,...449#msg-229449
    http://www.roseindia.net/mysql/mysql...unctions.shtml
    sinon pas de probleme d'espace ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    Bonjour,

    Je ne pense pas que ce soit un problème d'espace, j'ai vu un post à ce sujet, et j'ai tout de suite vérifié. Je ne fais pas d'espace entre le nom de la fonction, et la parenthèse.

    Par contre, un problème de droit semble plus plausible.
    Je me connecte au serveur distant ( sous Debian Lenny ) par putty, en 'root'.
    Voici les droits d'utilisateur MySQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Utilisateur     Serveur        Mot de passe     Privilèges globaux          "Grant"  	
    root             127.0.0.1      Oui                   ALL PRIVILEGES             Oui

    Tout les droits sont activés "GRANT", "SUPER", "PROCESS" etc...
    En théorie, ça devrait fonctionner,
    Sur cette adresse, on peut lire :
    Creating a CallableStatement for a
    PROCEDURE XXX
    without proper Privilegese
    (needs GRANT SUPER ON *.*)
    result in "FUCNTION XXX does not exist" not found.

    Which is misleading as PROCEDURE XXX exist but
    can not be accessed.
    GRANT SUPER ON *.* ?
    Faut-il que je mette le joker '*' sur le champ serveur ?
    Je vais essayer, on verra bien.

    Si tu as d'autres pistes... n'hésites pas

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Par défaut
    Citation Envoyé par Petit-Bonhomme Voir le message
    Bonjour,

    Je ne pense pas que ce soit un problème d'espace, j'ai vu un post à ce sujet, et j'ai tout de suite vérifié. Je ne fais pas d'espace entre le nom de la fonction, et la parenthèse.

    Par contre, un problème de droit semble plus plausible.
    Je me connecte au serveur distant ( sous Debian Lenny ) par putty, en 'root'.
    Voici les droits d'utilisateur MySQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Utilisateur     Serveur        Mot de passe     Privilèges globaux          "Grant"  	
    root             127.0.0.1      Oui                   ALL PRIVILEGES             Oui

    Tout les droits sont activés "GRANT", "SUPER", "PROCESS" etc...
    En théorie, ça devrait fonctionner,
    Sur cette adresse, on peut lire :


    GRANT SUPER ON *.* ?
    Faut-il que je mette le joker '*' sur le champ serveur ?
    Je vais essayer, on verra bien.

    Si tu as d'autres pistes... n'hésites pas
    tu dis que tu te connectes sur le serveur distant mais il est pas distant puisque tu es en localhost ce que je comprends pas ...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    Il s'agit d'un serveur dédié ( serveur web ). Je m'y connecte soit par Putty, soit par PhpMyAdmin, pour administrer le serveur MySQL.

    Les utilisateurs MySQL sont tous en serveur='localhost' ( pour des raisons de sécurité ), ils sont utilisés par PHP qui est installé sur la machine.

    Cela proviendrait-il d'ici ?

    Je me connecte à PhpMyAdmin en root, j'ai les accès à toutes les DB, je n'ai aucune restriction excepté l'exécution des Procédure/Fonction stockés, que je peux créer ou voir d'ailleurs.

    Est-ce qu'il manque quelque chose au niveau des utilisateurs ?

    Merci pour ton aide.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Par défaut
    Citation Envoyé par Petit-Bonhomme Voir le message
    Il s'agit d'un serveur dédié ( serveur web ). Je m'y connecte soit par Putty, soit par PhpMyAdmin, pour administrer le serveur MySQL.

    Les utilisateurs MySQL sont tous en serveur='localhost' ( pour des raisons de sécurité ), ils sont utilisés par PHP qui est installé sur la machine.

    Cela proviendrait-il d'ici ?

    Je me connecte à PhpMyAdmin en root, j'ai les accès à toutes les DB, je n'ai aucune restriction excepté l'exécution des Procédure/Fonction stockés, que je peux créer ou voir d'ailleurs.

    Est-ce qu'il manque quelque chose au niveau des utilisateurs ?

    Merci pour ton aide.
    tu veux me dire qu'ils peuvent exécuter tes fonctions et pas toi ?
    mais même si tu les créées ou si tu les utilisent en préfixant par le nom de la base ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    Non, pas exactement. Ils ne peuvent pas l'executer non plus. D'où mon incompréhension total.

    Le cas chez moi. J'ai un serveur local ( sur mon ordinateur personnel donc ) ou j'ai toute la batterie Apache2, MySQL5.1, PHP5. Je peux créer et exécuter les Fonctions stockés sans soucis.

    Le serveur est un cas classique de serveur web. Pourtant, lorsque je me connecte à PhpMyAdmin, et que j'essaie de faire de même sur le serveur distant. j'ai cette fameuse erreur "#1305 - FUNCTION hello does not exist
    ". Pourtant lorsque je vais dans la Base de données: mysql -> Table: proc "Stored Procedures" je vois ma fonction.

    Même en préfixant la table, même résultat : SELECT `mydb`.hello('world');

    Y'a surement un truc qui va pas quelque part. Mais où ?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Par défaut
    Citation Envoyé par Petit-Bonhomme Voir le message
    Non, pas exactement. Ils ne peuvent pas l'executer non plus. D'où mon incompréhension total.

    Le cas chez moi. J'ai un serveur local ( sur mon ordinateur personnel donc ) ou j'ai toute la batterie Apache2, MySQL5.1, PHP5. Je peux créer et exécuter les Fonctions stockés sans soucis.

    Le serveur est un cas classique de serveur web. Pourtant, lorsque je me connecte à PhpMyAdmin, et que j'essaie de faire de même sur le serveur distant. j'ai cette fameuse erreur "#1305 - FUNCTION hello does not exist
    ". Pourtant lorsque je vais dans la Base de données: mysql -> Table: proc "Stored Procedures" je vois ma fonction.

    Même en préfixant la table, même résultat : SELECT `mydb`.hello('world');

    Y'a surement un truc qui va pas quelque part. Mais où ?
    cela ne serait pas un module qui gere les procedures stockés a ajouter ?
    car meme quand je faisais mon cours de programmation avancée et que j'etais sous linux mysql avait un fonctionnement different sous linux et sous windows ... donc moi cela me fait penser a un module dynamique qui se trouve pas dans le fichier de config un truc de ce genre tu es sur aussi cote securite que tu as autorisé le lancement de procedure perso ?
    l'ideal aurait ete de tester cela sur une distrib linux en dehors de ton serveur

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    Je me demande bien si effectivement, ce serait pas un paquet debian à ajouter.

    tu es sur aussi cote securite que tu as autorisé le lancement de procedure perso ?
    Que dois-je faire pour lui donner les droits ? si c'est dans MySQL, tout les droits sont coché pour toutes les bases de données et toutes les tables.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Par défaut
    Citation Envoyé par Petit-Bonhomme Voir le message
    Je me demande bien si effectivement, ce serait pas un paquet debian à ajouter.



    Que dois-je faire pour lui donner les droits ? si c'est dans MySQL, tout les droits sont coché pour toutes les bases de données et toutes les tables.
    alors cela vient problablement de l'installation de ta base je t'avoue je suis plus postgresql mais je pense que dans ton gestionnaire de paquets tu dois avoir un paquet debian sur les procedure stockées ...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    http://dev.mysql.com/doc/refman/5.1/...-routines.html :
    Stored routines (procedures and functions) are supported in MySQL 5.1.
    Cela veut pourtant dire que c'est supporté nativement depuis MySQL 5.1

    En ce qui concerne les paquets Debian, je n'ai trouvé aucun paquets mysql en rapport avec les "Stored Procedure/Function".

    Décidément, je me demande si je vais arriver à les utiliser sur Debian.
    Je continue à chercher.

    Pour information :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW CREATE FUNCTION hello
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Function     sql_mode     Create Function     character_set_client     collation_connection     Database Collation
    hello           CREATE DEFINER=`root`@`localhost` FUNCTION `hello`...     utf8     utf8_general_ci     latin1_swedish_ci
    Elle existe belle et bien.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Par défaut
    peut etre trouveras tu la reponse dans ce pdf
    http://www.peregrinesalon.com/wp-con...procedures.pdf
    Citation Envoyé par Petit-Bonhomme Voir le message
    http://dev.mysql.com/doc/refman/5.1/...-routines.html :


    Cela veut pourtant dire que c'est supporté nativement depuis MySQL 5.1

    En ce qui concerne les paquets Debian, je n'ai trouvé aucun paquets mysql en rapport avec les "Stored Procedure/Function".

    Décidément, je me demande si je vais arriver à les utiliser sur Debian.
    Je continue à chercher.

    Pour information :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW CREATE FUNCTION hello
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Function     sql_mode     Create Function     character_set_client     collation_connection     Database Collation
    hello           CREATE DEFINER=`root`@`localhost` FUNCTION `hello`...     utf8     utf8_general_ci     latin1_swedish_ci
    Elle existe belle et bien.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    Nouvelle piste : la base de donnée avec un '.' provoque cette erreur.
    Je me connecte en root sur PhpMyAdmin, puis j'exécute les lignes suivantes.

    Fonctionne correctement \o/ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    # Création de la DB
    CREATE DATABASE `DB`;
    GRANT ALL PRIVILEGES ON `DB`.* TO 'uuu'@'localhost' IDENTIFIED BY 'ppp';
    FLUSH PRIVILEGES;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # Création de la Fonction Stockée
    delimiter |
    CREATE FUNCTION hello(s CHAR(20)) RETURNS CHAR(50)
    RETURN CONCAT('Hello, ',s,'!');
    |
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    # Test
    SELECT hello("world");
     
    # Réponse
    +-------------------+
    | hello("world")    |
    +-------------------+
    | Hello, world!     |
    +-------------------+


    Ne Fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    # Création de la DB
    CREATE DATABASE `DB.DB`;
    GRANT ALL PRIVILEGES ON `DB.DB`.* TO 'uuu'@'localhost' IDENTIFIED BY 'ppp';
    FLUSH PRIVILEGES;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # Création de la Fonction Stockée
    delimiter |
    CREATE FUNCTION hello(s CHAR(20)) RETURNS CHAR(50)
    RETURN CONCAT('Hello, ',s,'!');
    |
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    # Test
    SELECT hello("world");
    # ou
    SELECT `DB.DB`.hello('xxx');
    # ou
    SELECT `DB.DB`.`hello`('xxx');
     
    # Réponse
    +------------------------------------------------+
    | hello("world");                                |
    +------------------------------------------------+
    | #1305 - FUNCTION DB.DB.hello does not exist    |
    +------------------------------------------------+
    Je vais lire ton PDF pour voir comment faire pour les DB contenant un POINT (.) dans le nom.
    Affaire à suivre.

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Par défaut
    pourquoi mets tu des . dans tes noms de bases de données ?
    extrait de http://dev.mysql.com/doc/refman/5.0/en/identifiers.html

    A user variable cannot be used directly in an SQL statement as an identifier or as part of an identifier. See Section 8.4, “User-Defined Variables”, for more information and examples of workarounds.

    There are some restrictions on the characters that may appear in identifiers:

    *

    No identifier can contain ASCII NUL (0x00) or a byte with a value of 255.
    *

    Database, table, and column names should not end with space characters.
    *

    Database and table names cannot contain “/”, “\”, “.”, or characters that are not permitted in file names.


    Citation Envoyé par Petit-Bonhomme Voir le message
    Nouvelle piste : la base de donnée avec un '.' provoque cette erreur.
    Je me connecte en root sur PhpMyAdmin, puis j'exécute les lignes suivantes.

    Fonctionne correctement \o/ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    # Création de la DB
    CREATE DATABASE `DB`;
    GRANT ALL PRIVILEGES ON `DB`.* TO 'uuu'@'localhost' IDENTIFIED BY 'ppp';
    FLUSH PRIVILEGES;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # Création de la Fonction Stockée
    delimiter |
    CREATE FUNCTION hello(s CHAR(20)) RETURNS CHAR(50)
    RETURN CONCAT('Hello, ',s,'!');
    |
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    # Test
    SELECT hello("world");
     
    # Réponse
    +-------------------+
    | hello("world")    |
    +-------------------+
    | Hello, world!     |
    +-------------------+


    Ne Fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    # Création de la DB
    CREATE DATABASE `DB.DB`;
    GRANT ALL PRIVILEGES ON `DB.DB`.* TO 'uuu'@'localhost' IDENTIFIED BY 'ppp';
    FLUSH PRIVILEGES;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # Création de la Fonction Stockée
    delimiter |
    CREATE FUNCTION hello(s CHAR(20)) RETURNS CHAR(50)
    RETURN CONCAT('Hello, ',s,'!');
    |
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    # Test
    SELECT hello("world");
    # ou
    SELECT `DB.DB`.hello('xxx');
    # ou
    SELECT `DB.DB`.`hello`('xxx');
     
    # Réponse
    +------------------------------------------------+
    | hello("world");                                |
    +------------------------------------------------+
    | #1305 - FUNCTION DB.DB.hello does not exist    |
    +------------------------------------------------+
    Je vais lire ton PDF pour voir comment faire pour les DB contenant un POINT (.) dans le nom.
    Affaire à suivre.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    Bonjour,

    pourquoi mets tu des . dans tes noms de bases de données ?
    Tout simplement parce que la serveur est multi-domaine, et que j'ai une DB pour chaque nom de domaine. Chaque DB s'appelle donc de la même manière que le site auquel elle est associée.

    J'avais lu que ce n'était pas conseillé, cependant en utilisant les ` ( `domain.tld` ), je n'avais jamais eu de soucis.

    Il semblerait que je n'ai plus le choix, il va me falloir renommer toutes les DB en remplaçant les . par des _

    Je me le Post en Résolu.
    Merci pour ton aide, et ta patience.

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

Discussions similaires

  1. [2014] 2 Sum mais "Impossible d'exécuter une fonction d'agrégation"
    Par pompom75 dans le forum Développement
    Réponses: 5
    Dernier message: 06/02/2015, 09h13
  2. Réponses: 2
    Dernier message: 20/09/2014, 15h07
  3. [RHEL5&10G] Base créée mais impossible à démarrer
    Par Leeloo_Multiboot dans le forum Installation
    Réponses: 5
    Dernier message: 24/04/2008, 15h32
  4. afficher la définition d'une fonction stockée
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/09/2004, 13h28
  5. Export des fonctions stockées
    Par bob_doulz dans le forum Oracle
    Réponses: 5
    Dernier message: 20/07/2004, 11h18

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