perl - ¿Por qué el método do de DBI devuelve "0E0" si se afectaron cero filas?
(1)
Me encontré con un problema al ejecutar un código similar al siguiente ejemplo:
my $rows = $dbh->do(''UPDATE table SET deleted=NOW() WHERE id=?'', undef, $id)
or die $dbh->errstr;
if (!$rows) {
# do something else
}
Dado que el estado de los docs que devuelve el número de filas afectadas, pensé que funcionaría.
Preparar y ejecutar una sola sentencia. Devuelve el número de filas afectadas o
undef
en caso de error. Un valor de retorno de-1
significa que el número de filas no se conoce, no es aplicable o no está disponible.
Como resultado, me equivoqué. Cuando lo depuré, vi que $rows
de hecho contiene la cadena 0E0
, que por supuesto es un valor verdadero. Cavé en los documentos más y vi este pedazo de código:
El método do predeterminado es lógicamente similar a:
sub do { my($dbh, $statement, $attr, @bind_values) = @_; my $sth = $dbh->prepare($statement, $attr) or return undef; $sth->execute(@bind_values) or return undef; my $rows = $sth->rows; ($rows == 0) ? "0E0" : $rows; # always return true if no error }
Ahí está. Devuelve 0E0
. Simplemente no entiendo por qué haría eso. ¿Alguien sabe?
Es un valor verdadero, por lo que puede distinguirlo del valor falso que devuelve en caso de error, pero es numéricamente igual a cero (sin advertencia), por lo que sigue siendo igual al número de registros afectados.
$ perl -e''
for (undef, "0E0", 4) {
if ($_) {
printf "Success: %d rows affected/n", $_;
} else {
print "Error!/n";
}
}
''
Error!
Success: 0 rows affected
Success: 4 rows affected
Si se devolvió 0
en caso de éxito cuando no hay registros afectados, se vería obligado a verificar los errores usando defined
, lo cual es mucho menos conveniente que probar la verdad (por ejemplo, foo() or die;
).
Otros ceros verdaderos . (Ignora "0x0"
; advierte.)