Estou precisando gerar uma função de agrupamento e está ocorrendo uma situação estranha;
Primeiro criei uma função chamada "MERGED", para não estender mais o tópico, ele faz isso:
SQL> select merged('Y7T7B7M7V7K7W7I7H7Q7Z7S7O7X7','Y7T7B7M7V7K7W7') MERGE
2 from dual;
MERGE
---------------------------------------------------------------------
B7K7M7T7V7W7Y7
Meu interesse é jogar nisso em uma função que poderia usar group by. Gerei o código abaixo:
CREATE OR REPLACE TYPE STRMERGE AS OBJECT (
STRDISP VARCHAR2(2000),
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT STRMERGE)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE (SELF IN OUT STRMERGE,
VALUE IN VARCHAR2 )
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE (SELF IN STRMERGE ,
RETURN_VALUE OUT VARCHAR2,
FLAGS IN NUMBER )
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT STRMERGE,
CTX2 IN STRMERGE )
RETURN NUMBER
);
/
CREATE OR REPLACE TYPE BODY STRMERGE IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT STRMERGE)
RETURN NUMBER IS
BEGIN
SCTX := STRMERGE(' ');
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT STRMERGE,
VALUE IN VARCHAR2)
RETURN NUMBER IS
BEGIN
SELF.STRDISP := MERGED(SELF.STRDISP, VALUE);
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN STRMERGE,
RETURN_VALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER IS
BEGIN
RETURN_VALUE := SELF.STRDISP;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT STRMERGE,
CTX2 IN STRMERGE)
RETURN NUMBER IS
BEGIN
SELF.STRDISP := MERGED(SELF.STRDISP, CTX2.STRDISP);
RETURN ODCICONST.SUCCESS;
END;
END;
/
CREATE OR REPLACE FUNCTION MERGED2 (INPUT VARCHAR2) RETURN VARCHAR2
PARALLEL_ENABLE AGGREGATE USING STRMERGE;
/
SELECT NUM, MERGED2(TEXTO) MERGE
FROM TESTE
GROUP BY NUM;
Por um caso, no Oracle 9i, existe alguma restrição que impeça o código de funcionar?
Infelizmente, não estou no Oracle 10g, portanto não adianta ninguém postar como solução usar uma função com o comando "COLLECT".
Agradeço qualquer ajuda.