Forum und email

PDO->sqliteCreateAggregate()

(No version information available, might be only in CVS)

PDO->sqliteCreateAggregate() — SQL æ–‡ã§ä½¿ç”¨ã™ã‚‹é›†ç´„ユーザ定義関数 (UDF) を登録ã™ã‚‹

説明

PDO
bool sqliteCreateAggregate ( string $function_name , callback $step_func , callback $finalize_func [, int $num_args ] )
警告

ã“ã®é–¢æ•°ã¯ã€ 実験的 ãªã‚‚ã®ã§ã™ã€‚ã“ã®é–¢æ•°ã®å‹•作・ åå‰ãƒ»ãã®ä»–ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«æ›¸ã‹ã‚Œã¦ã„る事項ã¯ã€äºˆå‘Šãªãã€å°†æ¥çš„㪠PHP ã®ãƒªãƒªãƒ¼ã‚¹ã«ãŠã„ã¦å¤‰æ›´ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ ã“ã®é–¢æ•°ã¯è‡ªå·±è²¬ä»»ã§ä½¿ç”¨ã—ã¦ãã ã•ã„。

ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ PDO->sqliteCreateFunction() ã¨ä¼¼ã¦ã„ã¾ã™ãŒã€ ã“ã®é–¢æ•°ã§ç™»éŒ²ã—ãŸé–¢æ•°ã¯ã€ã‚¯ã‚¨ãƒªã®ã™ã¹ã¦ã®è¡Œã®å†…容を集約ã™ã‚‹é–¢æ•°ã‚’登録ã—ã¾ã™ã€‚

ã“ã®é–¢æ•°ã¨ PDO->sqliteCreateFunction() ã®æœ€å¤§ã®é•ã„ã¯ã€ 集約関数を作æˆã™ã‚‹ãŸã‚ã«ã¯ 2 ã¤ã®é–¢æ•°ãŒå¿…è¦ã§ã‚ã‚‹ã¨ã„ã†ã“ã¨ã§ã™ã€‚

パラメータ

function_name

SQL æ–‡ã§ä½¿ç”¨ã™ã‚‹é–¢æ•°ã®åå‰ã€‚

step_func

çµæžœã‚»ãƒƒãƒˆã®å„行ã«ã¤ã„ã¦ã‚³ãƒ¼ãƒ«ã•れるコールãƒãƒƒã‚¯é–¢æ•°ã€‚ ã“ã® PHP 関数ã¯ã€çµæžœã‚’è“„ç©ã—ã¦é›†ç´„コンテキストã«ä¿å­˜ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。

ã“ã®é–¢æ•°ã¯æ¬¡ã®ã‚ˆã†ã«å®šç¾©ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。

step ( mixed $context , int $rownumber , mixed $value1 [, mixed $value2 [, mixed $.. ]] )

context ã¯æœ€åˆã®è¡Œã§ã¯ NULL ã¨ãªã‚Šã¾ã™ã€‚ ãれ以é™ã®è¡Œã§ã¯ã€ãã®å‰ã® step 関数ãŒè¿”ã—ãŸå€¤ã‚’ä¿æŒã—ã¾ã™ã€‚ ã“れを使用ã—ã¦ã€é›†ç´„ã®çŠ¶æ…‹ã‚’ç®¡ç†ã—ã¾ã™ã€‚

rownumber ã¯ç¾åœ¨ã®è¡Œç•ªå·ã‚’ä¿æŒã—ã¾ã™ã€‚

finalize_func

ã™ã¹ã¦ã®è¡ŒãŒå‡¦ç†ã•れãŸå¾Œã§ã‚³ãƒ¼ãƒ«ã•れるコールãƒãƒƒã‚¯é–¢æ•°ã€‚ ã“ã“ã§ã¯ã€é›†ç´„コンテキストã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã—ã¦çµæžœã‚’è¿”ã—ã¾ã™ã€‚ コールãƒãƒƒã‚¯é–¢æ•°ã®è¿”ã™å€¤ã¯ã€SQLite ãŒç†è§£ã§ãã‚‹å½¢å¼ (ã™ãªã‚㡠スカラー型) ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。

ã“ã®é–¢æ•°ã¯æ¬¡ã®ã‚ˆã†ã«å®šç¾©ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。

fini ( mixed $context , int $rownumber )

context ã«ã¯ã€æœ€å¾Œã® step 関数ã®è¿”ã‚Šå€¤ãŒæ ¼ç´ã•れã¾ã™ã€‚

rownumber ã¯ã€ã“ã®é›†ç´„関数ãŒå‡¦ç†ã—ãŸè¡Œæ•°ã‚’ä¿æŒã—ã¾ã™ã€‚

ã“ã®é–¢æ•°ã®è¿”り値ãŒã€é›†ç´„ã®è¿”り値ã¨ãªã‚Šã¾ã™ã€‚

num_args

コールãƒãƒƒã‚¯é–¢æ•°ãŒã‚らã‹ã˜ã‚定義済ã¿ã®å¼•æ•°ã‚’å—ã‘å–ã‚‹å ´åˆã«ã€ SQLite ã®ãƒ‘ãƒ¼ã‚µã«æ¸¡ã™ãƒ’ント。

