A cláusula PIVOT no Oracle 12c é uma poderosa ferramenta para manipulação de dados, permitindo transformar dados de linhas em colunas, facilitando a criação de relatórios e análises de dados. No entanto, em sua forma padrão, a cláusula PIVOT exige que as colunas sejam especificadas antecipadamente. Isso pode ser um desafio se o conjunto de dados possuir valores distintos desconhecidos que você deseja transformar em colunas. Neste artigo, apresentaremos uma solução para esse desafio: consultas PIVOT dinâmicas.
Consultas PIVOT Dinâmicas
As consultas PIVOT dinâmicas no Oracle podem ser realizadas por meio da construção e execução de uma consulta dinâmica usando PL/SQL. Embora o Oracle não suporte pivôs dinâmicos diretamente na cláusula PIVOT, a flexibilidade do PL/SQL nos permite contornar essa limitação.
Exemplo Prático
Vamos considerar um exemplo prático usando a tabela VENDAS
, que contém registros das quantidades de diferentes produtos vendidos a cada ano. Queremos pivotar essa tabela para ver a quantidade vendida de cada produto por ano, mas não sabemos antecipadamente todos os diferentes produtos que podem estar na tabela.
Para isso, podemos usar o seguinte script PL/SQL:
Set serveroutput on
DECLARE
v_sql VARCHAR2(4000);
v_cols VARCHAR2(4000);
cur SYS_REFCURSOR;
v_ano NUMBER;
v_qtd1 NUMBER;
v_qtd2 NUMBER;
BEGIN
SELECT LISTAGG('''' || PRODUTO || '''', ',') WITHIN GROUP (ORDER BY PRODUTO)
INTO v_cols
FROM (SELECT DISTINCT PRODUTO FROM VENDAS);
v_sql :=
'SELECT * FROM (
SELECT ANO, PRODUTO, QUANTIDADE FROM VENDAS
) PIVOT (
SUM(QUANTIDADE) FOR PRODUTO IN (' || v_cols || ')
)';
OPEN cur FOR v_sql;
LOOP
FETCH cur INTO v_ano, v_qtd1, v_qtd2;
EXIT WHEN cur%NOTFOUND;
-- Aqui, estamos apenas exibindo os resultados. Na prática, você faria algo mais útil com eles.
DBMS_OUTPUT.PUT_LINE('Ano: ' || v_ano || ', Qtd1: ' || v_qtd1 || ', Qtd2: ' || v_qtd2);
END LOOP;
CLOSE cur;
END;
/
Este script executa a consulta SQL dinâmica e recupera os resultados através de um cursor. Em seguida, usa um loop para buscar e exibir cada linha de resultados. Note que DBMS_OUTPUT.PUT_LINE
é usado para exibir os resultados – em um ambiente de produção, você provavelmente faria algo mais útil com os dados.
Lembre-se de que você precisa habilitar a exibição de saída do DBMS_OUTPUT para ver os resultados, o que pode ser feito com o comando SET SERVEROUTPUT ON
no SQL*Plus ou no SQL Developer.
Considerações Finais
A criação de consultas dinâmicas pode ser mais complexa e potencialmente perigosa do que o uso de consultas estáticas. Isso pode tornar seu código vulnerável a ataques de injeção SQL. Portanto, é crucial usar essa técnica com cuidado, garantindo que as entradas sejam devidamente validadas e/ou escapadas.
As consultas PIVOT dinâmicas são uma ferramenta poderosa no arsenal do Oracle 12c, permitindo flexibilidade e adaptabilidade na manipulação e análise de dados.