subrutina llamar funciones perl insert dbi

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 ...