(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0)
sqlite_create_aggregate -- SQLiteDatabase::createAggregate — Registra un aggregato UDF da utilizzare nelle istruzioni SQL
$dbhandle
, string $function_name
, callable $step_func
, callable $finalize_func
[, int $num_args
= -1
] )Stile orientato agli oggetti (metodo):
$function_name
, callable $step_func
, callable $finalize_func
[, int $num_args
= -1
] )sqlite_create_aggregate() è simile a sqlite_create_function() tranne che le funzioni di registrazione possono essere utilizzate per calcolare un risultato aggregato da tutte le righe della query.
La differenza chiave tra questa funzione e
sqlite_create_function() è che entrambe le funzioni sono necessarie
per gestire gli aggregati; la funzione step_func
viene richiamata
per ogni riga del set di risultati. La funzione PHP personalizzata dovrebbe
accumulare i dati e memorizzarli nel contesto di aggregazione.
Una volta che tutte le righe sono state processate,
si esegue la funzione finalize_func
che dovrebbe
prendere i dati dal contesto di aggregazione e restituire il risultato.
La funzione personalizzata deve restituire un tipo riconosciuto da SQLite (ad esempio
un tipo scalare).
dbhandle
Risorsa SQLite Database; restituita da sqlite_open () quando usato in modo procedurale. Questo parametro non è richiesto nel metodo ad oggetti.
function_name
Il nome della funzione usata nell'istruzione SQL.
step_func
Funzione richiamata per ogni riga del set di risultati. I parametri della funzione sono &$context, $value, ....
finalize_func
Funzione di callback richiamata per aggregare i dati da ogni riga. Il parametro della funzione è &$context e la funzione deve ritornare il risultato finale dell'aggregazione.
num_args
Suggerisce al parser SQLite se la funzione di callback accetta un numero predefinito di argomenti.
Nessun valore viene restituito.
Example #1 Esempio di una funzione di aggregazione lunghezza_massima
<?php
$data = array(
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
'ten',
);
$dbhandle = sqlite_open(':memory:');
sqlite_query($dbhandle, "CREATE TABLE strings(a)");
foreach ($data as $str) {
$str = sqlite_escape_string($str);
sqlite_query($dbhandle, "INSERT INTO strings VALUES ('$str')");
}
function max_len_step(&$context, $string)
{
if (strlen($string) > $context) {
$context = strlen($string);
}
}
function max_len_finalize(&$context)
{
return $context;
}
sqlite_create_aggregate($dbhandle, 'max_len', 'max_len_step', 'max_len_finalize');
var_dump(sqlite_array_query($dbhandle, 'SELECT max_len(a) from strings'));
?>
In questo esempio creiamo una funzione di aggregazione che calcola
la lunghezza della stringa più lunga presente in una colonna della
tabella. Per ciascuna riga, si esegue la funzione max_len_step
nella quale viene passato il parametro context
. Questo parametro
è come una qualsiasi variabile PHP ed è impostata per contenere un array od un
oggetto. In questo esempio, verrà utilizzata semplicemente per contenere
la lunghezza massima della stringa; se la
string
è di lunghezza superiore al valore
massimo corrente, noi aggiorneremo il contesto affinchè registri il nuovo massimo.
Quando sono state processate tutte le righe, SQLite esegue la funzione
max_len_finalize per determinare il risultato aggregato.
In questa funzione possiamo svolgere qualsiasi tipo di operazione basata sui dati
presenti nel parametro context
.
Nel nostro esempio abbiamo calcolato il risultato man mano che si processavano le righe,
pertanto non ci resta che restituire il valore.
Nota:
L'esempio precedente non avrebbe funzionato correttamente se la colonna avesse contenuto dati binari. Guardare sul manuale la pagina sqlite_udf_decode_binary() per una spiegazione del perché, e l'esempio di come questo rispetti la codifica binaria.
NON si raccomanda si memorizzare nel contesto una copia dei valori di ciascuna riga, per poi processarli alla fine; questo costringe SQLite a utilizzare una grande quantità di memoria per processare la query - basta pensare a quanta memoria sarebbe necessaria se si memorizzassero un milione di righe, ciscuna contenente una stringa di 32 byte.
Si può utilizzare sqlite_create_function() e sqlite_create_aggregate() per non utilizzare le funzioni SQL native di SQLite.