2016-03-31 1 views
0

J'ai une simple instruction SELECT:MySQL Sélectionnez Comptez sur VARCHAR dans PERL

$sql = "SELECT count(*) FROM member_temp WHERE member_Id = '".trim($id)."'"; 

La colonne member_Id est un VARCHAR (25) NOT NULL

Cela fonctionne bien jusqu'à ce que le SELECT arrive à un MEMBER_ID que a une valeur alpha derrière, comme 1126A. Il jette alors l'erreur

Could not prepare SQL statement:SELECT count(*) FROM member_temp WHERE member_Id = '1126A'

En tant que test, je supprimer cet enregistrement et le SELECT fonctionne bien jusqu'à ce que la valeur suivante avec un A.

Comment puis-je exécuter cette requête et traiter les enregistrements avec un caractère alphabétique?

Cela fait partie du plus grand bloc de code qui supprime les enregistrements ne se trouvent pas de la principale table membre:

while (@data = $sth->fetchrow_array()) { 

    my $id = $data[2]; 
    my $pk = $data[0]; 

    $sql = "SELECT count(*) FROM member_temp WHERE member_Id = '" . trim($id) . "'"; 
    #print "$sql\n"; 

    my $xth = $dbh->prepare($sql); 
    $xth->execute(); 

    $cRows = $xth->fetchrow_array() || die "Could not prepare SQL statement:$sql"; 
    #print "$cRows\n"; 

    if ($cRows == 0) { 
     $sql = "DELETE FROM member WHERE sys_Id = " . $pk; 
     $xth = $dbh->prepare($sql); 
     $xth->execute(); 
     $cnt_del++; 
    } 
+1

Essayez d'exécuter directement la requête dans SQL et donner la réponse –

+2

Ce n'est pas vraiment la façon de * préparer * une requête; Pouvons-nous voir votre code? Cela ne devrait pas causer de problème du tout. Le problème se situe ailleurs –

+0

Il se termine avec succès et renvoie une valeur de 0 –

Répondre

2

Ok, c'est Perl répondre maintenant :)

Il n'y a rien de mal à votre requête (sauf qu'il ne prépare pas correctement les instructions et que vous utilisez une interpolation de chaîne).

Dans les commentaires que vous avez dit que si cette requête est exécutée directement

It completes successfully and returns a value of 0

Puis dans votre code que vous avez une condition qui est faux

$cRows = $xth->fetchrow_array() || die "Could not prepare SQL statement:$sql"; 

Cela signifie que même si la requête correctement exécutée, mais a 0 lignes, il devrait vous montrer ce message d'erreur, ce qui n'est pas correct.

Tout ce que vous devez faire est de corriger ce message d'erreur. Ce dé devrait être montré si la requête n'a pas pu s'exécuter, pas quand elle s'est exécutée correctement mais n'a aucun résultat.

Vous pouvez corriger votre requête comme

$sql = "SELECT count(*) FROM member_temp WHERE member_Id = ?"; 
$xth = $dbh->prepare($sql); 
$xth->execute($id) or die("Failed to execute query:". $xth->errstr); 

Et vos lignes vérifier peut être

if ($xth->rows == 0) 
// No match found 
+0

Je vois ce que vous voulez dire, mais je reçois toujours une erreur: DBD :: mysql :: st exécuter échoué: appelé avec 1 lie les variables quand 0 –

+0

Thrn vous n'avez probablement pas mis à jour la requête selon ce code –

+1

Si vous activez ['RaiseError'] (https://metacpan.org/pod/DBI#RaiseError) vous n'avez pas besoin de vérifier le succès de chaque méthode unique. – ThisSuitIsBlackNot