Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > SGBD
SGBD Toutes vos questions sur l'interaction entre Perl et les bases de données (SQL, mysql, postgresql, ORACLE, ...) Avant de poster, veuillez consulter les FAQs perl, les cours Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 01/06/2012, 11h01   #1
Jasmine80
Membre Expert
 
Avatar de Jasmine80
 
Jasmine
Inscription : octobre 2006
Messages : 2 924
Détails du profil
Informations personnelles :
Nom : Jasmine
Âge : 33
Localisation : Belgique

Informations forums :
Inscription : octobre 2006
Messages : 2 924
Points : 2 192
Points : 2 192
Par défaut tester la validité d'une requête sans l'effectuer

Bonjour à tous,

Code :
1
2
3
4
	my $sql ="INSERT INTO $Table VALUES ('', '$genus', '$species', '$subspecies', '$other', '$dna_type', '$other_storage', '$concentration', '$type', '$internal_ref', '$external_ref', '$accession', '$origin', '$date', '$notation', '$place', '$freezer', '$drawer', '$box', '$date_gly', '$notation_gly', '$place_gly', '$freezer_gly', '$drawer_gly', '$box_gly', '$manager', '$tests', '$sequences', '$documents', '$note');";
	my $sth =$DBconnect->prepare($sql) or print "prepare error\n";
        $sth->execute or die "Could not execute SQL2 statement ... maybe invalid?";
        $sth->finish;
J’insère des données en DB à l'intérieur d'une boucle (module DBI). Je voudrais dans un premier temps, vérifier la validité de toutes mes requêtes SQL afin de n'effectuer l'insertion en DB que si elles sont toutes valides.

Comment vérifier la validité de my $sth =$DBconnect->prepare($sql) et de $sth->execute sans les effectuer si elles sont correctes.

style

Code :
1
2
3
4
5
6
7
8
9
 
my $sth;
 
unless ($sth = $DBconnect->prepare($sql)){
    $ok = 0;
}
unless ($sth->execute){
    $ok = 0;
}
... mais sans effectuer l'insertion en DB


Merci,
__________________
-- Jasmine --

Merci de poser les questions dans le forum, je ne répondrai pas aux MP.
Jasmine80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2012, 13h17   #2
Gardyen
Membre chevronné
 
Avatar de Gardyen
 
Inscription : août 2005
Messages : 501
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 501
Points : 684
Points : 684
Envoyer un message via ICQ à Gardyen
as-tu jeté un coup d'oeil au package SQL::Statement ?
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
Plus les choses changent, plus elles restent les mêmes
Gardyen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2012, 13h23   #3
Jasmine80
Membre Expert
 
Avatar de Jasmine80
 
Jasmine
Inscription : octobre 2006
Messages : 2 924
Détails du profil
Informations personnelles :
Nom : Jasmine
Âge : 33
Localisation : Belgique

Informations forums :
Inscription : octobre 2006
Messages : 2 924
Points : 2 192
Points : 2 192
Non, mais je pensais à une fonction simple, style eval() et non devoir utiliser un autre module.


Code :
1
2
3
4
5
6
7
8
	my $sth2;
 
	unless (eval{$sth2 = $DBconnect->prepare($sql2)}){
	    $ok = 0;
	}
	unless (eval{$sth2->execute}){
	    $ok = 0;
	}
le problème étant qu'avec eval(), les requêtes sont exécutées
__________________
-- Jasmine --

Merci de poser les questions dans le forum, je ne répondrai pas aux MP.
Jasmine80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2012, 13h34   #4
Gardyen
Membre chevronné
 
Avatar de Gardyen
 
Inscription : août 2005
Messages : 501
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 501
Points : 684
Points : 684
Envoyer un message via ICQ à Gardyen
hum... dans la doc dbi il est précisé:
Citation:
In general, DBI drivers do not parse the contents of the statement (other than simply counting any "Placeholders"). The statement is passed directly to the database engine, sometimes known as pass-thru mode.
Du coup sans exécution de la requête ni module externe, ça devient beaucoup plus dur...
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
Plus les choses changent, plus elles restent les mêmes
Gardyen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2012, 13h49   #5
Jasmine80
Membre Expert
 
Avatar de Jasmine80
 
Jasmine
Inscription : octobre 2006
Messages : 2 924
Détails du profil
Informations personnelles :
Nom : Jasmine
Âge : 33
Localisation : Belgique

Informations forums :
Inscription : octobre 2006
Messages : 2 924
Points : 2 192
Points : 2 192
... oui en effet, ce n'est peut-être pas possible ... j'ai installé le module dont tu m'as parlé, je vais y regarder de plus près, merci pour ce conseil.
__________________
-- Jasmine --

Merci de poser les questions dans le forum, je ne répondrai pas aux MP.
Jasmine80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2012, 14h08   #6
Jasmine80
Membre Expert
 
Avatar de Jasmine80
 
Jasmine
Inscription : octobre 2006
Messages : 2 924
Détails du profil
Informations personnelles :
Nom : Jasmine
Âge : 33
Localisation : Belgique

Informations forums :
Inscription : octobre 2006
Messages : 2 924
Points : 2 192
Points : 2 192
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
	# vérification que la requête est valide
 
	my $parser = SQL::Parser->new();
 
	# The call to new() takes two arguments - the SQL string you want to parse, 
	# and the SQL::Parser object you previously created. 
	# The call to new is the equivalent of a DBI call to prepare() - 
	# it parses the SQL into a structure but does not attempt to execute 
	# the SQL unless you explicitly call execute().
 
 
	my $sql2 ="INSERT INTO $Table VALUES ('', '$internal_ref', '$external_ref', '$accession', '$genus', '$species', '$subspecies', '$other', '$dna_type', '$other_storage', '$concentration', '$type', '$origin', '$date', '$notation', '$place', '$freezer', '$drawer', '$box', '$date_gly', '$notation_gly', '$place_gly', '$freezer_gly', '$drawer_gly', '$box_gly', '$manager', '$tests', '$sequences', '$documents', '$note');";
	my $stmt = SQL::Statement->new( $sql2, $parser);
mais j'obtiens l'erreur
Citation:
SQL ERROR: No table name specified!

SQL ERROR: No command found!
alors que cette requête est correcte et que la variable $Table existe


merci pour votre aide
__________________
-- Jasmine --

Merci de poser les questions dans le forum, je ne répondrai pas aux MP.
Jasmine80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2012, 14h41   #7
Gardyen
Membre chevronné
 
Avatar de Gardyen
 
Inscription : août 2005
Messages : 501
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 501
Points : 684
Points : 684
Envoyer un message via ICQ à Gardyen
sql-statement ne veut pas des ; à la fin des requêtes !

étonnant quand même...
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
Plus les choses changent, plus elles restent les mêmes
Gardyen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2012, 14h44   #8
Jasmine80
Membre Expert
 
Avatar de Jasmine80
 
Jasmine
Inscription : octobre 2006
Messages : 2 924
Détails du profil
Informations personnelles :
Nom : Jasmine
Âge : 33
Localisation : Belgique

Informations forums :
Inscription : octobre 2006
Messages : 2 924
Points : 2 192
Points : 2 192
merciiiiiiiiiiii ça fonctionne

^^ t'es trop fort je n'aurais jamais pensé à supprimer le ';'

merci beaucoup et bon weekend
__________________
-- Jasmine --

Merci de poser les questions dans le forum, je ne répondrai pas aux MP.
Jasmine80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


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


 
 
 
 
Partenaires

Hébergement Web