Agus escribiste:ok, muchas gracias por la info, pero lo que necesito es en cada acceso a la base de datos, obtener una fila del array para poder editarla y poder pasar el número de línea por vez como parámetro.
Pero eso es lo que hace fechtrow_array()... cada vez que la llamas te devuelve una fila. Las filas te las devuelve en el orden en que salen en la tabla resultado de la consulta.
Agus escribiste:De lo contrario otra forma de resolver esto sería guardando todas las filas en un array que luego iría recorriendo para editar cada fila.
¿Con cual de las dos opciones me podrías ayudar?
Si vas a procesar toda la tabla, y la tabla sabes que cabe físicamente en la memoria del ordenador, yo me leería toda la tabla de golpe. Con una sola sentencia de fetchall_...() me la leo y a partir de ahí trabajo con ella. Si la recupero en forma de
array entonces puedo referirme a sus filas a través de los índices en el
array.
Si solo voy a usar una fila (o unas pocas de ellas), intentaría ajustar la consulta SQL para que me devuelva solo las filas que me interesan; y vuelvo al primer punto.
Si la tabla es tan grande que no cabe en memoria, entonces no me queda otra solución que procesar línea a línea. Posiblemente incluso tenga que guardar el resultado intermedio a disco, si es muy grande.
¡Ojo! Ten en cuenta que después de una consulta DBI, TODA la tabla de resultados es devuelta a DBI (y ocupando memoria). A partir de ella, DBI te dará lo que le pidas (en forma de
array, de
hash, o todo), pero eso que obtienes ocupará aún más memoria (no se reutiliza la memoria ocupada por el resultado de la consulta que está almacenando DBI). En casos muy especiales hay que hacer trucos con la función bind() y cambiar todos los for() y foreach() por while().
O... comprar más memoria para el ordenador