Aprenda PL/SQL

Hoje vamos ver o quanto é bom explorar certos recursos da ferramenta de Desenvolvimento Oracle. Sabe aquela rotina bem dinâmica que você não imagina como poderá resolver? Agora, imagine tentar guardar tudo isso em memória… Melhorou um pouco, correto? Vamos ver como é bom trabalhar com registros de memória no Oracle.

Primeiro passo é criar a especificação de uma Package.

PACKAGE PKG_EX_TABLE_RECORD IS
--Um Cursor é necessário para criar a “Table Of Cursor%ROWTYPE”, 
--mesmo que não seja usado, pois o tipo a ser criado deve se 
--basear em uma tabela ou um cursor
  CURSOR cExemplo IS
    SELECT cod_funcionario
      FROM empresa;

   -- Tipo: Coleção de registros
   TYPE tExemplo IS TABLE Of cExemplo%Rowtype INDEX BY binary_integer;

   -- Variável do tipo coleção de registros
   vExemplo tExemplo;

   --variável para os valores do cursor (não se pode atribuir 
   --diretamente um registro do cursor à variável da coleção)
   vRec cExemplo%rowtype;
   -- índice
   x integer;
END;

Agora, vamos ver como armazenar informações nesse registro de memória.

DECLARE
  --vamos ver os funcionarios que tem salario menor que 2000 reais.
  CURSOR cEmpregados IS
  SELECT cod_funcionario
  FROM empresa
  WHERE func_sal <= 2000;

BEGIN
  –-iniciando o valor do indice
  PKG_EX_TABLE_RECORD.x := 0;
  FOR regfunc IN cEmpregados LOOP
    -- x é o indice para o registro, estou atritubindo mais 1 a ele de
    -- acordo com o que já existe, tipo uma sequence. Pego o ultimo
    -- valor e somo mais um.
    PKG_EX_TABLE_RECORD.x := nvl(PKG_EX_TABLE_RECORD.vExemplo.last,0) + 1;

    --atribui os valores do cursor (cConta_Produtos) 
    --ao array de elementos
    PKG_EX_TABLE_RECORD.vExemplo(PKG_EX_TABLE_RECORD.x).cod_funcionario := regfunc.cod_funcionario;
  END LOOP;
END;

Agora, chegou a hora de ver conteúdo do registro de memória.

--Com um for loop, vamos varrer todo o registro
--de memória afim de recuperar os valores

--dessa forma, pego o ultimo valor caso exista.
FOR j IN 1..nvl(PKG_EX_TABLE_RECORD.vExemplo.last,0) LOOP 
  
  --uma nova opção está sendo utilizada, para então 
  --ser possível ver se existe registro antes de
  --excluir, caso contrario, dará um erro por nao achar o registro
  IF PKG_EX_TABLE_RECORD.vExemplo.EXISTS(j) THEN
    --Verifica se o código do funcionario é igual ao listado abaixo, 
    --assim, posso destaca-lo de alguma forma na tela
     IF PKG_EX_TABLE_RECORD.vExemplo(j).cod_funcionario = consulta.cod_funcionario THEN
       --ao localizar, uma ação será realizada 
        (…)
     END IF;
  END IF;
END LOOP;

Pronto. Agora, não podemos esquecer de inserir uma função para limpar a memória quando você achar que não mais irá utiliza-la.

--vamos então varrer todo o registro de memória
FOR j IN 1..nvl(PKG_EX_TABLE_RECORD.vExemplo.last,0) LOOP

  --uma nova opção está sendo utilizada, para então ser possível 
  --ver se existe registro antes de excluir, caso contrario, 
  --dará um erro por nao achar o registro
  IF PKG_EX_TABLE_RECORD.vExemplo.EXISTS(j) THEN

    --Deletando registro de memoria. Uma vez deletado, a posição J 
    --ficará sempre vazia, por isso a necessidade de usar o exists
     pkg_aviso_cirurgia.vAvisoCir.DELETE(j);
  END IF;

--Fim do Loop para verificar os agendamentos localizados
END LOOP;  

Pronto, agora já é possível arriscar na solução de algum problema que precise dessa rotina, ela pode ser utilizada da forma mais fácil até a mais complexa…

Rodrigo Valentim é Analista de Sistemas Oracle Developer
http://www.rodrigovalentim.com/blog

Comments are closed.