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

add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top