TOP書籍連動> UDF(ユーザー定義関数)(2)
まるごと PHP!
まるごと PHP!

Part2:トライ!SQLite(3)

著者:桝形誠二(MASUGATA, Seiji)   2005/3/9
前のページ   1   2
UDF(ユーザー定義関数)(2)

   また、集約関数も集約UDFとして同様に登録できます。UDFと異なり、集約UDFでは、対象レコードすべてを処理し終えた時点で、引数の一番最後に定義した関数が一度だけ呼び出されます(リスト14、リスト15)。
リスト14:AggUDF.php
<?
include( "AggUDF.inc" );

$SQLite = sqlite_factory( "testdb" ) or die( "db open error!!" );

$SQLite->createAggregate( "go_research", "my_research", "my_research_finalize" );

$SQLite->query( "begin" );

$Result = $SQLite->query( "select go_research( bar ) from hoge where foo < 100" );

while( $Array = $Result->fetch ( SQLITE_NUM ) )
{
print_r( $Array );
}

$SQLite->query( "commit" );

?>

リスト15:AggUDF.inc
<?
//-----------------------------//
// 集約UDF関数:my_research
// 01がデータ中に何件存在しているかを調べる
//-----------------------------//
function my_research( &$Context, $String )
{
global $GlobalString;

if( mb_ereg( "01", $String ) == true )
{ ++$Context; $GlobalString .= "\n".$String; }
}

//-----------------------------//
// 集約UDF関数:my_research_finalize
// 集約UDFで最後に呼ばれる関数
//-----------------------------//
function my_research_finalize ( &$Context )
{
global $GlobalString;

return $Context.$GlobalString;
}

?>

   実際に処理を行う関数と結果を返す関数をそれぞれ定義する必要があるので注意してください。

   すでにSQLiteで用意されている関数をUDFおよび集約UDFでオーバーライドすることもできますが、特に理由がない限りは避けるほうが無難です。

一時テーブル

   SQLiteはメモリ上に情報を保持しておくこともできます。メモリ上に保持している情報は処理完了時に破棄されるので、テンポラリとして一時的に利用したい場面に有効でしょう。メモリを使う場合には、パラメータにデータベース名ではなく、:memory:と指定します。

   ただし、接続リソースが別になっているので、既存のテーブルと連結して処理を行いたい場合には、別の工夫が必要になるでしょう。

その他のツールと情報

   SQLiteに対応したツールとしては、phpSQLite Admin(http://phpsqliteadmin.sourceforge.net/)があります(図6)。


図6:phpSQLiteAdminの画面



   phpSQLiteAdminは執筆時点ではバージョン0.2で、機能もそう多くなく、まだまだたくさんの改善の余地があるツールですが、今後SQLiteが一般的に利用されていくにつれて改善されていくでしょう。

   また、SQLite関数のPHPマニュアルはhttp://www.php.net/sqlite/にあるので、これも参考にするとよいでしょう。

前のページ   1   2



著者プロフィール
桝形 誠二
様々な言語を経験していく中でPHPと出会い、初心者に易しいという魅力に惹かれ続けて早5年。色んな事をPHPで実装しようとしすぎて周囲の反感を買いやすいのが最近の悩み。


INDEX
Part2:トライ!SQLite(3)
  オブジェクトAPI
UDF(ユーザー定義関数)(2)