Вы не зарегистрированы? Нажмите здесь для регистрации.
Забыли пароль? Запросите новый здесь.
|
Вы должны авторизироваться, чтобы добавить сообщение.
|
|
|
Последние активные темы форума |
|
sqlite_create_aggregate
(PHP 5) sqlite_create_aggregate --
Регистрирует агрегатную функцию для использования в SQL запросах
Описаниеbool sqlite_create_aggregate ( resource dbhandle, string function_name, mixed step_func, mixed finalize_func [, int num_args] ) sqlite_create_aggregate() похожа на
sqlite_create_function(), за исключением того, что
регистрирует функцию, которая может быть использована для вычисления
результата на основе всех записей результата запроса.
Главное отличие этой функции от sqlite_create_function()
состоит в том, что для работы агрегатной функции неоходимы 2 функции;
step_func вызывается для каждой записи из результат
запроса. Эта функция должна аккумулировать результат и сохранять его в
контекстной переменной. После обработки всех записей, вызывается
finalize_func, которая должна обработать данные из
контекстной переменной и вернуть результат.
Пример 1. Пример агрегатной функции max_length
<?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, которой помимо
строки передается контекстная переменная context.
Эту переменню вы можете использовать по своему усмотрению для накопления
результатов вычислений. В нашем примере, в этой переменной хранится
максимальная длина строки; если длина строки string
больше, чем значение, сохраненное в контекстной переменной, контекстной
переменной присваивается новое значение.
После обработки всех записей, SQLite вызовет функцию
max_len_finalize для определения результата агрегатной
функции. Здесь можно было бы провести вычисления, основанные на значении
контекстной переменной context, но в этом простейшем
примере, все вычисления были произведены в процессе обработки запроса, и
остается только вернуть полученное значение.
Замечание:
Приведенный выше пример будет работать некорректно, если прменить
созданную функцию к бинарным данным. Описание функции
sqlite_udf_decode_binary() объясняет, почему это
происходит и как этого избежать.
Подсказка:
НЕ РЕКОМЕНДУЕТСЯ сохранять все полученные значения в контекстной
переменной и затем производить все вычисления на последнем шаге, так как
при этом SQLite может израсходовать большое количество памяти в процессе
обработки запроса - представьте, сколько памяти потребуется, чтобы
сохранить в памяти миллион записей, по 32 байта каждая.
Подсказка:
sqlite_create_function() и
sqlite_create_aggregate() могут быть использованы для
переопределения встроенных функций SQLite.
|
· Гостей: 21
· Пользователей: 0
· Всего пользователей: 453
· Новый пользователь: ZDA
|
|