PDO::sqliteCreateAggregate

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

Pdo\Sqlite::createAggregate

(PHP 8 >= 8.4.0)

Pdo\Sqlite::createAggregate — Registrerar en aggregerande användardefinierad funktion för användning i SQL-frågor.

Beskrivning

public Pdo\Sqlite::createAggregate(

   string $name,
   callable $step,
   callable $finalize,
   int $numArgs = -1

): bool

Denna metod liknar Pdo\Sqlite::createFunction men registrerar funktioner som används för att beräkna resultat aggregerade över alla rader i en fråga. Skillnaden är att två funktioner krävs: en för att ackumulera data (step) och en för att slutföra beräkningen (finalize).

Tips: Genom att använda denna metod kan inbyggda SQL-funktioner åsidosättas.

Parametrar

name
Namnet på funktionen som ska användas i SQL-frågor.
step
Callback-funktion som anropas för varje rad i resultatmängden. Den ska ackumulera resultatet och lagra det i aggregeringskontexten.
Funktionens definition:
step(
    mixed $context,
    int $rownumber,
    mixed $value,
    mixed ...$values
): mixed
context: Första gången null, därefter värdet från den senaste step-funktionen.
rownumber: Radens nummer.
value: Det första argumentet för aggregeringen.
values: Ytterligare argument.
Returnerade värdet används som context vid nästa anrop av step eller finalize.
finalize
Callback-funktion som aggregerar det ackumulerade data från varje rad.
Funktionens definition:
fini(mixed $context, int $rowcount): mixed
context: Håller värdet från sista anropet till step-funktionen.
rowcount: Antal rader över vilka aggregeringen gjordes.
Returnerade värdet används som aggregeringens slutresultat.
numArgs
En indikation för SQLite-parsaren om hur många argument funktionen accepterar.

Returvärden

Returnerar true vid framgång eller false vid misslyckande.

Exempel

Exempel 1: Skapa en aggregerande funktion

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

function max_len_step($context, $row_number, $string)
{
    if (strlen($string) > $context) {
        $context = strlen($string);
    }
    return $context;
}

function max_len_finalize($context, $row_count)
{
    return $context === null ? 0 : $context;
}

$db->createAggregate('max_len', 'max_len_step', 'max_len_finalize');

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

Utdata:

array(1) {
  [0]=>
  array(1) {
    ["max_len(a)"]=>
    int(5)
  }
}

Tips: Försök inte lagra en kopia av alla värden i kontexten och bearbeta dem i slutet, då detta kan orsaka att SQLite använder mycket minne för att behandla frågan.

Se även

  • Pdo\Sqlite::createFunction — Registrerar en användardefinierad funktion för användning i SQL-frågor.
  • Pdo\Sqlite::createCollation — Registrerar en användardefinierad funktion som kollationsfunktion i SQL-frågor.
  • sqlite_create_function()
  • sqlite_create_aggregate()

Sidslut

Orginalhemsidan på Engelska :https://www.php.net/manual/en/pdo-sqlite.createaggregate.php
PHP Funktioner Funktionsreferens Databas-tillägg


Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till Datorhjälp Huddinge som har sponsrat Linux.se med webbhotell.