Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/01/2012, 15h27   #1
Nouveau Membre du Club
 
Inscription : mars 2003
Messages : 203
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 203
Points : 38
Points : 38
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 :
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 :
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
pbatty1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 00h56   #2
Membre régulier
 
Avatar de flotho
 
Homme Florent THOMAS
Architecte de système d'information
Inscription : novembre 2006
Messages : 130
Détails du profil
Informations personnelles :
Nom : Homme Florent THOMAS
Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

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

Informations forums :
Inscription : novembre 2006
Messages : 130
Points : 87
Points : 87
Envoyer un message via Skype™ à flotho
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 :
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 :
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
__________________
Créateur www.kipigo.com
Fondateur www.tdeo.fr
Linux | Java | J2EE | NB Platform | Pentaho | PostgreSQL
flotho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2012, 22h54   #3
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 874
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 874
Points : 1 361
Points : 1 361
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 :
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 :
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 :
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...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 14h29   #4
Nouveau Membre du Club
 
Inscription : mars 2003
Messages : 203
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 203
Points : 38
Points : 38
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 :
filtered_data(observation var1,var2, ...varn)
Alors si je si ton raisonnement, je ne peux pas mettre en parametre le nom de mes champs?
pbatty1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 16h35   #5
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 874
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 874
Points : 1 361
Points : 1 361
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 :
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 :
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
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 17h37   #6
Nouveau Membre du Club
 
Inscription : mars 2003
Messages : 203
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 203
Points : 38
Points : 38
Citation:
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
Citation:
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.
pbatty1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 19h00   #7
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 874
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 874
Points : 1 361
Points : 1 361
alors ça devrait ressembler à ça:
Code sql :
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 ;
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 14h23   #8
Nouveau Membre du Club
 
Inscription : mars 2003
Messages : 203
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 203
Points : 38
Points : 38
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#?
pbatty1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h58.


 
 
 
 
Partenaires

Hébergement Web