2009-11-18 5 views
0

Je dois insérer des valeurs dans la base de données en utilisant le module DBI de Perl. J'ai analysé un fichier pour obtenir ces valeurs et donc ces valeurs sont présentes dans un tableau, disons @array1, @array2, @array3. Je sais comment insérer une valeur à la fois, mais pas à partir d'un tableau.Comment insérer des valeurs de tableaux parallèles dans une base de données à l'aide du module DBI de Perl?

Je sais insérer une valeur à la fois:

$dbh = DBI->connect("dbi:Sybase:server=$Srv;database=$Db", "$user", "$passwd") or die "could not connect to database"; 
$query= "INSERT INTO table1 (id, name, address) VALUES (DEFAULT, tom, Park_Road)"; 
$sth = $dbh->prepare($query) or die "could not prepare statement\n"; 
$sth-> execute or die "could not execute statement\n $command\n"; 

Je ne sais pas si je array1 contenant ids, contenant les noms de array2 et array3 contenant l'adresse, comment pourrais-je insérer des valeurs.

+0

Les tableaux parallèles ne sont pas vraiment une bonne façon de faire les choses. – hobbs

Répondre

4

Puisque vous avez des réseaux parallèles, vous pouvez prendre advantange de execute_array.:

my $sth = $dbh->prepare('INSERT INTO table1 (id, name, address) VALUES (?, ?, ?)'); 
my $num_tuples_executed = $sth->execute_array(
    { ArrayTupleStatus => \my @tuple_status }, 
    \@ids, 
    \@names, 
    \@addresses, 
); 

Veuillez noter qu'il s'agit d'un exemple tronqué (et légèrement modifié) de la documentation. Vous aurez certainement envie de vérifier le reste si vous décidez d'utiliser cette fonction.

+0

Oui, bien sûr ... J'ai atteint ma limite de vote pour la journée mais je vais voter pour cette réponse. –

+0

Très apprécié Sinan! – bish

0

Comment ne pas savoir ce que contiennent vos baies? Quoi qu'il en soit, l'approche consiste à parcourir une matrice et à supposer que les autres valeurs ont les valeurs correspondantes dans l'instruction d'insertion.

+0

@ennuikiller: je sais ce que contient mon tableau, je ne suis pas sûr de savoir comment insérer des valeurs dans la base de données. – shubster

2

Utilisez placeholders.

Mise à jour: Je viens de réaliser que vous avez des réseaux parallèles. Ce n'est vraiment pas une bonne façon de travailler avec des éléments de données qui vont ensemble. Avec cette mise en garde, vous pouvez utiliser List::MoreUtils::each_array:

#!/usr/bin/perl 

use strict; use warnings; 

use DBI; 
use List::MoreUtils qw(each_array); 

my $dbh = DBI->connect(
    "dbi:Sybase:server=$Srv;database=$Db", 
    $user, $passwd, 
) or die sprintf 'Could not connect to database: %s', DBI->errstr; 

my $sth = $dbh->prepare(
    'INSERT INTO table1 (id, name, address) VALUES (?, ?, ?)' 
) or die sprintf 'Could not prepare statement: %s', $dbh->errstr; 

my @ids = qw(a b c); 
my @names = qw(d e f); 
my @addresses = qw(g h i); 

my $it = each_array(@ids, @names, @address); 
while (my @data = $it->()) { 
    $sth->execute(@data) 
     or die sprintf 'Could not execute statement: %s', $sth->errstr; 
} 

$dbh->commit 
    or die sprintf 'Could not commit updates: %s', $dbh->errstr; 

$dbh->disconnect; 

Notez que le code est pas testé.

Vous pouvez également lire la FAQ: What's wrong with always quoting "$vars"?. En outre, étant donné que la seule manière de gérer les erreurs est de mourir, vous pouvez envisager de spécifier { RaiseError => 1 } dans l'appel connect.

0

Une autre façon serait d'utiliser un hachage comme zone de stockage intermédiaire. IE:

my $hash = {}; 
foreach(@array1) { 
    $hash->{id} = $array1[$_]; 
    $hash->{name} = $array2[$_]; 
    $hash->{address} = $array3[$_]; 
} 
foreach(keys %$hash) { 
    $sql = "insert into table values(?,?,?)"; 
    $sth = $dbh->prepare($sql) or die; 
    $sth->execute($hash->{id}, $hash->{name}, $hash->{address}) or die; 
} 

Bien que cela dépend à nouveau des trois tableaux en cours de synchronisation. Cependant, vous pouvez modifier ceci pour faire des modifications de valeur ou des vérifications ou des greps dans les autres tableaux de la première boucle via array1 (ie: si vos valeurs dans array2 et array3 sont stockées sous "NN-name" et "NN-address" où NN est l'identifiant du premier tableau et vous devez trouver les valeurs correspondantes et supprimer le NN- avec comme // regex). Cela dépend de la façon dont vos données sont structurées.

Une autre note est de vérifier Class :: DBI et voir si elle pourrait fournir une plus belle et manière plus orientée objet d'obtenir vos données dans

Questions connexes