PHP マニュアル
前のページ |  | 次のページ

# sqlite_create_aggregate

(PHP 5)

sqlite_create_aggregate -- SQLステートメントで使用する集約UDFを登録する

## Description

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`は、結果セットの各レコードに関して コールされます。PHP関数は、結果を加算し、集約コンテキストに保存する 必要があります。 全レコードが処理された後、 `finalize_func`がコールされ、 集約コンテキストからデータが取得され、結果が返されます。

例 1. max_length 集約関数の例

`<?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) {
sqlite_query($db, "INSERT INTO strings VALUES('" .
sqlite_escape_string($str) . "')");
}
function max_len_step(&$context, $string) {
if (strlen($string) > $context) {
$context = strlen($string);
}
}
function max_len_finalize(&$context) {
return $context;
}
sqlite_create_aggregate($db, 'max_len', 'max_len_step', 'max_len_finalize');
var_dump(sqlite_array_query($db, 'SELECT max_len(a) from strings'));
?>`

この例では、テーブルのカラムの中で最も長い文字列の長さを計算する集 約関数を作成しています。各レコードについて、この `max_len_step` 関数がコールされ、 `context` パラメータが渡されます。このcontext パラメータは、他のPHP変数と全同じで、配列やオブジェクトを値として代 入することが可能です。この例では、このパラメータを単にこれまでの処 理での最大長を保持するために使用しています。つまり、 `string` の長さがカレントの最大長よりも長かっ た場合、この新しい最大長を保持するためにcontextを更新します。

全てのレコードが処理された後、SQLite は、集約結果を定義するために `max_len_finalize` 関数をコールします。 ここで、`context`にあるデータに基づき何らかの 計算を行うことができます。しかし、上の簡単な例では、クエリを行った 際に結果は計算されているので、単にcontextの値を返しています。

> 注意: 上の例は、カラムにバイナリデータが含まれている場合には正しく動作し ません。その理由とバイナリエンコーディングへの対応方法に関しては、 マニュアルの sqlite_udf_decode_binary() のページをご覧下さい。

> ティップ: contextの中に値のコピーを保存した後、最後にこれらを処理することは 推奨されません。これは、SQLiteがクエリ処理に多くのメモリを使用する ことになるからです。各レコードが32バイト長の文字列を含む百万件のレ コードをメモリに保存するために、どれだけのメモリが必要かを考えてみ て下さい。

> ティップ: SQLiteのネーティブSQL関数をオーバーライドするために sqlite_create_function()および sqlite_create_aggregate()を使用することができ ます。

sqlite_create_function()、 sqlite_udf_encode_binary()、 sqlite_udf_decode_binary()も参照して下さい。

前のページ | ホーム | 次のページ
sqlite_column | 上に戻る | sqlite_create_function