Problema ao criar uma função de agrupamento

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
nightmare
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Sex, 15 Ago 2008 4:02 pm
Localização: São Paulo - SP

Pessoa, Boa tarde,

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:

Selecionar tudo

SQL> select merged('Y7T7B7M7V7K7W7I7H7Q7Z7S7O7X7','Y7T7B7M7V7K7W7') MERGE
  2  from dual;

MERGE
---------------------------------------------------------------------
B7K7M7T7V7W7Y7
** Ele procura trecho de texto comuns e retorna uma string só. Está funcionando perfeitamente

Meu interesse é jogar nisso em uma função que poderia usar group by. Gerei o código abaixo:

Selecionar tudo

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;
/

Ele gera tudo com sucesso porém quando executo um teste simples:

Selecionar tudo

SELECT NUM, MERGED2(TEXTO) MERGE
FROM TESTE
GROUP BY NUM;
Ele retorna a segunda coluna toda em branco. Nenhum erro é gerado. Achei estranho pois se substituo as linhas que uso MERGED para um simples "||" como na maioria dos exemplos da internet, ele funciona. Retorna uma string enorme que é a soma de todas do grupo.

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.
Responder
  • Informação