sqlite_create_aggregate
(PHP 5, PECL sqlite:1.0-1.0.3)
sqlite_create_aggregate — הפונקציה מאפשרת רישום פונקציות UDF (פונקציות אישיות של המשתמש(, צוברות , לשימוש בשאילתות SQL .
תיאור
sqlite_create_aggregate()היא מקבילה לsqlite_create_function() אלא שהיא מאפשרת ליצור פוקציות , שמחשבות תוצאות שנצברו לאורך כל השורות תשובה של השאילתה
ההבהדל העיקרי בין הפונקציה הזאת לפונקציהsqlite_create_function()הוא שדרושות שתי פונקציות לנהל צבירת נתוניםstep_func היא פונקציה שמפעילה חישוב על כל שורה בתוצאות, והתוצאה שלה אמורה להישמר במשתנה צובר. אחרי שהשאילתה סיימה לרוץ , קוראים לפונקציהfinalize_func והיא מחזירה את הערך שנצבר מכל שורות השאילתה, אחרי ביצוע פעולת עיבוד רצויה
Example#1 max_length aggregation function example
<?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'));
?>
בדוגמה יצרנו פונקציה צוברת, שמחשבת את האורך של המחרוזת הארוכה ביותר באחד משדות הטבלה. אנחנו קוראים לפונקציה max_len_stepעבור כל שורה משורות הטבלה, כשהפוקציה מעבירה את ה function is context שהוא פרמטר כל כמו פרמטר בphp ,כאן הוא פשוט מחזיק את האורך של במחרוזת הארוכה ביותר, אבל הוא יכול לשמש כמערך ואפילו כעצם אם נרצה. אם המחרוזת שלנו ארוכה יותר .מהמחרוזת העכשוית, היא תשמר כמחרוזת הארוכה ביותר
אחרי עיבוד של כל השורות , SQLite קוראת לפונקציה max_len_finalize בשביל העיבוד הסופי של התוצאה, במקרה שלנו לא נדרש שום עיבוד נוסף אבל יכולנו למשל להוציא שורש מהאורך של המחרוזת, אם היה מתחשק לנו, או לבדוק כמה פעמים מוזכר השם אברהם בפנים.
Note: הפוקציה עלולה לא לעבוד היטב, במקרה של נתונים בינאריים, במצב כזה תן מבט במדריך של הפונקציה sqlite_udf_decode_binary()ע"מ להבין למה זה קורה, ומה לעשות במקרה כזה.
מאוד לא ממולץ לשמור עולתק של הערך שפונקצית ה context, מאחר וזה עלול לגרום לבזבוז זכרון רציני ע"י SQLite .
ניתן להשתמש בפונקציותsqlite_create_function() ו sqlite_create_aggregate()לרמוס פוקציות SQL של SQLite
ראה גםsqlite_create_function(), sqlite_udf_encode_binary() ו sqlite_udf_decode_binary().