(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0)
sqlite_create_aggregate -- SQLiteDatabase->createAggregate — SQL deyimlerinde kullanmak üzere toparlayıcı bir kullanıcı tanımlı işlevi kayda geçirir
$db
, string $işlev_ismi
, callback $sekme_işlevi
, callback $sonuncu_işlev
[, int $değ_sayısı
= -1
] ) : voidNesne yönelimli kullanım
Bir sorgudaki tüm satırlardan toparlanan bir sonucu hesaplayacak bir işlevi kayda geçirmesi dışında sqlite_create_function() işlevi gibidir.
Bu işlevin sqlite_create_function() işlevinden farkı bir
değil üç işlevi kayda geçirmesidir. Betiğiniz gerekli sonuç kümesini sağlar.
Sonuç kümesindeki her satır için sekme_işlevi
çağrılarak elde edilen sonuçlarla toparlama bağlamı oluşturulur. Toparlama
bağlamından veriyi alıp sonucu döndürmek için ise
sonuncu_işlev
çağrılır. Bu geriçağırım işlevlerinin
SQLite'ın tanıdığı veri türlerini döndürmesi gerekir (bir sayıl tür gibi).
db
SQLite Veritabanı özkaynağı. Yordamsal kullanımda sqlite_open() işlevi tarafından döndürülür. Nesne yönelimli kullanımda bu değiştirgeye gerek yoktur.
işlev_ismi
SQL deyimlerinde kullanılacak işlev ismi.
sekme_işlevi
Sonuç kümesindeki her satır için çağrılacak geriçağırım işlevi.
sonuncu_işlev
Satırlardan adım adım toplanan veriden sonucu hesaplayacak geriçağırım işlevi.
değ_sayısı
Geriçağırım işlevi belli sayıda değiştirge gerektiriyorsa SQLite çözümleyiciye bir ipucu vermek için kullanılır.
Hiçbir değer dönmez.
Örnek 1 - azami_uzunluk işlevi örneği
<?php
$data = array(
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
'ten',
);
$db = sqlite_open(':memory:');
sqlite_query($db, "CREATE TABLE strings(a)");
foreach ($data as $str) {
$str = sqlite_escape_string($str);
sqlite_query($db, "INSERT INTO strings VALUES ('$str')");
}
function azami_uzunluk_sek(&$baglam, $dizge)
{
if (strlen($dizge) > $baglam) {
$baglam = strlen($dizge);
}
}
function azami_uzunluk_bitir(&$baglam)
{
return $baglam;
}
sqlite_create_aggregate($db, 'azami_uzunluk', 'azami_uzunluk_sek',
'azami_uzunluk_bitir');
var_dump(sqlite_array_query($db, 'SELECT azami_uzunluk(a) from strings'));
?>
Bu örnekte, bir tablonun sütunlarında bulunan dizgelerin en uzununun boyunu hesaplayan bir veri toparlama işlevi oluşturulmaktadır. Her satır için azami_uzunluk_sek işlevi çağrılmakta ve önceki $baglam değiştirgesindekinden daha uzun olan dizge daima $baglam değiştirgesindekiyle değiştirilmektedir. $baglam değiştirgesi herhangi bir PHP değişkeni gibi bir dizi veya nesne tutabilmelidir.
Bütün satırlar işlemden geçirildikten sonra SQLite, sonucu döndürmek için azami_uzunluk_bitir işlevini çağırır. Burada $baglam değiştirgesindeki veriye dayalı her çeşit hesaplama yapabilirdik. Örneğimiz basit olsun çalıştırılan sorgudan elde edilen sonucu basit bir işleme sokup elde ettiğimiz bağlamı döndürmekle yetindik.
Bilginize:
Yukarıdaki örnek, ikil veri içeren sütunlar varsa gerektiği gibi çalışmaz. Bunun sebebini ve ikil kodlamayla nasıl çalışıldığını öğrenmek için sqlite_udf_decode_binary() işlevinin açıklamasına bakınız.
Değerlerin kopyalarını bağlamda saklayıp sonra bunlar üzerinde işlem yapmanız önerilmez. Yoksa SQLite'ın sorguyu işlemek için çok fazla bellek kullanmasına sebep olursunuz. Her biri 32 baytlık bir dizge içeren bir milyon satır için ne kadar bellek gerektiğini bir düşünün.
SQLite'ın dahili SQL işlevlerini geçersiz kılmak için sqlite_create_function() ve sqlite_create_aggregate() işlevlerini kullanabilirsiniz.