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

context
단계 함수에 대한 가장 마지막 호출의 반환 값을 보유합니다.
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::sqliteCreateFunctionPDO::sqliteCreateAggregate를 사용하여 SQLite 기본 SQL 함수를 재정의할 수 있습니다.


기타