aula 08 - plsql - criando pacotes

22
Criando Pacotes

Upload: marcus-fabricio-ferreira-paula

Post on 05-Jul-2015

474 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Aula 08 - Plsql - Criando Pacotes

Criando Pacotes

Page 2: Aula 08 - Plsql - 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

Page 3: Aula 08 - Plsql - Criando Pacotes

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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