
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!