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.

Sobre o autor

Pós graduado em Gestão de Projetos em Tecnologia da Informação pela UNIASSELVI.
Esposo e Pai, curto atividades ao ar livre (Bike, SUP, Natação, Caminhar, Brincar no campo)

Atua com Banco de Dados Oracle desde de 2007. Atualmente é DBA Senior na FLUIDATA Serviços em Banco de dados (www.fluidata.com.br)

Principais atividade Banco de dados:

Implementação, migração, gerenciamento e suporte a produtos Oracle (8i, 9i, 10g, 11g, 12c, 18c, 19c RAC), multiplataforma;
Implementação, migração, gerenciamento e suporte a produtos Microsoft SQL Server (2008 - 2019);
Implementação, migração, gerenciamento e suporte a produtos PostgreSQL (9.3 - 14);
Monitoramento de ambientes 24×7;
Backup e Recovery;
Performance e Tuning;
Alta disponibilidade (HA);
EM database/grid/cloud control;
Conversão de databases;
Standby database / Oracle Data Guard;

Certificações:

Oracle Cloud Infrastructure 2019 Certified Architect AssociateOracle Cloud Infrastructure 2019 Certified Architect Associate
Oracle Database 12c Administrator Certified ProfessionalOracle Database 12c Administrator Certified Professional
Exadata Database Machine Models X2-2 and X2-8 Technology Support SpecialistExadata Database Machine Models X2-2 and X2-8 Technology Support Specialist
Oracle Database 11g Support SpecialistOracle Database 11g Support Specialist
OCP 11g - Oracle Certified Professional AdministratorOCP 11g - Oracle Certified Professional Administrator
OPN Certified Specialist 10g - PartnerNetwork Certified SpecialistOPN Certified Specialist 10g - PartnerNetwork Certified Specialist
Oracle Database 10g Real Applications Clusters AdministratorCertified ExpertOracle Database 10g Real Applications Clusters AdministratorCertified Expert
Oracle Database 10g: Managing Oracle on Linux Certified ExpertOracle Database 10g: Managing Oracle on Linux Certified Expert
OCP 10g - Oracle Certified Professional AdministratorOCP 10g - Oracle Certified Professional Administrator

Principais atividades DEVOPS:

PHP
ASP.net
C#
Docker
Golang
C++
Delphi
Python
HTML5
JavaScript

Você também pode gostar: