TurboSQL Guide

CREATE AGGREGATE Statement

Top  Previous  Next

Dieses Feature ist nur in TurboDB Managed verfügbar.

Syntax

CREATE AGGREAGATE aggregate_name([:parameter_name data_type]...) RETURNS data_type AS EXTERNAL NAME [namespace_name.class_name],assembly_name

Beschreibung

namespace_name.class_name bezeichnet eine öffentliche (public) Klasse der Assembly. Diese Klasse muss über einen Default Konstruktor verfügen und drei Methoden implementieren:

[C#]
public <class_name>()
public void Init()
public void Accumulate(<data_type>)
public <data_type> Terminate()

data_type muss mit den Paramentern einer TurboSQL Funktion übereinstimmen (siehe "Parameter mit .NET  Assemblies austauschen").

Wenn ein benutzerdefiniertes Aggregat in einem SQL Statement verwendet wird, z.B: SELECT MAX2(Salary) FROM Employees, erzeugt die Engine eine Instanz der CLR Aggregat Klasse. Zu Beginn jeder Gruppe wird die Init Methode aufgerufen. Danach erfolgt für jeden Datensatz der Gruppe der Aufruf von Accumulate in der in der GROUP BY Klausel definierten Reihenfolge. Nachdem alle Datensätze der Gruppe akkumuliert sind, führt die Engine die Funktion Terminate aus, um das Ergebnis abzurufen. Jede angeforderte Ressource kann in Terminate freigegeben werden.

Beispiel

Der C# Code für ein Aggregat zur Berechnung des Maximums zweiter Ordnung sieht so aus:

namespace MathRoutines {
 
       public class SecondOrderMax {
 
               public SecondOrderMax() { }
 
               public void Init() {
                       max = null;
                       max2 = null;
               }
 
               public void Accumulate(double? x) {
                       if (max == null || x > max) {
                               if (max != null)
                                       max2 = max;
                               max = x;
                       } else if (max2 == null || x > max2)
                               max2 = x;
               }
 
               public double? Terminate() {
                       return max2;
               }
 
               private double? max;
               private double? max2;
       }
}

Und so wird das Aggregat in TurboSQL importiert:

CREATE AGGREGATE Max2(:x DOUBLE) RETURNS DOUBLE AS
EXTERNAL NAME [MathRoutines.SecondOrderMax],MathRoutines