llamar - funciones en perl
¿Cómo puedo escribir una subrutina para inserciones DBI con un número variable de valores? (4)
Estoy haciendo muchas consultas de inserción, y creo que sería mejor escribir una subrutina para ello. Algo así como insertRow($table, @stuff_to_insert)
. Pero, ¿cómo puedo hacer que la subrutina sea dinámica cuando se trata de @stuff_to_insert
, que puede ser cualquier cosa desde 1-5 argumentos?
Algo como:
sub insertRow
{
my $table = shift;
my $placeholders = join('','', map { "?"; } @_);
$dbh->do("INSERT INTO $table VALUES ($placeholders)", undef, @_);
}
Editado: necesita agregar undef
como parámetro. Leon Timmermans sugiere no usar prototipos
El parámetro que pasa parte de él es bastante fácil:
sub foo {
my $table = shift;
my @stuff_to_insert = @_;
# Do stuff here
}
No importa si pasa un parámetro, o cinco o cincuenta, todos lo convertirán en @stuff_to_insert
.
En cuanto a ejecutar las consultas reales, siga el consejo de León y use declaraciones preparadas. (Los ORM pueden ser prácticos, pero, IMO, están sobrevalorados y son excesivos en casos simples).
La mejor solución es probablemente usar un sistema ORM como DBIx :: Class . Hacen que el manejo de SQL sea mucho más fácil.
Si elige permanecer en DBI sin procesar, le aconsejaría que use declaraciones preparadas como esta:
my $query = sprintf ''INSERT INTO %s VALUES(%s)'', dbh->quote_identifier($table), join '','', (''?'') x $columns;
my $sth = $dbh->prepare($query);
for my $row (@rows) {
$sth->execute(@{$row});
}
Esto será un beneficio de velocidad y robustez.
Puede envolver todo en un sub, pero un ORM probablemente ofrece una mejor solución de todos modos.
Solo pasa una referencia a una matriz de argumentos. Luego, en insertRow, itera sobre esa matriz para obtener los argumentos ...