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
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
spec.sql
1 Edit 3
body.sql especificao 4 Executa Use SHOW ERRORS para erros de compilao corpo
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.
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.
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.
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;
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:
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';
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
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.
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; /
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