Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Tipo de dados de registro baseado em cursor com cursor retornando vários valores no banco de dados Oracle




Já vimos no tutorial anterior como criar uma variável de tipo de registro baseada em cursor com base em um cursor simples que retorna uma única linha de dados. Agora a questão que surge aqui é que podemos usar a mesma variável de tipo de dados de registro único com o cursor que retorna várias linhas de dados? Para saber a resposta, leia e aprenda como lidar com vários valores retornados por um cursor usando uma variável de tipo de dados de registro baseada em cursor único.

Como estamos lidando com registros baseados em cursor, é necessário um pouco de conhecimento de cursor. Por uma questão de simplicidade e para tornar este conceito fácil de entender, usarei um Simple Explicit-Cursor para a demonstração.

Etapa 1:declarar um cursor explícito simples


Um tipo de dados de registro baseado em cursor requer um cursor já criado. Este cursor se tornará uma base subjacente para nossa variável de tipo de registro. Todos os campos da variável de tipo de registro que é criada usando este cursor terão o mesmo nome e tipo de dados que as colunas usadas na SELECT-List do cursor.
SET SERVEROUTPUT ON;
DECLARE
 CURSOR cur_RebellionRider IS
 SELECT first_name, salary FROM employees 
 WHERE employee_id > 200;

Ao contrário do cursor do tutorial anterior, que está retornando uma única linha de dados, este cursor retornará várias linhas. Todas essas linhas consistirão no primeiro nome e salário de todos os funcionários com ID de funcionário maior que 200.

Etapa 2:declarar a variável de tipo de dados de registro com base no cursor


Como criamos o cursor, agora estamos prontos para declarar nossa variável de registro usando este cursor.
var_emp    cur_RebellionRider%ROWTYPE;

Var_emp é a variável de tipo de registro e, como é baseada no cursor cur_RebellionRider, podemos orgulhosamente chamá-la de variável de tipo de registro baseada em cursor. Agora temos que ver se essa variável de registro único é capaz de armazenar todos os dados retornados pelo cursor subjacente cur_RebellionRider.

Etapa 3:inicializar a variável de registro de cursor


Como discutimos no tutorial de PL/SQL 34, a inicialização de uma variável de registro é o processo de atribuir alguns valores a ela. No caso de cursores, a instrução FETCH-INTO faz esse trabalho. Mas temos que ter certeza de que seguimos o Ciclo de Vida do Cursor corretamente.

Se você não sabe o que é esse Ciclo de Vida do Cursor e as etapas envolvidas na criação de um Cursor, confira este blog sobre “Introdução ao Cursor de Banco de Dados”.
BEGIN
   OPEN cur_RebellionRider; 
  LOOP 
    FETCH cur_RebellionRider INTO var_emp;  
    EXIT WHEN cur_RebellionRider%NOTFOUND; 
    DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary );
  END LOOP;--Simple Loop End
  CLOSE cur_RebellionRider;
END;

A seção de execução acima do bloco PL/SQL que estamos criando aqui foi explicada linha por linha no tutorial em vídeo no meu canal do YouTube. Verifique isso.

Então é isso. Isso é tudo que temos que fazer. Agora vamos combinar todos esses pedaços de código que vimos em diferentes etapas acima em um único bloco PL/SQL anônimo.

Variável de tipo de dados de registro com base em cursor no banco de dados Oracle

SET SERVEROUTPUT ON;
DECLARE
  CURSOR cur_RebellionRider IS
  SELECT first_name, salary FROM employees
  WHERE employee_id > 200; 
  var_emp   cur_RebellionRider%ROWTYPE;
BEGIN
  OPEN cur_RebellionRider;
  LOOP
    FETCH cur_RebellionRider INTO var_emp;
    EXIT WHEN cur_RebellionRider%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary);
  END LOOP;
  CLOSE cur_RebellionRider;
END;

Ao compilar e executar o código acima, você obterá todos os dados que a instrução FETCH-INTO buscou do cursor cur_RebellionRider e armazenou na variável Record baseada em cursor var_emp. Isso implica que podemos realmente lidar com várias linhas de dados usando um único registro baseado em cursor.

No meu tutorial em vídeo de PL/SQL, perguntei se podemos simplificar esse código ou existe alguma outra maneira de fazer a mesma tarefa. A resposta é sim, existem várias maneiras de alcançar o mesmo resultado e uma delas é usando o “Cursor For-Loop”. Este é um tipo especial de loop que declara a variável de registro, bem como abre, busca e fecha o cursor subjacente implicitamente em segundo plano para você. Você pode ler mais Cursor For-Loop aqui.



Livro de referência para SQL Expert 1z0-047 Link de afiliado
Guia do Exame de Especialista Certificado em SQL do Banco de Dados Oracle OCA (Exame 1Z0-047)

Aqui está o código feito usando o Cursor For-Loop que é equivalente ao código acima. Como você pode ver, é muito menos complexo com poucas Linhas de Códigos (LOCs).
SET SERVEROUTPUT ON;
BEGIN
  FOR var_emp IN (SELECT first_name, salary FROM employees
 WHERE employee_id >200)
  LOOP
    DBMS_OUTPUT.PUT_LINE(var_emp.first_name||' '||var_emp.salary);
  END LOOP;
END; 

Ambos os códigos retornarão o mesmo resultado, pois ambos estão fazendo a mesma tarefa.

Espero que você tenha gostado deste tutorial detalhado de PL/SQL. Por favor, certifique-se de compartilhar isso em sua rede social e me marcar, pois estou distribuindo mercadorias da RebellionRider todos os meses para um usuário selecionado aleatoriamente. Siga-me também nas minhas redes sociais [Twitter/Facebook/Instagram] para atualizações regulares.

Obrigado e tenha um ótimo dia!