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