Criando Pacotes

Objetivos

Depos de completar essa lição, você poderá fazer o seguinte: ‡ Descrever a lista de pacotes e seus componentes ‡ Criar um pacote para agrupar variáveis relacionadas, cursores, constantes, exceções, procedimentos e funções ‡ Designar um pacote como público ou privado ‡ Chamar um pacote ‡ Descrever o uso de um pacote sem corpo

estruturas de dados e exceções Subprogramas: procedimentos e funções Composto de duas partes: Especificação Corpo ‡ Permiti que o servidor Oracle leia vários objetos na memória de uma só vez .Pacotes PL/SQL : Visão Geral Pacotes PL/SQL: ‡ Componentes do grupo logicamente relacionados: ± ± ± ± ± ± PL/SQL Variáveis.

Privado .Componentes de um Pacote Especificação variable Público Procedure A declaration. variable Procedure B definition « Procedure A definition variable Corpo BEGIN « END.

Visibilidade de componentes do Pacote Especificação public_var Procedure A. Procedure A IS local_var Corpo BEGIN « END. . Código Externo private_var Procedure B IS BEGIN « END.

Desenvolvendo Pacotes PL/SQL spec.sql especificação 4 Executa Use SHOW ERRORS para erros de compilação corpo .sql 1 Edit 3 2 Load Cria(compila e guarda) body.

Todas as construções declaradas na especificação do pacote são visíveis para os usuários com privilégios sobre o pacote. .Criando a especificação do Pacote Sintaxe: CREATE [OR REPLACE] PACKAGE package_name IS|AS public type and variable declarations subprogram specifications END [package_name]. ‡ ‡ ‡ A opção OR REPLACE option apaga e re-cria a especificação do pacote. Variáveis declaradas na especificação do pacote são inicializadas como NULL por padrão.

10 PROCEDURE reset_comm(new_comm NUMBER).Exemplo de Especificação do Pacote: comm_pkg CREATE OR REPLACE PACKAGE comm_pkg IS std_comm NUMBER := 0. Ele é implementado no corpo do pacote. RESET_COMM é um procedimento público usado para redefinir a comissão fixa com base em algumas regras de negócio. .10.10. / ‡ ‡ STD_COMM é uma variável global inicializada para 0. --initialized to 0. END comm_pkg.

Criando o Corpo do Pacote Sintaxe: CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS private type and variable declarations subprogram bodies [BEGIN initialization statements] END [package_name]. Identificadores definidos no corpo do pacote são privados e não são visíveis fora do corpo do pacote. Todas as construções privadas devem ser declarados antes de serem referenciadas. ‡ ‡ ‡ ‡ A opção OR REPLACE apaga e re-cria o corpo do pacote. Construções públicas são visíveis para o corpo do pacote. .

