aula 08 - plsql - criando pacotes
TRANSCRIPT
![Page 1: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/1.jpg)
Criando Pacotes
![Page 2: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/2.jpg)
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
![Page 3: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/3.jpg)
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
![Page 4: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/4.jpg)
Componentes de um Pacote
Especificação
Corpo
Procedure A declaration;
variable
Procedure A definition
BEGIN…END;
Procedure B definition …
variable
variable
Público
Privado
![Page 5: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/5.jpg)
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
![Page 6: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/6.jpg)
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
![Page 7: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/7.jpg)
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];
![Page 8: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/8.jpg)
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;/
![Page 9: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/9.jpg)
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];
![Page 10: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/10.jpg)
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;
![Page 11: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/11.jpg)
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)
![Page 12: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/12.jpg)
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;
![Page 13: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/13.jpg)
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';
![Page 14: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/14.jpg)
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
![Page 15: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/15.jpg)
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.
![Page 16: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/16.jpg)
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
![Page 17: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/17.jpg)
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
![Page 18: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/18.jpg)
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
![Page 19: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/19.jpg)
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
![Page 20: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/20.jpg)
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
![Page 21: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/21.jpg)
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;
![Page 22: Aula 08 - Plsql - Criando Pacotes](https://reader033.vdocuments.mx/reader033/viewer/2022051314/5571fb6d497959916994d8d5/html5/thumbnails/22.jpg)
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