(PHP 5 >= 5.1.0, PECL pdo_sqlite >= 1.0.0)
PDO::sqliteCreateAggregate — Registra una función acumuladora definida por el usuario para usarla en sentencias SQL
$function_name
, callable $step_func
, callable $finalize_func
[, int $num_args
] )Esta función ha sido declarada EXPERIMENTAL. Su comportamiento, su nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Use esta función bajo su propio riesgo.
Estemétodo es similar a PDO::sqliteCreateFunction, excepto que registra funciones que pueden ser usadas para calcular un resultado acumulado a través de todas las filas de una consulta.
La diferencia clave entre este método y PDO::sqliteCreateFunction es que son necesarias dos funciones para administrar la acumulación.
function_name
El nombre de la función usado en las sentencias SQL.
step_func
Una función de llamada de retorno para cada fila del conjunto de resultados. La función de PHP debería acumular el resultado y almacenarlo en el contexto de la acumulación.
Esta función necesita ser definida como:
context será NULL
para la primera fila; en
filas subsiguientes tendrá el valor que fue devuelto anteriormente
desde la función 'step'; se debería usar esto para mantener el estado de
la acumulación.
rownumber contendrá el número de fila actual.
finalize_func
Función de llamada de retorno para acumular los datos usados en "step" desde cada fila. Una vez que todas las fila han sido procesadasOnce, se invocará a esta función y debería tomar los datos del contexto de la acumulación y devolver el resultado. Las funciones de llamada de retorno deberían devolver un tipo comprendido por SQLite (esto es, del tipo escalar).
Esta función necesita ser definida como:
context contendrá el valor de retorno de cada última llamada a la función 'step'.
rownumber contendrá el número de filas sobre las que se realiza la acumulación.
El valor devuelto por esta función será utilizado como valor de retorno de la acumulación.
num_args
Una sugerencia para el analizador de SQLite si la función de llamada de retorno acepta un número predeterminado de argumentos.
Devuelve TRUE
en caso de éxito o FALSE
en caso de error.
Ejemplo #1 Ejemplo de función acumuladora max_length
<?php
$datos = array(
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
'ten',
);
$bd = new PDO('sqlite::memory:');
$bd->exec("CREATE TABLE strings(a)");
$insert = $bd->prepare('INSERT INTO strings VALUES (?)');
foreach ($datos as $str) {
$insert->execute(array($str));
}
$insert = null;
function max_len_step(&$context, $rownumber, $string)
{
if (strlen($string) > $context) {
$context = strlen($string);
}
return $context;
}
function max_len_finalize(&$context, $rownumber)
{
return $context;
}
$bd->sqliteCreateAggregate('max_len', 'max_len_step', 'max_len_finalize');
var_dump($bd->query('SELECT max_len(a) from strings')->fetchAll());
?>
En este ejemplo, se crea una función acumuladora que calculará
la longitud de la cadena más larga de las columnas de la
tabla. Para cada fila, la función max_len_step se
invoca y se le pasa un parámetro context
. El parámetro
'context' es como otra variables cualquiera de PHP y se establece para contener un array
o incluso un valor de un objeto. En este ejemplo, se usa simplemente para que contenga
la longitud máxima que se ha visto hasta aquí; si
string
tiene una longitud mayor que el máximo
actual, se actualiza el contexto para que contenga esta nueva longitud máxima.
Después de haber procesado todas las filas, SQLite llama a la
función max_len_finalize para determinar el resultado
acumulado. Aquí, se podría realizar algún tipo de cálcula basado en los
datos encontrados en context
; aunque, en este sencillo
ejemplo se ha calculado el resultado mientras la consulta progresaba, necesitando
así devolver simplemente el valor de 'context'.
NO se recomienda almacenar una copia de los valores de 'context' y luego procesarlos al final, ya que causariá que SQLite utilizara mucha memoria para procesar la consulta; piense simplemente cúanta memoria sería necesaria si estuvieran almacenadas en ella un millón de filas, cada una conteniendo una cadena de 32 bytes de longitud.
Se puede usar PDO::sqliteCreateFunction y PDO::sqliteCreateAggregate para invalidar funciones SQL nativas de SQLite.
Nota:
Este método no está disponible con el controlador SQLite2. Use la API de sqlite de estilo antiguo en su lugar.