Anda di halaman 1dari 23

Criando Pacotes

Objetivos

Depos de completar essa lio, voc poder fazer o seguinte: Descrever a lista de pacotes e seus componentes Criar um pacote para agrupar variveis relacionadas, cursores, constantes, excees, procedimentos e funes Designar um pacote como pblico ou privado Chamar um pacote Descrever o uso de um pacote sem corpo

Pacotes PL/SQL : Viso Geral

Pacotes PL/SQL: Componentes do grupo logicamente relacionados:


PL/SQL Variveis, estruturas de dados e excees Subprogramas: procedimentos e funes Composto de duas partes: Especificao Corpo

Permiti que o servidor Oracle leia vrios objetos na memria de uma s vez

Componentes de um Pacote
Especificao variable Pblico Procedure A declaration;

variable Procedure B definition Procedure A definition variable Corpo BEGIN END; Privado

Visibilidade de componentes do Pacote


Especificao public_var Procedure A; Cdigo Externo

private_var Procedure B IS BEGIN END; Procedure A IS local_var Corpo BEGIN END;

Desenvolvendo Pacotes PL/SQL

spec.sql

1 Edit 3

2 Load Cria(compila e guarda)

body.sql especificao 4 Executa Use SHOW ERRORS para erros de compilao corpo

Criando a especificao do Pacote

Sintaxe:
CREATE [OR REPLACE] PACKAGE package_name IS|AS public type and variable declarations subprogram specifications END [package_name];

A opo OR REPLACE option apaga e re-cria a especificao do pacote. Variveis declaradas na especificao do pacote so inicializadas como NULL por padro. Todas as construes declaradas na especificao do pacote so visveis para os usurios com privilgios sobre o pacote.

Exemplo de Especificao do Pacote: comm_pkg

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; /

STD_COMM uma varivel global inicializada para 0.10. RESET_COMM um procedimento pblico usado para redefinir a comisso fixa com base em algumas regras de negcio. Ele implementado no corpo do pacote.

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];

A opo OR REPLACE apaga e re-cria o corpo do pacote. Identificadores definidos no corpo do pacote so privados e no so visveis fora do corpo do pacote. Todas as construes privadas devem ser declarados antes de serem referenciadas. Construes pblicas so visveis para o corpo do pacote.

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 funo dentro do mesmo pacote.
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;

Chamando um procedimento a partir do SQL*Plus: Chamando uma procedimento em um esquema diferente:

EXECUTE comm_pkg.reset_comm(0.15)

EXECUTE scott.comm_pkg.reset_comm(0.15)

Removendo Pacotes
Para remover a especificao do pacote e do corpo, use a seguinte sintaxe:

DROP PACKAGE package_name;

Para remover o corpo do pacote, use a seguinte sintaxe:


DROP PACKAGE BODY package_name;

Visualizando Pacotes no Dicionrio de Dados

O cdigo fonte dos pacotes so mantidas e podem ser visualizados atravs do USER_SOURCE e tabelas ALL_SOURCE no dicionrio de dados. Para ver a especificao do pacote:
SELECT text FROM user_source WHERE name = 'COMM_PKG' AND type = 'PACKAGE';

Para ver o corpo do pacote:


SELECT text FROM user_source WHERE name = 'COMM_PKG' AND type = 'PACKAGE BODY';

Orientaes para Escrita de Pacotes

Construa pacotes para uso geral. Defina a especificao do pacote antes do corpo. A especificao do pacote deve conter apenas as construes que voc quer que seja pblico. Mudanas nas especificaes do pacote requer recompilao de cada subprograma referncia. A especificao do pacote deve conter o mnimo de construes possvel

Vantagens no uso de Pacotes

Facilita a manuteno: Mantm a funcionalidade e a lgica juntas Design fcil: Codificao e compilao da especificao e do corpo separadamente Esconde informaes:
Somente as declaraes na especificao do pacote so visveis e acessveis para as aplicaes. Construes privadas no corpo do pacote esto escondidas e inacessveis. Toda a codificao escondida no corpo do pacote.

Vantagens no uso de Pacotes

Funcionalidades adicionais: cursores Melhor desempenho:


O pacote inteiro carregado na memria na primeira vez que for referenciado. Existe apenas uma cpia na memria para todos os usurios.

Sobrecarga: mltiplos subprogramas com o mesmo nome

Sobrecarga de Subprogramas

Permite criar dois ou mais subprogramas com o mesmo nome Exige que os parmetros formais do subprograma diferem em nmero, ordem ou tipos de dados Permite construir formas flexveis para chamar subprogramas com dados diferentes Fornece uma maneira de estender a funcionalidade sem perda do cdigo existente

Sobrecarga: Exemplo

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; /

Restries quanto ao uso de funes de Pacotes em SQL


Funes do pacote podem ser usadas em instrues SQL. Funes chamadas a partir de:
Uma consulta ou instruo DML no deve terminar a transao corrente, criar ou reverter para um savepoint, ou alterar o sistema ou a sesso Uma consulta ou uma instruo DML em paralelo no pode executar uma declarao DML ou modificar o banco de dados Uma instruo DML no pode ler ou modificar a tabela a ser alterada pela instruo DML

Funo de Pacote em SQL: Exemplo

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; / SELECT taxes_pkg.tax(salary), salary, last_name FROM employees;

Resumo
Nesta lio, voc aprendeu a: Melhorar a organizao do cdigo, gesto, segurana e desempenho, utilizando pacotes Criar e remover especificaes e corpo do pacote Procedimentos e funes relacionadas em um pacote Alterar o corpo do pacote, sem afetar a especificao

Anda mungkin juga menyukai