Manipulação de Dados em PL/SQL

 

Neste post, exploraremos a manipulação de dados em PL/SQL, abordando três aspectos cruciais: cursores, manuseio de exceções e transações. Cada um desses tópicos é essencial para o desenvolvimento eficiente e seguro de aplicações em Oracle.

Vantagens da Manipulação de Dados

  • Flexibilidade: Permite criar lógicas complexas e adaptar o comportamento do programa com base nos dados.
  • Eficiência: Melhora o desempenho do código ao otimizar o processamento de dados.
  • Segurança: Garante a integridade dos dados através do controle de transações e tratamento de erros.
  • Legibilidade: Facilita a manutenção e compreensão do código ao estruturar claramente as operações de dados.

Cursores

Os cursores são utilizados para realizar operações de recuperação de dados em conjuntos de resultados de consultas SQL. Existem dois tipos principais de cursores em PL/SQL: cursores implícitos e cursores explícitos.

Cursores Implícitos

Os cursores implícitos são gerenciados automaticamente pelo Oracle sempre que uma instrução SQL é executada. Eles são ideais para operações que retornam apenas uma linha.

 

Exemplo:

DECLARE
  v_salario funcionarios.salario%TYPE;
BEGIN
  SELECT salario
    INTO v_salario
    FROM funcionarios
   WHERE id = 1;
  DBMS_OUTPUT.PUT_LINE('Salário: ' || v_salario);
END;

DBMS Output

Salário: 7800

Cursores Explícitos

Os cursores explícitos são definidos pelo programador e permitem maior controle sobre a recuperação de dados, especialmente quando se espera que a consulta retorne múltiplas linhas.

 

Exemplo:

DECLARE
  CURSOR c_funcionarios IS
    SELECT nome, salario FROM funcionarios;
  v_nome    funcionarios.nome%TYPE;
  v_salario funcionarios.salario%TYPE;
BEGIN
  OPEN c_funcionarios;
  LOOP
    FETCH c_funcionarios
      INTO v_nome, v_salario;
    EXIT WHEN c_funcionarios%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE('Nome: ' || v_nome || ', Salário: ' || v_salario);
  END LOOP;
  CLOSE c_funcionarios;
END;

DBMS Output

Nome: Carlos Silva, Salário: 7800
Nome: Ana Souza, Salário: 2750
Nome: Mariana Costa, Salário: 
Nome: Roberto Alves, Salário: 3000
Nome: Fernanda Santos, Salário: 3300
Nome: Lucas Oliveira, Salário: 4950
Nome: Camila Pereira, Salário: 2145
Nome: Ramon Vieira, Salário: 4950
Benefícios dos Cursores
  • Controle sobre o conjunto de resultados: Permite a manipulação de dados linha por linha.
  • Eficiência: Reduz a quantidade de memória utilizada ao processar grandes conjuntos de dados.

Manuseio de Exceções

O manuseio de exceções é crucial para a construção de programas robustos. Em PL/SQL, as exceções são utilizadas para tratar erros e situações inesperadas de forma controlada.

Exceções Pré-definidas

PL/SQL oferece várias exceções pré-definidas que são automaticamente levantadas em condições específicas:

  • NO_DATA_FOUND: Nenhuma linha foi retornada pela consulta.
  • TOO_MANY_ROWS: A consulta retornou mais de uma linha quando era esperado apenas uma.
  • ZERO_DIVIDE: Tentativa de divisão por zero.
  • INVALID_CURSOR: Operação ilegal em um cursor.
  • DUP_VAL_ON_INDEX: Tentativa de inserir um valor duplicado em uma coluna indexada.
  • VALUE_ERROR: Erro de valor, como atribuição de um valor fora do intervalo.
  • SUBSCRIPT_OUTSIDE_LIMIT: Subscrito fora dos limites em uma coleção.
  • OTHERS: Captura todas as exceções que não foram explicitamente tratadas.

Exemplo:

DECLARE
  v_salario funcionarios.salario%TYPE;
