Forum und email

sqlite_create_aggregate

(PHP 5, PECL sqlite:1.0-1.0.3)

sqlite_create_aggregate — הפונקציה מאפשרת רישום פונקציות UDF (פונקציות אישיות של המשתמש(, צוברות , לשימוש בשאילתות SQL .

תיאור

bool sqlite_create_aggregate ( resource $db , string $function_name , mixed $step_func , mixed $finalize_func [, int $num_args ] )

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()ע"מ להבין למה זה קורה, ומה לעשות במקרה כזה.

Tip

מאוד לא ממולץ לשמור עולתק של הערך שפונקצית ה context, מאחר וזה עלול לגרום לבזבוז זכרון רציני ע"י SQLite .

Tip

ניתן להשתמש בפונקציותsqlite_create_function() ו sqlite_create_aggregate()לרמוס פוקציות SQL של SQLite

ראה גםsqlite_create_function(), sqlite_udf_encode_binary() ו sqlite_udf_decode_binary().