2012-03-08 3 views
2

Je souhaite copier un seul enregistrement d'une table, modifier certains des champs de l'enregistrement et les insérer dans la même table. La table a 90 colonnes. Pensée d'utiliser insert..select dans une instruction mais il y a 90 colonnes et j'ai besoin de dire le nom de la colonne dans la requête de sélection. Comment puis-je le faire d'une meilleure manière à Perldbi. Pls me donne un exemple.Insert DBI Perl et sélectionnez

Répondre

3

Fetch et mettre en cache les noms de colonnes pour votre table à l'aide NAME statement attribute

my $sth = $dbh->prepare('SELECT * FROM my_table where 1=0'); 
$sth->execute; 
my $cols = $sth->{NAME}; 

puis utilisez $ pour construire Col. votre insert ... select en utilisant une fonction de remplacement pour injecter vos modifications dans la sélection.

my %mods_for_column = ('foo' => 'foo+10', 'bar' => 'trim(bar)'); 
my $inscols = join(',', @$cols); 
my $selcols = join(',', 
    map { exists($mods_for_column($_)) ? $mods_for_column($_) : $_ } @$cols 
); 
my $sql = "insert into my_table ($inscols) select $selcols from my_table where mumble..."; 
+0

Cela devrait être '$ mods_for_column {$ _}' plutôt que 'mods_for_column ($ _)'. Et il y a un méchant bug caché là-dedans. Que faire si '% mods_for_column' inclut' baz => 0'? Mieux vaut utiliser «existe» plutôt que de vérifier la vérité. –

+0

Merci beaucoup pour l'info. je veux avoir foo remplacé par 0. 'foo' => '0'. foo est un champ numérique dans la table. Ça ne marche pas quand j'ai zéro sur la carte. – Arav

+0

@davorg: c'est ce que je reçois pour taper du code sans l'essayer :(J'ai édité l'exemple incorporant vos suggestions – dbenhur