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): mixed

context
단계 함수에 대한 가장 마지막 호출의 반환 값을 보유합니다.
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 함수를 재정의할 수 있습니다.