PDO::sqliteCreateAggregate
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo_sqlite >= 1.0.0)
PDO::sqliteCreateAggregate — SQL 문에서 사용할 집계 사용자 정의 함수를 등록합니다.
설명
public PDO::sqliteCreateAggregate( string $function_name, callable $step_func, callable $finalize_func, int $num_args = ? ): bool
경고 이 함수는 실험적입니다. 이 함수의 동작, 해당 이름 및 주변 문서는 PHP의 향후 릴리스에서 예고 없이 변경될 수 있습니다. 이 함수는 사용자의 책임하에 사용해야 합니다.
이 메서드는 쿼리의 모든 행에서 집계된 결과를 계산하는 데 사용할 수 있는 함수를 등록한다는 점을 제외하면 PDO::sqliteCreateFunction과 비슷합니다.
이 메서드와 PDO::sqliteCreateFunction의 주요 차이점은 집계를 관리하는 데 두 가지 함수가 필요하다는 것입니다.
매개변수
- function_name
- SQL 문에서 사용되는 함수의 이름입니다.
step_func
- 결과 집합의 각 행에 대해 호출된 콜백 함수입니다. PHP 함수는 결과를 누적하고 집계 컨텍스트에 저장해야 합니다.
이 함수는 다음과 같이 정의해야 합니다.
step( mixed $context, int $rownumber, mixed $value, mixed ...$values ): mixed
context
- 첫 번째 행의 경우
null
입니다. 후속 행에는 이전에 단계 함수에서 반환된 값이 있습니다. 집계 상태를 유지하려면 이것을 사용해야 합니다. rownumber
- 현재 행 번호입니다.
value
- 집계에 전달된 첫 번째 인수입니다.
values
- 집계에 전달된 추가 인수입니다.
이 함수의 반환 값은 다음 단계 호출에서
context
인수로 사용되거나 함수를 종료합니다. finalize_func
- 각 행에서 "단계별" 데이터를 집계하는 콜백 함수입니다. 모든 행이 처리되면 이 함수가 호출되고 집계 컨텍스트에서 데이터를 가져와 결과를 반환해야 합니다. 이 콜백 함수는 SQLite가 이해할 수 있는 유형(즉, 스칼라 유형)을 반환해야 합니다.
이 함수는 다음과 같이 정의해야 합니다.
fini(mixed
$context
, int$rowcount
): mixedcontext
- 단계 함수에 대한 가장 마지막 호출의 반환 값을 보유합니다.
rowcount
- 집계가 수행된 행 수를 보유합니다.
이 함수의 반환 값은 집계의 반환 값으로 사용됩니다.
num_args
- 콜백 함수가 미리 결정된 수의 인수를 허용하는 경우 SQLite 파서에 대한 힌트입니다.
반환 값
성공하면 true
를, 실패하면 false
를 반환합니다.
Examples
예제 #1 max_length 집계 함수 예제
다음 예는 SQLite 데이터베이스에 연결하기 위한 PDO_SQLITE DSN을 보여줍니다.
<?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);
}
return $context;
}
function max_len_finalize($context, $rowcount)
{
return $context === null ? 0 : $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
에서 찾은 데이터를 기반으로 일종의 계산을 수행할 수 있습니다. 그러나 우리의 간단한 예에서는 쿼리가 진행됨에 따라 결과를 계산했기 때문에 컨텍스트 값을 반환하기만 하면 됩니다.
팁 값의 복사본을 컨텍스트에 저장한 다음 마지막에 처리하는 것은 권장하지 않습니다. SQLite가 쿼리를 처리하기 위해 많은 메모리를 사용하게 하기 때문입니다. 백만 개의 행이 메모리에 저장되었으며, 각 행은 길이가 32바이트인 문자열을 포함합니다.
팁 PDO::sqliteCreateFunction 및 PDO::sqliteCreateAggregate를 사용하여 SQLite 기본 SQL 함수를 재정의할 수 있습니다.
기타
- PDO::sqliteCreateFunction
- sqlite_create_function()
- sqlite_create_aggregate()