
Packages em PL/SQL
Packages em PL/SQL são coleções de procedimentos, funções, variáveis, cursos e outros elementos relacionados, agrupados em um único módulo que pode ser armazenado no banco de dados. Eles são usados para organizar e encapsular a lógica de negócios, permitindo a modularidade e a reutilização eficiente do código.
Vantagens de Usar Packages
- Organização de Código: Agrupa subprogramas e variáveis relacionados, facilitando a manutenção e compreensão do código.
- Encapsulamento: Esconde a implementação interna e expõe apenas as interfaces necessárias, protegendo a lógica de negócios.
- Reutilização de Código: Subprogramas e variáveis dentro de um package podem ser reutilizados em diferentes partes da aplicação.
- Melhoria de Performance: Ao carregar um package na memória, todos os componentes são carregados juntos, reduzindo o overhead de execução.
Estrutura de um Package
Um package em PL/SQL é composto por duas partes principais:
- Especificação (Specification): Define a interface do package, incluindo as declarações de procedimentos, funções, variáveis, e tipos que podem ser acessados externamente.
- Corpo (Body): Contém a implementação dos subprogramas e outras lógicas do package. Essa parte pode ser atualizada sem afetar a interface externa.
Criando um Package
Para criar um package, utilizamos as palavras-chave CREATE OR REPLACE PACKAGE
para a especificação e CREATE OR REPLACE PACKAGE BODY
para o corpo.
Sintaxe:
CREATE OR REPLACE PACKAGE nome_do_package IS -- Declarações públicas END nome_do_package; CREATE OR REPLACE PACKAGE BODY nome_do_package IS -- Implementações dos subprogramas END nome_do_package;
Exemplo:
Especificação do Package:
CREATE OR REPLACE PACKAGE pacote_funcionarios IS PROCEDURE ajustar_salario(p_codigo_cargo IN NUMBER, p_percentual IN NUMBER); FUNCTION calcular_bonus(p_salario NUMBER) RETURN NUMBER; END pacote_funcionarios;
Corpo do Package:
CREATE OR REPLACE PACKAGE BODY pacote_funcionarios IS PROCEDURE ajustar_salario(p_codigo_cargo IN NUMBER, p_percentual IN NUMBER) IS BEGIN UPDATE funcionarios SET salario = salario * (1 + p_percentual / 100) WHERE codigo_cargo = p_codigo_cargo; COMMIT; END ajustar_salario; FUNCTION calcular_bonus(p_salario NUMBER) RETURN NUMBER IS v_bonus NUMBER; BEGIN v_bonus := p_salario * 0.10; RETURN v_bonus; END calcular_bonus; END pacote_funcionarios;
Neste exemplo, o package pacote_funcionarios
define um procedimento ajustar_salario
e uma função calcular_bonus
. A especificação do package declara a interface, enquanto o corpo do package contém a implementação desses subprogramas.
Chamando Subprogramas de um Package
Para chamar procedimentos ou funções definidos em um package, utilizamos o nome do package seguido do nome do subprograma.
Exemplo:
BEGIN pacote_funcionarios.ajustar_salario(3, 10); END;
DECLARE v_bonus NUMBER; BEGIN v_bonus := pacote_funcionarios.calcular_bonus(3000); DBMS_OUTPUT.PUT_LINE('Bônus: ' || v_bonus); END;
DBMS Output
Bônus: 300
Variáveis Globais em Packages
Packages permitem a declaração de variáveis globais que podem ser acessadas por todos os subprogramas dentro do package. Essas variáveis mantêm seu valor entre chamadas de diferentes subprogramas.
Exemplo:
Especificação do Package:
CREATE OR REPLACE PACKAGE pacote_salarios IS v_total_bonus NUMBER := 0; PROCEDURE atualizar_bonus(p_salario NUMBER); END pacote_salarios;
Corpo do Package:
CREATE OR REPLACE PACKAGE BODY pacote_salarios IS PROCEDURE atualizar_bonus(p_salario NUMBER) IS BEGIN v_total_bonus := v_total_bonus + (p_salario * 0.10); END atualizar_bonus; END pacote_salarios;
Neste exemplo, a variável v_total_bonus
mantém o total de bônus acumulado, sendo atualizada a cada chamada do procedimento atualizar_bonus
.
Tratamento de Exceções em Packages
Como em outros blocos PL/SQL, é possível tratar exceções dentro dos subprogramas definidos em um package para garantir a robustez do código.
Exemplo:
CREATE OR REPLACE PACKAGE BODY pacote_funcionarios IS PROCEDURE ajustar_salario(p_codigo_cargo IN NUMBER, p_percentual IN NUMBER) IS BEGIN UPDATE funcionarios SET salario = salario * (1 + p_percentual / 100) WHERE codigo_cargo = p_codigo_cargo; COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Nenhum registro encontrado com o código de cargo fornecido.'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Ocorreu um erro: ' || SQLERRM); ROLLBACK; END ajustar_salario; END pacote_funcionarios;
Neste exemplo, o tratamento de exceções é feito dentro do procedimento ajustar_salario
, garantindo que erros sejam capturados e tratados apropriadamente.
Considerações Finais
Packages são ferramentas poderosas no Oracle para organizar e encapsular a lógica de negócios. Eles permitem a modularidade, melhoram a manutenção e performance, e promovem a reutilização eficiente do código. Com o uso adequado, packages podem ser essenciais para a construção de aplicações robustas e escaláveis.
Se você tiver alguma dúvida ou sugestão, deixe um comentário abaixo!