0 AND max_comm). PROCEDURE reset_comm (new_comm NUMBER) IS BEGIN IF validate(new_comm) THEN std_comm := new_comm. 'Bad Commission'). END IF. BEGIN SELECT MAX(commission_pct) INTO max_comm FROM employees. . -.commission_pct%type. END comm_pkg.reset public var ELSE RAISE_APPLICATION_ERROR( -20210. RETURN (comm BETWEEN 0. END reset_comm. END validate.Exemplo do Corpo do Pacote: comm_pkg CREATE OR REPLACE PACKAGE BODY comm_pkg IS FUNCTION validate(comm NUMBER) RETURN BOOLEAN IS max_comm employees.

reset_comm(0.. ‡ ‡ Chamando um procedimento a partir do SQL*Plus: Chamando uma procedimento em um esquema diferente: EXECUTE comm_pkg. END comm_pkg.. END reset_comm..comm_pkg.15) EXECUTE scott. END IF. PROCEDURE reset_comm(new_comm NUMBER) IS BEGIN IF validate(new_comm) THEN std_comm := new_comm.Chamando subprogramas ‡ Chamando uma função dentro do mesmo pacote. ELSE . CREATE OR REPLACE PACKAGE BODY comm_pkg IS ..15) .reset_comm(0.

. Para remover o corpo do pacote. use a seguinte sintaxe: DROP PACKAGE BODY package_name. use a seguinte sintaxe: ‡ DROP PACKAGE package_name.Removendo Pacotes Para remover a especificação do pacote e do corpo.

Visualizando Pacotes no Dicionário de Dados O código fonte dos pacotes são mantidas e podem ser visualizados através do USER_SOURCE e tabelas ALL_SOURCE no dicionário de dados. ‡ Para ver o corpo do pacote: SELECT text FROM user_source WHERE name = 'COMM_PKG' AND type = 'PACKAGE BODY'. . ‡ Para ver a especificação do pacote: SELECT text FROM user_source WHERE name = 'COMM_PKG' AND type = 'PACKAGE'.

A especificação do pacote deve conter apenas as construções que você quer que seja público. A especificação do pacote deve conter o mínimo de construções possível . Defina a especificação do pacote antes do corpo. Mudanças nas especificações do pacote requer recompilação de cada subprograma referência.Orientações para Escrita de Pacotes ‡ ‡ ‡ ‡ ‡ Construa pacotes para uso geral.

. ± Construções privadas no corpo do pacote estão escondidas e inacessíveis. ± Toda a codificação é escondida no corpo do pacote.Vantagens no uso de Pacotes ‡ ‡ ‡ Facilita a manutenção: Mantêm a funcionalidade e a lógica juntas Design fácil: Codificação e compilação da especificação e do corpo separadamente Esconde informações: ± Somente as declarações na especificação do pacote são visíveis e acessíveis para as aplicações.

Vantagens no uso de Pacotes ‡ ‡ Funcionalidades adicionais: cursores Melhor desempenho: ± O pacote inteiro é carregado na memória na primeira vez que for referenciado. ± Existe apenas uma cópia na memória para todos os usuários. ‡ Sobrecarga: múltiplos subprogramas com o mesmo nome .

ordem ou tipos de dados Permite construir formas flexíveis para chamar subprogramas com dados diferentes Fornece uma maneira de estender a funcionalidade sem perda do código existente .Sobrecarga de Subprogramas ‡ ‡ ‡ ‡ Permite criar dois ou mais subprogramas com o mesmo nome Exige que os parâmetros formais do subprograma diferem em número.

.

END dept_pkg. / . loc NUMBER := 1700).Sobrecarga: Exemplo CREATE OR REPLACE PACKAGE dept_pkg IS PROCEDURE add_department(deptno NUMBER. PROCEDURE add_department( name VARCHAR2 := 'unknown'. name VARCHAR2 := 'unknown'. loc NUMBER := 1700).

loc NUMBER:=1700) IS BEGIN INSERT INTO departments(department_id. loc). END dept_pkg. location_id) VALUES (departments_seq. name VARCHAR2:='unknown'. END add_department. department_name. name. name. END add_department. / . PROCEDURE add_department ( name VARCHAR2:='unknown'. location_id) VALUES (deptno.NEXTVAL. loc). loc NUMBER:=1700) IS BEGIN INSERT INTO departments (department_id.Sobrecarga: Exemplo CREATE OR REPLACE PACKAGE BODY dept_pkg IS PROCEDURE add_department (deptno NUMBER. department_name.

ou alterar o sistema ou a sessão ± Uma consulta ou uma instrução DML em paralelo não pode executar uma declaração DML ou modificar o banco de dados ± Uma instrução DML não pode ler ou modificar a tabela a ser alterada pela instrução DML . criar ou reverter para um savepoint.Restrições quanto ao uso de funções de Pacotes em SQL ‡ ‡ Funções do pacote podem ser usadas em instruções SQL. Funções chamadas a partir de: ± Uma consulta ou instrução DML não deve terminar a transação corrente.

. END taxes_pkg. END tax.Função de Pacote em SQL: Exemplo CREATE OR REPLACE PACKAGE taxes_pkg IS FUNCTION tax (value IN NUMBER) RETURN NUMBER. BEGIN RETURN (value * rate). salary. END taxes_pkg.08. last_name FROM employees.tax(salary). / SELECT taxes_pkg. / CREATE OR REPLACE PACKAGE BODY taxes_pkg IS FUNCTION tax (value IN NUMBER) RETURN NUMBER IS rate NUMBER := 0.

Resumo Nesta lição. utilizando pacotes ‡ Criar e remover especificações e corpo do pacote ‡ Procedimentos e funções relacionadas em um pacote ‡ Alterar o corpo do pacote. sem afetar a especificação . gestão. você aprendeu a: ‡ Melhorar a organização do código. segurança e desempenho.

Sign up to vote on this title
UsefulNot useful