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:

  1. 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.
  2. 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!

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