# PDO::sqliteCreateAggregate

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo_sqlite >= 1.0.0)

PDO::sqliteCreateAggregate — Registra una función acumuladora definida por el usuario para usarla en sentencias SQL

### Descripción

public PDO::sqliteCreateAggregate(
string `$function_name`,
callable `$step_func`,
callable `$finalize_func`,
int `$num_args` = ?
): bool
Advertencia

Esta función ha sido declarada EXPERIMENTAL. Su funcionamiento, nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Utilícela bajo su propia responsabilidad.

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.

### Parámetros

`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:

  step(
  mixed `$context`,
  int `$rownumber`,
  mixed `$value1`,
  mixed `$value2` = ?,
  mixed `$..` = ?
  ): mixed

  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.

  El valor devuelto por esta función se empleará como el argumento para `context` en la siguiente llamada del "step" o funciones finalizadorasf.

`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:

  fini(mixed `$context`, int `$rownumber`): mixed

  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.

### Valores devueltos

Devuelve `true` en caso de éxito o `false` en caso de error.

### Ejemplos

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

Sugerencia

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.

Sugerencia

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.

### Ver también

- PDO::sqliteCreateFunction
- sqlite_create_function()
- sqlite_create_aggregate()