返り値

æˆåŠŸã—ãŸå ´åˆã« TRUE ã‚’ã€å¤±æ•—ã—ãŸå ´åˆã« FALSE ã‚’è¿”ã—ã¾ã™ã€‚

例

Example#1 集約関数 max_length ã®ä¾‹

<?php
$data 
= array(
   
'one',
   
'two',
   
'three',
   
'four',
   
'five',
   
'six',
   
'seven',
   
'eight',
   
'nine',
   
'ten',
   );
$db = new PDO('sqlite::memory:');
$db->exec("CREATE TABLE strings(a)");
$insert $db->prepare('INSERT INTO strings VALUES (?)');
foreach (
$data as $str) {
    
$insert->execute(array($str));
}
$insert null;

function 
max_len_step(&$context$rownumber$string
{
    if (
strlen($string) > $context) {
        
$context strlen($string);
    }
}

function 
max_len_finalize(&$context$rownumber
{
    return 
$context;
}

$db->sqliteCreateAggregate('max_len''max_len_step''max_len_finalize');

var_dump($db->query('SELECT max_len(a) from strings')->fetchAll());

?>

ã“ã®ä¾‹ã§ã¯ã€ テーブルã®ã‚«ãƒ©ãƒ ã®ä¸­ã§ä¸€ç•ªé•·ã„文字列ã®é•·ã•を計算ã™ã‚‹é›†ç´„関数を作æˆã—ã¾ã™ã€‚ å„行ã«ã¤ã„㦠max_len_step 関数ãŒã‚³ãƒ¼ãƒ«ã•れ〠context ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ãŒæ¸¡ã•れã¾ã™ã€‚ ã“ã®ãƒ‘ラメータã«ã¯ã€ä»–ã® PHP 変数ã¨åŒæ§˜ã«ã€é…列やオブジェクトãŒè¨­å®šã•れã¾ã™ã€‚ ã“ã®ä¾‹ã§ã¯ã€ã“れã¾ã§ã«ç™»å ´ã—ãŸå€¤ã®ã†ã¡é•·ã•ãŒæœ€å¤§ã®ã‚‚ã®ã®é•·ã•ã‚’ä¿æŒã—ã¦ã„ã¾ã™ã€‚ string ãŒç¾åœ¨ã®æœ€å¤§å€¤ã‚ˆã‚Šé•·ã„å ´åˆã«ã€ ãã®å€¤ã§ç¾åœ¨ã®æœ€å¤§å€¤ã‚’æ›´æ–°ã—ã¾ã™ã€‚

ã™ã¹ã¦ã®è¡Œã«å¯¾ã™ã‚‹å‡¦ç†ãŒçµ‚ã‚ã‚‹ã¨ã€SQLite 㯠max_len_finalize 関数をコールã—ã¦é›†ç´„çµæžœã‚’決定ã—ã¾ã™ã€‚ ã“ã“ã§ã¯ã€context ã®å†…容ã«åŸºã¥ã„ãŸã€ ãªã‚“らã‹ã®è¨ˆç®—を行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ ã—ã‹ã—ã€ã“ã®ä¾‹ã§ã¯ã‚¯ã‚¨ãƒªã‚’処ç†ã—ã¦ã„ã‚‹éŽç¨‹ã§æ—¢ã«çµæžœãŒæ±ºå®šã—ã¦ã„ã‚‹ã®ã§ã€ ã“ã“ã§ã¯å˜ã« context ã®å€¤ã‚’è¿”ã—ã¦ã„ã‚‹ã ã‘ã§ã™ã€‚

ヒント

çµæžœã®å€¤ã‚’ context ã«æºœã‚込んã§ãŠãã€æœ€å¾Œã«ä¸€æ‹¬ã—ã¦å‡¦ç†ã™ã‚‹ã¨ã„ã†æ–¹æ³•ã¯æŽ¨å¥¨ 「ã—ã¾ã›ã‚“ã€ã€‚ã“れã¯ã€SQLite ã®ãƒ¡ãƒ¢ãƒªæ¶ˆè²»é‡ãŒå¤§ãããªã‚‹ã‹ã‚‰ã§ã™ã€‚ 仮㫠32 ãƒã‚¤ãƒˆã®é•·ã•ã®ãƒ‡ãƒ¼ã‚¿ãŒç™¾ä¸‡ä»¶ã‚ã£ãŸã¨ã—ã¦ã€ ãれを溜ã‚込むãŸã‚ã«ã©ã‚Œã ã‘ã®ãƒ¡ãƒ¢ãƒªãŒå¿…è¦ã«ãªã‚‹ã‹è€ƒãˆã¦ã¿ã¾ã—ょã†ã€‚

ヒント

PDO->sqliteCreateFunction() ãŠã‚ˆã³ PDO->sqliteCreateAggregate() を使用ã—ã¦ã€ SQLite ã®ãƒã‚¤ãƒ†ã‚£ãƒ– SQL 関数を上書ãã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

注æ„: ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€SQLite2 ドライãƒã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。 代ã‚りã«ã€å¤ã„å½¢å¼ã® sqlite API を使用ã—ã¦ãã ã•ã„。