BEGIN
  BEGIN
    SELECT salario
      INTO v_salario
      FROM funcionarios
     WHERE id = 200;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('Funcionário não encontrado.');
    WHEN TOO_MANY_ROWS THEN
      DBMS_OUTPUT.PUT_LINE('Múltiplos funcionários encontrados.');
    WHEN ZERO_DIVIDE THEN
      DBMS_OUTPUT.PUT_LINE('Erro: divisão por zero.');
    WHEN INVALID_CURSOR THEN
      DBMS_OUTPUT.PUT_LINE('Erro: cursor inválido.');
    WHEN DUP_VAL_ON_INDEX THEN
      DBMS_OUTPUT.PUT_LINE('Erro: valor duplicado no índice.');
    WHEN VALUE_ERROR THEN
      DBMS_OUTPUT.PUT_LINE('Erro: valor inválido.');
    WHEN SUBSCRIPT_OUTSIDE_LIMIT THEN
      DBMS_OUTPUT.PUT_LINE('Erro: subscrito fora dos limites.');
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('Erro inesperado: ' || SQLERRM);
  END;
END;

DBMS Output

Funcionário não encontrado.

Exceções Definidas pelo Usuário

Os programadores podem definir suas próprias exceções para tratar condições específicas da aplicação.

 

Exemplo:

DECLARE
  e_salario_baixo EXCEPTION;
  v_salario       funcionarios.salario%TYPE;
BEGIN
  SELECT salario
    INTO v_salario
    FROM funcionarios
   WHERE id = 8;
  IF v_salario < 2500 THEN
    RAISE e_salario_baixo;
  END IF;
EXCEPTION
  WHEN e_salario_baixo THEN
    DBMS_OUTPUT.PUT_LINE('Salário abaixo do permitido: ' || v_salario);
END;

DBMS Output

Salário abaixo do permitido: 2145

Transações

As transações garantem a integridade dos dados ao agrupar um conjunto de operações SQL que devem ser executadas como uma única unidade. Uma transação começa com a primeira instrução SQL e termina com um COMMIT ou ROLLBACK.

COMMIT

Confirma todas as alterações feitas na transação atual, tornando-as permanentes no banco de dados.

 

Exemplo:

BEGIN
  UPDATE funcionarios SET salario = salario * 1.1 WHERE codigo_cargo = 2;
  COMMIT;
END;

ROLLBACK

Desfaz todas as alterações feitas na transação atual, revertendo o banco de dados ao estado anterior ao início da transação.

 

Exemplo:

BEGIN
  UPDATE funcionarios SET salario = salario * 1.1 WHERE codigo_cargo = 2;
  ROLLBACK;
END;

SAVEPOINT

Os pontos de salvamento permitem marcar um ponto na transação que pode ser revertido sem afetar as operações anteriores ao ponto de salvamento.

 

Exemplo:

BEGIN
  UPDATE funcionarios SET salario = salario * 1.1 WHERE codigo_cargo = 3;
  SAVEPOINT ponto1;
  DELETE FROM funcionarios WHERE codigo_cargo = 20;
  ROLLBACK TO ponto1;
  COMMIT;
END;

Neste exemplo, aumentamos o salário dos funcionários com o código de cargo igual a 3 em 10% e criamos um ponto de salvamento chamado ponto1. Em seguida, deletamos os funcionários com o código de cargo igual a 20. Posteriormente, utilizamos o ROLLBACK TO ponto1 para reverter a exclusão, mantendo o aumento de salário. Por fim, aplicamos a transação com o COMMIT.

 

Observação: Utilizar pontos de salvamento é especialmente útil em transações longas e complexas, pois permite reverter parte das alterações sem afetar toda a transação. Isso pode ser crucial para manter a integridade dos dados e evitar a repetição de operações já validadas.

Considerações Finais

 

Compreender e utilizar cursores, manuseio de exceções e transações é essencial para o desenvolvimento eficaz e seguro em PL/SQL. Estes elementos permitem um controle refinado sobre a manipulação de dados e a gestão de erros, assegurando a integridade e a eficiência das suas aplicações Oracle.

 

Se você tiver alguma dúvida ou sugestão, deixe um comentário abaixo!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima