aula 08 - plsql - criando pacotes
TRANSCRIPT
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
Pacotes PL/SQL : Visão Geral
Pacotes PL/SQL:
• Componentes do grupo logicamente relacionados:– PL/SQL– Variáveis, 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
Componentes de um Pacote
Especificação
Corpo
Procedure A declaration;
variable
Procedure A definition
BEGIN…END;
Procedure B definition …
variable
variable
Público
Privado
Visibilidade de componentes do Pacote
Especificação
Corpo
Procedure A;
public_var
Procedure A IS
BEGIN…END;
Procedure B ISBEGIN … END;
local_var
private_var
Código Externo
Desenvolvendo Pacotes PL/SQL
spec.sql1 2
3
Edit Load
Cria(compila e guarda)
Executa
Use SHOW ERRORSpara erros de compilação
4
body.sql
corpo
especificação
Criando a especificação do Pacote
Sintaxe:
• 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.
• Todas as construções declaradas na especificação do pacote são visíveis para os usuários com privilégios sobre o pacote.
CREATE [OR REPLACE] PACKAGE package_name IS|AS public type and variable declarations subprogram specificationsEND [package_name];
Exemplo de Especificação do Pacote: comm_pkg
• STD_COMM é uma variável global inicializada para 0.10.
• RESET_COMM é um procedimento público usado para redefinir a comissão fixa com base em algumas regras de negócio. Ele é implementado no corpo do pacote.
CREATE OR REPLACE PACKAGE comm_pkg IS std_comm NUMBER := 0.10; --initialized to 0.10 PROCEDURE reset_comm(new_comm NUMBER);END comm_pkg;/
Criando o Corpo do Pacote
Sintaxe:
• A opção OR REPLACE apaga e re-cria o corpo do pacote.
• 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.
• Construções públicas são visíveis para o corpo do pacote.
CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS private type and variable declarations subprogram bodies[BEGIN initialization statements]END [package_name];
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.commission_pct%type; BEGIN SELECT MAX(commission_pct) INTO max_comm FROM employees; RETURN (comm BETWEEN 0.0 AND max_comm); END validate; PROCEDURE reset_comm (new_comm NUMBER) IS BEGIN IF validate(new_comm) THEN std_comm := new_comm; -- reset public var ELSE RAISE_APPLICATION_ERROR( -20210, 'Bad Commission'); END IF; END reset_comm;END comm_pkg;
Chamando subprogramas
• Chamando uma função dentro do mesmo pacote.
• Chamando um procedimento a partir do SQL*Plus:
• Chamando uma procedimento em um esquema diferente:
CREATE OR REPLACE PACKAGE BODY comm_pkg IS ... PROCEDURE reset_comm(new_comm NUMBER) IS BEGIN IF validate(new_comm) THEN std_comm := new_comm; ELSE ... END IF; END reset_comm;END comm_pkg;
EXECUTE comm_pkg.reset_comm(0.15)
EXECUTE scott.comm_pkg.reset_comm(0.15)
Removendo Pacotes
• Para remover a especificação do pacote e do corpo, use a seguinte sintaxe:
Para remover o corpo do pacote, use a seguinte sintaxe:
DROP PACKAGE package_name;
DROP PACKAGE BODY package_name;
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 a especificação do pacote:
• Para ver o corpo do pacote:
SELECT textFROM user_sourceWHERE name = 'COMM_PKG' AND type = 'PACKAGE';
SELECT textFROM user_sourceWHERE name = 'COMM_PKG' AND type = 'PACKAGE BODY';
Orientações para Escrita de Pacotes
• Construa pacotes para uso geral.
• Defina a especificação do pacote antes do corpo.
• A especificação do pacote deve conter apenas as construções que você quer que seja público.
• Mudanças nas especificações do pacote requer recompilação de cada subprograma referência.
• A especificação do pacote deve conter o mínimo de construções possível
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.– 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
• 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
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, 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
CREATE OR REPLACE PACKAGE dept_pkg IS PROCEDURE add_department(deptno NUMBER, name VARCHAR2 := 'unknown', loc NUMBER := 1700); PROCEDURE add_department( name VARCHAR2 := 'unknown', loc NUMBER := 1700);END dept_pkg;/
Sobrecarga: Exemplo
CREATE OR REPLACE PACKAGE BODY dept_pkg IS PROCEDURE add_department (deptno NUMBER, name VARCHAR2:='unknown', loc NUMBER:=1700) IS BEGIN INSERT INTO departments(department_id, department_name, location_id) VALUES (deptno, name, loc); END add_department;
PROCEDURE add_department ( name VARCHAR2:='unknown', loc NUMBER:=1700) IS BEGIN INSERT INTO departments (department_id, department_name, location_id) VALUES (departments_seq.NEXTVAL, name, loc); END add_department; END dept_pkg;/
Sobrecarga: Exemplo
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, criar ou reverter para um savepoint, 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
CREATE OR REPLACE PACKAGE taxes_pkg IS FUNCTION tax (value IN NUMBER) RETURN NUMBER;END taxes_pkg;/CREATE OR REPLACE PACKAGE BODY taxes_pkg IS FUNCTION tax (value IN NUMBER) RETURN NUMBER IS rate NUMBER := 0.08; BEGIN RETURN (value * rate); END tax;END taxes_pkg;/
Função de Pacote em SQL: Exemplo
SELECT taxes_pkg.tax(salary), salary, last_nameFROM employees;
Resumo
Nesta lição, você aprendeu a:
• Melhorar a organização do código, gestão, segurança e desempenho, 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