Sokszor előfordulhat, hogy különböző lekérdezések során aggregált adatokra van szükségünk. Erre számos beépített függvény áll rendelkezésünkre, de készíthetünk saját aggregációs függvényeket is. Az alábbiakban azt az aggregációs függvényt valósítjuk meg, amely a csoport elemeinek szorzatát számolja ki.
Maga a függvény igen egyszerű:
CREATE OR REPLACE FUNCTION MUL(input NUMBER) RETURN NUMBER paralell_enable
A fentiekből is látszik, hogy a megvalósítás lényegi része a MulNumber típusban található. Nézzük ennek specifikációját.
aggregate using MulNumber;
/
CREATE OR REPLACE TYPE MulNumber AS OBJECT (
multipliedValue NUMBER
STATIC FUNCTION ODCIAggregateInitialize (mctx IN OUT MulNumber) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateIterate (self IN OUT MulNumber, value IN NUMBER) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateTerminate (self IN MulNumber, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateMerge (self IN OUT MulNumber, ctx IN MulNumber) RETURN NUMBER
);
/
A fentiekben használt függvénynevek kötöttek. Mivel úgy definiáltuk a MUL függvényt, hogy párhuzamos végrehajtás esetén is alkalmazható, így itt meg valósítjuk az ODCIAggregateMerge függvényt is.
Nézzük a típus törzsét:
CREATE OR REPLACE TYPE BODY MulNumber IS
A fentieken jól végigkövethető az aggregáció folyamata. Az inicializálástól az iteráción keresztül a befejezésig, illetve a párhuzamos eredmények összefésüléséig.
STATIC FUNCTION ODCIAggregateInitialize (mctx IN OUT MulNumber) RETURN NUMBER IS
BEGIN
mctx := MulNumber(1);
return ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateIterate (self IN OUT MulNumber, value IN NUMBER) RETURN NUMBER IS
BEGIN
self.multipliedValue := self.multipliedValue * value;
return ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateTerminate (self IN MulNumber, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER IS
BEGIN
returnValue := self.multipliedValue;
return ODCIConst.Success;
END;
MEMBER FUNCTIONS ODCIAggregateMerge (self IN OUT MulNumber, ctx2 IN MulNumber) RETURN NUMBER IS
BEGIN
self.multipliedValue := self.multipliedValue *
ctx2.multipliedValue;
return ODCIConst.Success;
END;
END;
/
Ez egy egyszerű példa arra, hogy hogyan lehet saját készítésű aggregációs függvényeket definiálni Oracle-ben.