mysql perl dbi

mysql - ¿Cómo sé cuántas filas devuelve una consulta Perl DBI?



install dbi perl (7)

¿Por qué no simplemente "selecciona la cuenta (*) ..."?

my ($got_id) = $dbh->selectrow_array("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = ''$exid''");

O para frustrar Little Bobby Tables :

my $q_exid = $dbh->quote($exid); my ($got_id) = $dbh->selectrow_array("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = $q_exid");

O si vas a ejecutar esto mucho:

my $sth = $dbh->prepare("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = ?"); ....save $sth (or use prepare_cached()) and then later my ($got_id) = $dbh->selectrow_array($sth, undef, $exid);

Intento básicamente hacer una búsqueda a través de la base de datos con Perl para saber si hay un artículo con cierta identificación. Esta búsqueda no puede devolver ninguna fila, pero también puede devolver una.

Tengo el siguiente código:

my $th = $dbh->prepare(qq{SELECT bi_exim_id FROM bounce_info WHERE bi_exim_id = ''$exid''}); $th->execute(); if ($th->fetch()->[0] != $exid) { ...

Básicamente, esto intenta ver si se devolvió la ID y, de lo contrario, continuar con la secuencia de comandos. Pero arroja un error de referencia de matriz nula en la $th->fetch()->[0] . ¿Cómo puedo simplemente verificar para ver si devolvió filas o ahora?


Cambiar seleccionar para siempre devolver algo? Esto debería funcionar en Sybase, no sé de otros DB.

my $th = $dbh->prepare(qq{SELECT count(*) FROM bounce_info WHERE bi_exim_id = ''$exid''}); $th->execute(); if ($th->fetch()->[0]) { .... }


En general, no estoy seguro de por qué las personas tienen tanto miedo a las excepciones. Los atrapas y sigues adelante.

my $sth = prepare ... $sth->execute; my $result = eval { $sth->fetchrow_arrayref->[1] }; if($result){ say "OH HAI. YOU HAVE A RESULT." } else { say "0 row(s) returned." }

En este caso, sin embargo, la respuesta de Paul es la mejor.

Además, $sth->rows generalmente no funciona hasta que haya buscado cada fila. Si desea saber cuántas filas coinciden, debe preguntar al motor de la base de datos la pregunta sobre la que desea saber la respuesta; es decir, select count(1) from foo where bar=''baz'' .


La única forma confiable de averiguar cuántas filas devuelve una consulta SELECT es obtenerlas todas y contarlas. Como se indica en la documentación de DBI :

En general, solo puede confiar en un recuento de filas después de una ejecución no SELECCIONADA (para algunas operaciones específicas, como ACTUALIZAR y ELIMINAR) o después de obtener todas las filas de una instrucción SELECCIONAR.

Para las sentencias SELECT, generalmente no es posible saber cuántas filas se devolverán, excepto al recuperarlas todas. Algunos controladores devolverán el número de filas que la aplicación ha obtenido hasta ahora, pero otros pueden devolver -1 hasta que se hayan obtenido todas las filas. Por lo tanto, no se recomienda el uso del método rows o $ DBI :: rows con las sentencias SELECT.

Sin embargo, cuando llega a eso, casi nunca necesita saber eso de antemano de todos modos. Simplemente while ($sth->fetch) para procesar cada fila o, para el caso especial de una consulta que solo devolverá cero o una fila,

if ($sth->fetch) { # do stuff for one row returned } else { # do stuff for no rows returned }


El controlador DBD :: mysql tiene el método rows() que puede devolver el recuento de los resultados:

$sth = $dbh->prepare( ... ); $sth->execute; $rows = $sth->rows;

Esto es específico para el controlador de la base de datos, por lo que podría no funcionar en otros controladores, o podría funcionar de manera diferente en otros controladores.


Este artículo puede ayudar a los usuarios de MySQL:

http://www.arraystudio.com/as-workshop/mysql-get-total-number-of-rows-when-using-limit.html

Afortunadamente, desde MySQL 4.0.0 puede usar la opción SQL_CALC_FOUND_ROWS en su consulta que le indicará a MySQL que cuente el número total de filas sin tener en cuenta la cláusula LIMIT. Aún necesita ejecutar una segunda consulta para recuperar el recuento de filas, pero es una consulta simple y no tan compleja como su consulta que recuperó los datos.

El uso es bastante simple. En su consulta principal debe agregar la opción SQL_CALC_FOUND_ROWS justo después de SELECT y en la segunda consulta debe usar la función FOUND_ROWS () para obtener el número total de filas. Las consultas se verían así:

SELECCIONE el nombre de SQL_CALC_FOUND_ROWS, envíe correos electrónicos a los usuarios DONDE nombrar LIKE ''a%'' LIMIT 10;

SELECCIONE FOUND_ROWS ();

La única limitación es que debe llamar a la segunda consulta inmediatamente después de la primera porque SQL_CALC_FOUND_ROWS no guarda el número de filas en ningún lugar.

Aunque esta solución también requiere dos consultas, es mucho más rápida, ya que solo ejecuta la consulta principal una vez.

Puede leer más sobre SQL_CALC_FOUND_ROWS y FOUND_ROWS () en documentos de MySQL.


my $th = $dbh->prepare(qq{SELECT bi_exim_id FROM bounce_info WHERE bi_exim_id = ''$exid''}); $th->execute(); my $found = 0; while ($th->fetch()) { $found = 1; }

Su consulta no devolverá nada si la fila no existe, por lo que no puede desviar la referencia de la búsqueda.

Actualización : es posible que desee volver a escribir eso como

my $found = $th->fetch();