lunes, 17 de enero de 2011

Script - Trasponer_filas_a_columna.sql

Función plsql para transponer los resultados de una consultas (varias filas) al valor de una fila en una columna indicando un carácter separador:

create or replace FUNCTION transponer(vSQL VARCHAR2, vSEP varchar2)
RETURN VARCHAR2 IS
-- vSQL sql dinámico a lanzar cuyo resultado queremos separados por la cadena vSEP
-- vSQL debe devolver una sola columna tipo varchar2 y el total de bytes retornados no debe superar los 32000 y 4000 por registro.
TYPE cv_type IS REF CURSOR;
CV CV_TYPE;
V_RES_VALOR VARCHAR2(32000);
VALOR VARCHAR2(4000);
BEGIN
V_RES_VALOR:='XX';
OPEN CV FOR VSQL;
LOOP
    FETCH CV INTO VALOR;
    EXIT WHEN CV%NOTFOUND;
    IF V_RES_VALOR='XX' THEN
        V_RES_VALOR:=VALOR;
    ELSE
        V_RES_VALOR:=V_RES_VALOR||VSEP||VALOR;
    END IF;
END LOOP;
CLOSE CV;
RETURN V_RES_VALOR;
EXCEPTION
    WHEN OTHERS THEN
        IF SQL%NOTFOUND THEN             VALOR:='NO ENCONTRADO';
        ELSE
            VALOR:='ERROR EN LA CONSULTA, CONSULTE CON EL ADMINISTRADOR';
        END IF;
        IF nvl(length(V_RES_VALOR),0)=0  THEN
         V_RES_VALOR:=VALOR;
        ELSE
         V_RES_VALOR:=V_RES_VALOR||' '||VSEP||' '||VALOR;
        END IF;
    RETURN 'ERROR --> '||V_RES_VALOR;
END TRANSPONER;
/

Ejemplo de uso:

select transponer('SELECT table_name FROM user_tables WHERE ROWNUM <=100', '|') FROM DUAL;

TABLA1|TABLA2|TABLA_EJEMPLO|PRUEBA

No hay comentarios:

Publicar un comentario