SQLite3::createAggregate
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
SQLite3::createAggregate — SQL 집계 함수로 사용할 PHP 함수를 등록합니다.
설명
public SQLite3::createAggregate( string $name, callable $stepCallback, callable $finalCallback, int $argCount = -1 ): bool
SQL 문 내에서 사용할 SQL 집계 함수로 사용할 PHP 함수 또는 사용자 정의 함수를 등록합니다.
매개변수
name
- 생성하거나 재정의할 SQL 집계의 이름입니다.
stepCallback
- 결과 집합의 각 행에 대해 호출되는 콜백 함수입니다. PHP 함수는 결과를 누적하고 집계 컨텍스트에 저장해야 합니다.
이 함수는 다음과 같이 정의해야 합니다.
step( mixed $context, int $rownumber, mixed $value, mixed ...$values ): mixed
context
- 첫 번째 행의 경우
null
입니다. 후속 행에는 이전에 단계 함수에서 반환된 값이 있습니다. 집계 상태를 유지하려면 이것을 사용해야 합니다. rownumber
- 현재 행 번호입니다.
value
- 집계에 전달된 첫 번째 인수입니다.
values
- 집계에 전달된 추가 인수입니다.
이 함수의 반환 값은 다음 단계 호출에서
context
인수로 사용되거나 함수를 종료합니다. finalCallback
- 각 행에서 "단계별" 데이터를 집계하는 콜백 함수입니다. 모든 행이 처리되면 이 함수가 호출되고 집계 컨텍스트에서 데이터를 가져와 결과를 반환해야 합니다. 이 콜백 함수는 SQLite가 이해할 수 있는 유형(즉, 스칼라 유형)을 반환해야 합니다.
이 함수는 다음과 같이 정의해야 합니다.
fini(mixed
$context
, int$rownumber
): mixedcontext
- 단계 함수에 대한 가장 마지막 호출의 반환 값을 보유합니다.
rownumber
- 항상
0
.
이 함수의 반환 값은 집계의 반환 값으로 사용됩니다.
argCount
- SQL 집계가 사용하는 인수의 수입니다. 이 매개변수가 음수이면 SQL 집계는 원하는 수의 인수를 사용할 수 있습니다.
반환 값
집계가 성공적으로 생성되면 true
를 반환하고 실패하면 false
를 반환합니다.
Examples
예제 #1 max_length 집계 함수 예제
<?php
$data = array(
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
'ten',
);
$db = new SQLite3(':memory:');
$db->exec("CREATE TABLE strings(a)");
$insert = $db->prepare('INSERT INTO strings VALUES (?)');
foreach ($data as $str) {
$insert->bindValue(1, $str);
$insert->execute();
}
$insert = null;
function max_len_step($context, $rownumber, $string)
{
if (strlen($string) > $context) {
$context = strlen($string);
}
return $context;
}
function max_len_finalize($context, $rownumber)
{
return $context === null ? 0 : $context;
}
$db->createAggregate('max_len', 'max_len_step', 'max_len_finalize');
var_dump($db->querySingle('SELECT max_len(a) from strings'));
?>
위의 예는 다음을 출력합니다.
int(5)
이 예에서는 테이블의 열 중 하나에서 가장 긴 문자열의 길이를 계산하는 집계 함수를 만들고 있습니다. 각 행에 대해 max_len_step
함수가 호출되고 $context
매개변수가 전달됩니다. 컨텍스트 매개변수는 다른 PHP 변수와 동일하며 배열 또는 객체 값을 보유하도록 설정됩니다. 이 예에서 우리는 지금까지 본 최대 길이를 유지하기 위해 단순히 사용하고 있습니다. $string
의 길이가 현재 최대값보다 길면 이 새로운 최대 길이를 유지하도록 컨텍스트를 업데이트합니다.
모든 행이 처리된 후 SQLite는 max_len_finalize
함수를 호출하여 집계 결과를 결정합니다. 여기서 $context
에서 찾은 데이터를 기반으로 일종의 계산을 수행할 수 있습니다. 하지만 우리의 간단한 예에서는 쿼리가 진행됨에 따라 결과를 계산했기 때문에 컨텍스트 값을 반환하기만 하면 됩니다.
팁 값의 복사본을 컨텍스트에 저장한 다음 마지막에 처리하는 것은 권장하지 않습니다. SQLite가 쿼리를 처리하는 데 많은 메모리를 사용하게 하기 때문입니다. 백만 개의 행이 메모리에 저장되었으며, 각 행은 길이가 32바이트인 문자열을 포함합니다.
팁 SQLite3::createAggregate()를 사용하여 SQLite 기본 SQL 함수를 재정의할 수 있습니다.