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 :

probleme avec le resultat d'une procédure stockée


Sujet :

SQL Procédural MySQL

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Par défaut probleme avec le resultat d'une procédure stockée
    Bonjour,
    Je suis en train de faire un calcul de correlation. Avec la requete suivante j'obtiens ma correlation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select @n:=count(observation) as N, @sumX:=sum(var001) as sumX, @sumY:=sum(var001) as sumY,
    @sumXX:=sum(var001*var001) as sumXX, @sumYY:=sum(var001*var001) as sumYY,
    @sumXY:=sum(var001*var001) as sumXY from filtered_data;
    select @cor:=(@n*@sumXY-@sumX*@sumY)/
    sqrt((@n*@sumXX - @sumX*@sumX) *(@n*@sumYY-@sumY*@sumY)) as correlation;
    Ensuite je voulais créer une procédure stockée contenant cette requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    create procedure sp_correlation (in variable1 varchar(6), in variable2 varchar(6)
    begin
    select @n:=count(observation) as N, @sumX:=sum(variable1) as sumX,
    @sumY:=sum(variable2) as sumY,
    @sumXX:=sum(variable1*variable1) as sumXX, @sumYY:=sum(variable2*variable2) as sumYY,
    @sumXY:=sum(variable1*variable2) as sumXY from filtered_data;
    select @cor:=(@n*@sumXY-@sumX*@sumY)/
    sqrt((@n*@sumXX - @sumX*@sumX) *(@n*@sumYY-@sumY*@sumY)) as correlation;
     
    end
    et quand j'appelle cette procédure j'obtiens un resultat null.
    Pourquoi ça me retourne cette valeur?
    merci pour votre aide

  2. #2
    Membre confirmé Avatar de flotho
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Novembre 2006
    Messages : 156
    Par défaut
    Citation Envoyé par pbatty1 Voir le message
    Bonjour,
    Je suis en train de faire un calcul de correlation. Avec la requete suivante j'obtiens ma correlation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select @n:=count(observation) as N, @sumX:=sum(var001) as sumX, @sumY:=sum(var001) as sumY,
    @sumXX:=sum(var001*var001) as sumXX, @sumYY:=sum(var001*var001) as sumYY,
    @sumXY:=sum(var001*var001) as sumXY from filtered_data;
    select @cor:=(@n*@sumXY-@sumX*@sumY)/
    sqrt((@n*@sumXX - @sumX*@sumX) *(@n*@sumYY-@sumY*@sumY)) as correlation;
    Ensuite je voulais créer une procédure stockée contenant cette requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    create procedure sp_correlation (in variable1 varchar(6), in variable2 varchar(6)
    begin
    select @n:=count(observation) as N, @sumX:=sum(variable1) as sumX,
    @sumY:=sum(variable2) as sumY,
    @sumXX:=sum(variable1*variable1) as sumXX, @sumYY:=sum(variable2*variable2) as sumYY,
    @sumXY:=sum(variable1*variable2) as sumXY from filtered_data;
    select @cor:=(@n*@sumXY-@sumX*@sumY)/
    sqrt((@n*@sumXX - @sumX*@sumX) *(@n*@sumYY-@sumY*@sumY)) as correlation;
     
    end
    et quand j'appelle cette procédure j'obtiens un resultat null.
    Pourquoi ça me retourne cette valeur?
    merci pour votre aide
    Personnellement je dirais que lorsqu'on utilise une procédure, il faut passer un paramètre OUT pour le récupérer, sinon, il faut plutôt utiliser une fonction et lui demander un return à l'intérieur

  3. #3
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    ça n'a rien à voir tu peux faire des select dans ta procédure pour afficher directement le résultat...

    pour le null en sortie,c'est normal: ton premier select est une mauvaise utilisation de celui-ci... je rappelle que select sert à faire une projection donc un affichage c'est set que tu dois utiliser pour fair des mise à jour de variables ne nécessitant pas d'accès à la bd:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    set a=5,bidule='truc',...,c=c+1;

    ensuite, tu passes à des calculs mathématiques du varchar (du texte) ça te choque pas? les conversions c'est le saint esprit qui les fait pour toi?

    "observation" tu le sors d'où dans ta procédure? c'est pas une globale (pas de @ devant ni une locale)

    pour déclarer des variables en locale dans une procédure, tu as le mot clé declare avec la syntaxe:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    declare nom1,nom2,..., nomn type;
    avec nom1,nom2,..., nomn les noms des variables qui ont le type type et tu peux même fixer une valeur par défaut:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    declare nom1,nom2,..., nomn type default valeur;

    ça te donne déjà de quoi retoucher ta procédure pour que ça marche un peu mieux...

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Par défaut
    La variable obserbation fait partie de la table filtered_data et variable1 et variable2 sont egalement des proprietes de cette derniere dont je veux calculer la correlation
    la table filtered_data st la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filtered_data(observation var1,var2, ...varn)
    Alors si je si ton raisonnement, je ne peux pas mettre en parametre le nom de mes champs?

  5. #5
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    mea culpa j'avais pas vu ton from à la fin...

    mais ça reste une très mauvaise écriture, la bonne utilise into pour l'affectation des variables... le nombre de résultat doit être le même que le nombre de variables où les mettre:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select a,b,c,...,d into var1,var2,var3,...,varn from nom_table...
    donc ta première requête deviens, même en dehors d'une procédure, simplement:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT count(observation) AS N, sum(variable1) AS sumX, sum(variable2) AS sumY,
    sum(variable1*variable1) AS sumXX, sum(variable2*variable2) AS sumYY, sum(variable1*variable2) AS sumXY
    into @n,@sumX,@sumY,@sumXX, @sumYY, @sumXY
    FROM filtered_data;
    dans la procédure, déclare des variable correctement typèe et sans @ bien sur

    si variable1 et variable2 sont dans ta table pourquoi tu les passes en paramètre ?????

    tu voulais choisir le nom des colonnes?

    alors c'est une requête préparée qu'il faut faire dans la procédure et, là, des variables globales sont nécessaires pour récupérer tes résultats et pas de déclaration des variables dans la procédure

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Par défaut
    si variable1 et variable2 sont dans ta table pourquoi tu les passes en paramètre ?????
    Oui, les variables :variable1,variable2 sont contenues dans la table
    tu voulais choisir le nom des colonnes?
    Oui je veux choisir mes colonnes pour le calcul de ma correlation. Je peux ainsi faire une boucle en c# qui appelle ma procedure.
    Mon but est qu'à l'interieure de la procedure j'enregistre le resultat de ma correlation dans une table correlation.

  7. #7
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    alors ça devrait ressembler à ça:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    drop procedure if exists sp_correlation;
    delimiter ||
    CREATE procedure sp_correlation (IN variable1 varchar(6), IN variable2 varchar(6)
    begin
    set @req=concat('SELECT count(observation) AS N, sum(',variable1,') AS sumX, sum(',variable2,') AS sumY,
    sum(',variable1,'*,'variable1',) AS sumXX, sum(',variable2,'*,'variable2,') AS sumYY, sum(',variable1,'*',variable2,') AS sumXY
    INTO @n,@sumX,@sumY,@sumXX, @sumYY, @sumXY FROM filtered_data;');
    prepare exe from @req;
    execute exe;
    deallocate prepare exe;
    SELECT (@n*@sumXY-@sumX*@sumY)/
    sqrt((@n*@sumXX - @sumX*@sumX) *(@n*@sumYY-@sumY*@sumY)) AS correlation;
    end||
    delimiter ;

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Par défaut
    Merci, ça marche. le prochain objectif est de faire la boucle pour le calcul à l'intérieur de la procédure mais peut êre que c'est plus long qu'une boucle avec C#?

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

Discussions similaires

  1. Pb de requete SQL avec clauses WHERE dans une procédure stockée
    Par CocoLeNain dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 11/06/2010, 23h48
  2. [AC-2007] resultat d'une procédure stockée sur oracle
    Par Vyl.Coyot dans le forum VBA Access
    Réponses: 1
    Dernier message: 22/05/2010, 13h37
  3. Réponses: 5
    Dernier message: 27/05/2008, 15h29
  4. Problemes de resultats d'une procédure stockées
    Par gregb34 dans le forum Oracle
    Réponses: 16
    Dernier message: 09/05/2006, 12h54
  5. Problème avec un LIKE dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2004, 14h38

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