J'essaie d'écrire une fonction d'agrégat personnalisée dans Oracle et de regrouper cette fonction dans un package avec d'autres fonctions que j'ai. A titre d'exemple (pour simuler le problème que j'ai) suppose que mon agrégation personnalisé pour faire une sommation des nombres ressemble:Fonction d'agrégat personnalisée à l'intérieur d'un package
CREATE OR REPLACE TYPE SUM_AGGREGATOR_TYPE AS OBJECT (
summation NUMBER,
STATIC FUNCTION ODCIAggregateInitialize(agg_context IN OUT
SUM_AGGREGATOR_TYPE) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT SUM_AGGREGATOR_TYPE,
next_number IN NUMBER) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT SUM_AGGREGATOR_TYPE,
para_context IN SUM_AGGREGATOR_TYPE) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateTerminate(self IN SUM_AGGREGATOR_TYPE,
return_value OUT NUMBER, flags IN NUMBER) RETURN NUMBER
);
CREATE OR REPLACE TYPE BODY SUM_AGGREGATOR_TYPE IS
STATIC FUNCTION ODCIAggregateInitialize(agg_context IN OUT
SUM_AGGREGATOR_TYPE)
RETURN NUMBER IS
BEGIN
agg_context := SUM_AGGREGATOR_TYPE(NULL);
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT SUM_AGGREGATOR_TYPE,
next_number IN NUMBER)
RETURN NUMBER IS
BEGIN
IF self.summation IS NULL THEN
self.summation := next_number;
ELSIF summation IS NOT NULL THEN
self.summation := self.summation + next_number;
END IF;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT SUM_AGGREGATOR_TYPE,
para_context IN SUM_AGGREGATOR_TYPE)
RETURN NUMBER IS
BEGIN
self.summation := self.summation + para_context.summation;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateTerminate(self IN SUM_AGGREGATOR_TYPE,
return_value OUT NUMBER, flags IN NUMBER)
RETURN NUMBER IS
BEGIN
return_value := self.summation;
return ODCIConst.Success;
END;
END;
Si j'écris la définition de fonction suivante:
CREATE OR REPLACE FUNCTION MY_SUM(input NUMBER)
RETURN NUMBER PARALLEL_ENABLE AGGREGATE USING SUM_AGGREGATOR_TYPE;
et la déclaration de type correspondante à tester:
CREATE OR REPLACE TYPE VECTOR
IS
TABLE OF NUMBER;
cette déclaration:
select my_sum(column_value) from table(vector(1, 2, 1, 45, 22, -1));
donne le bon résultat de 70. Cependant, la création d'un package avec la définition de la fonction:
CREATE OR REPLACE PACKAGE MY_FUNCTIONS AS
FUNCTION MY_SUM(input NUMBER)
RETURN NUMBER PARALLEL_ENABLE AGGREGATE USING SUM_AGGREGATOR_TYPE;
END;
et de l'appeler via:
select MY_FUNCTIONS.my_sum(column_value) from table(vector(1, 2, 1, 45, 22, -1));
explose avec
ORA-00600: internal error code, arguments: [17090], [], [], [], [], [], [], [], [], [], [], []
Est-il possible d'avoir des fonctions agrégées personnalisées imbriquées dans les déclarations de paquet?
'ORA-00600' indique généralement un bogue Oracle - parfois en raison de combinaisons inattendues de fonctionnalités. Quelle version exacte d'Oracle utilisez-vous? –
J'utilise Oracle 11g Release 2 (11.2.0.1.0). – wcmatthysen
Avez-vous des nouvelles à ce sujet? J'ai aussi des problèmes, cependant, dans mon cas, la connexion est interrompue 'ORA-03113: fin de fichier sur le canal de communication'. Je suppose que c'est encore pire que le 'ORA-00600'. Quand je vérifie 'SELECT * FROM ALL_PROCEDURES', je peux voir que l'agrégat défini par l'utilisateur a été correctement créé et enregistré ... –