SlideShare una empresa de Scribd logo
1 de 8
/*
Sesión12 – Paquetes
Estudiante: José Luis Toro Alcarraz
Curso: Base de Datos Avanzado II
Correo:i201010865@cibertec.edu.pe
*/
Objetivos de la sesión.




Usar paquetes predefinidos por Oracle
Empaquetar funciones y procedimientos en paquetes
Invocar a un subprograma que reside en un paquete

1) Definición de paquete
2) Especificación y Cuerpo de un paquete
3) Ámbito para los paquetes.
4) Sobrecarga de los subprogramas de un paquete
5) Paquetes en Oracle
1) Definición de paquete





Es una estructura de PL/SQL que permite almacenar de manera agrupada varios objetos
relacionados.
Un paquete consta de dos partes, la especificación y el cuerpo. Cada una de ellas se
almacena independientemente en el diccionario de datos.
Un paquete no puede ser local, debe estar almacenado en la base de datos.
Presentan una serie de ventajas de rendimiento.

2) Especificación y Cuerpo de un paquete
a) Especificación de un paquete










La especificación del paquete, también conocida como cabecera del paquete, incluye
información acerca del contenido del paquete.
No contiene código ninguno de los procedimientos.
Los elementos dentro del paquete (especificaciones de procedimientos y funciones,
variables, etc.) son idénticos a cómo serían si estuviesen en la sección declarativa de un
bloque anónimo.
Las reglas sintácticas para la cabecera de un paquete son las mismas que para la sección
declarativa de un bloque PL/SQL, excepto en el caso de declaraciones de procedimientos
y funciones.
Los elementos del paquete pueden aparecer en cualquier orden. Sin embrago, como en
una sección declarativa, un objeto debe declararse antes de hacer referencia al mismo.
No es necesario que aparezcan todos los tipos de elementos.
Cualquier declaración de procedimientos y funciones debe ser formal. Un declaración
formal describe el subprograma y sus argumentos pero no incluye el código. Este se
incluirá en el cuerpo del paquete.
SINTAXIS:
CREATE [OR REPLACE] PACKAGE Nombre_paquete {IS|AS}
Especificación_procedimiento |
Especificación_función |
Especificación_variable |
Definición_tipo |
Declaración_excepción |
Declaración_cursor
END [nombre_paquete];
Ejemplo:
CREATE OR REPLACE PACKAGE PQ_DEPT
AS
-- Procedimiento que inserta un nuevo departamento
PROCEDURE SP_INSERTA_DEPT( P_NOMBRE IN DEPT.DNAME%TYPE,
P_LOCAL IN DEPT.LOC%TYPE,
P_CODIGO OUT DEPT.DEPTNO%TYPE
);
-- Procedimiento que elimina un departamento
PROCEDURE SP_ELIMINA_DEPT( P_CODIGO IN DEPT.DEPTNO%TYPE);
-- Función que muestra el número de empleados por departamento
FUNCTION SF_NUM_EMP( P_CODIGO IN DEPT.DEPTNO%TYPE)
RETURN NUMBER;
-- Excepciones
E_DEPTNOREGISTRADO
EXCEPTION;
END PQ_DEPT;
/
Paquete creado.
b) Cuerpo de un paquete




El cuerpo de un paquete es un objeto independiente de la especificación del paquete en el
diccionario de datos.
El cuerpo del paquete no puede compilarse hasta que la especificación del paquete se
haya compilado correctamente.
Contiene el código correspondiente a las declaraciones formales de los subprogramas que
aparecen en la especificación del paquete.

Ejemplo:
-- Creamos una sequencia
CREATE SEQUENCE SEQ_DEPT
START WITH 50
INCREMENT BY 10;
Secuencia creada.
-- Creamos el cuerpo del paquete
CREATE OR REPLACE PACKAGE BODY PQ_DEPT
AS
-- Procedimiento que inserta un nuevo departamento
PROCEDURE SP_INSERTA_DEPT( P_NOMBRE IN DEPT.DNAME%TYPE,
P_LOCAL IN DEPT.LOC%TYPE, P_CODIGO OUT DEPT.DEPTNO%TYPE) IS
BEGIN
SELECT SEQ_DEPT.NEXTVAL INTO P_CODIGO FROM DUAL;
INSERT INTO DEPT
VALUES (P_CODIGO, P_NOMBRE, P_LOCAL);
COMMIT;
END SP_INSERTA_DEPT;
-- Procedimiento que elimina un departamento
PROCEDURE SP_ELIMINA_DEPT(P_CODIGO IN DEPT.DEPTNO%TYPE) IS
BEGIN
DELETE FROM DEPT
WHERE DEPTNO = P_CODIGO;
COMMIT;
END SP_ELIMINA_DEPT;
-- Función que muestra el número de empleados por departamento
FUNCTION SF_NUM_EMP(P_CODIGO IN DEPT.DEPTNO%TYPE)
RETURN NUMBER IS
V_RESUL NUMBER(4);
BEGIN
SELECT COUNT(1) INTO V_RESUL
FROM EMP
WHERE DEPTNO = P_CODIGO;
RETURN V_RESUL;
END SF_NUM_EMP;
END PQ_DEPT;
/
c) Llamada a un paquete
DECLARE
V_NUMEMP
NUMBER(4);
V_CODIGO
DEPT.DEPTNO%TYPE;
BEGIN
-- Procedimiento que inserta un nuevo departamento
PQ_DEPT.SP_INSERTA_DEPT('MANTENIMIENTO','LIMA',V_CODIGO);
DBMS_OUTPUT.PUT_LINE('Nuevo departamento: ' || V_CODIGO);
-- Función que muestra el número de empleados por departamento
V_NUMEMP := PQ_DEPT.SF_NUM_EMP(20);
DBMS_OUTPUT.PUT_LINE('Departamento 20 tiene ' || V_NUMEMP || ' empleados');
END;
/
Insertamos el nuevo registro.
Nuevo departamento: 50
Departamento 20 tiene 0 empleados
Procedimiento PL/SQL terminado correctamente.
3) Ámbito para los paquetes.
Cualquier objeto que se declare en la cabecera del paquete se encuentra dentro de ámbito
y es visible desde fuera del paquete siempre que el objeto se distinga precediéndolo con el
nombre del paquete donde se encuentra.
La llamada al procedimiento es la misma que sería en el caso de un procedimiento
independiente. La única diferencia es el uso del nombre del paquete como prefijo.
Cuando un objeto solo es declarado dentro del cuerpo del paquete, su ámbito es el propio
cuerpo del paquete y puede llamarse desde otros procedimientos que se encuentren en el
cuerpo, pero no puede verse fuera del mismo.
Ejemplo:
-- Especificación nuevo paquete
CREATE OR REPLACE PACKAGE PQ_DEPT_2
AS
-- Funcion1
FUNCTION SF_DESC_LOCAL(P_CODIGO IN DEPT.DEPTNO%TYPE)
RETURN VARCHAR2;
END PQ_DEPT_2;
/
Paquete creado.
-- Cuerpo del paquete con una función local
CREATE OR REPLACE PACKAGE BODY PQ_DEPT_2 AS
-- Funcion2
FUNCTION SF_FORMATEA(P_NOMBRE IN DEPT.DNAME%TYPE,
P_LOCAL IN DEPT.LOC%TYPE)RETURN VARCHAR2 IS
BEGIN
RETURN 'El departamento ' || P_NOMBRE || ' se encuentra en el local ' || P_LOCAL;
END SF_FORMATEA;
-- Funcion1
FUNCTION SF_DESC_LOCAL(P_CODIGO IN DEPT.DEPTNO%TYPE)
RETURN VARCHAR2 IS
V_NOMBRE DEPT.DNAME%TYPE;
V_LOCAL DEPT.LOC%TYPE;
BEGIN
SELECT DNAME,LOC INTO V_NOMBRE, V_LOCAL FROM DEPT
WHERE DEPTNO = P_CODIGO;
RETURN SF_FORMATEA(V_NOMBRE, V_LOCAL);
END SF_DESC_LOCAL;
END PQ_DEPT_2;
/
Cuerpo del paquete creado.
-- Llamada a las funciones de los paquetes
DECLARE
V_RESUL VARCHAR2(500);
V_NOMBRE DEPT.DNAME%TYPE;
V_LOCAL DEPT.LOC%TYPE;
BEGIN
-- Función 1
V_RESUL := PQ_DEPT_2.SF_DESC_LOCAL(30);
DBMS_OUTPUT.PUT_LINE(V_RESUL);
-- Función 2
SELECT DNAME,LOC INTO V_NOMBRE,V_LOCAL
FROM DEPT WHERE DEPTNO = 30;
V_RESUL := PQ_DEPT.SF_FORMATEA(V_NOMBRE,V_LOCAL);
DBMS_OUTPUT.PUT_LINE(V_RESUL);
END;
/
V_RESUL := PQ_DEPT.SF_FORMATEA(V_NOMBRE,V_LOCAL);
*
ERROR en lÝnea 12:
ORA-06550: lÝnea 12, columna 20:
PLS-00302: el componente 'SF_FORMATEA' se debe declarar
ORA-06550: lÝnea 12, columna 1:
PL/SQL: Statement ignored
4) Sobrecarga de los subprogramas de un paquete
Los procedimientos y funciones dentro de un paquete pueden sobrecargarse, lo que
significa que puede haber más de un procedimiento o función con el mismo nombre, pero
con diferentes parámetros.
No pueden sobrecargarse dos subprogramas si sus parámetros difieren únicamente en el
nombre o en el modo.
No pueden sobrecargarse dos funciones que únicamente difieren en tipo de dato que se
devuelve.
Para que una función pueda sobrecargarse los tipos de los parámetros deben pertenecer a
familias diferentes.
Ejemplo:
-- Especificación nuevo paquete
CREATE OR REPLACE PACKAGE PQ_EJEMPLO
AS
-- Función1
FUNCTION SF_SUMA(P_1 IN NUMBER, P_2 IN NUMBER) RETURN NUMBER;
-- Función2
FUNCTION SF_SUMA(P_1 IN NUMBER,P_2 IN NUMBER,P_3 IN NUMBER)
RETURN NUMBER;
END PQ_EJEMPLO;
/
Paquete creado.
-- Cuerpo del paquete con sobre carga
CREATE OR REPLACE PACKAGE BODY PQ_EJEMPLO
AS
-- Función1
FUNCTION SF_SUMA(P_1 IN NUMBER, P_2 IN NUMBER)
RETURN NUMBER
IS
BEGIN
RETURN P_1 + P_2;
END SF_SUMA;
-- Función2
FUNCTION SF_SUMA(P_1 IN NUMBER, P_2 IN NUMBER, P_3 IN NUMBER )
RETURN NUMBER
IS
BEGIN
RETURN P_1 + P_2 + P_3;
END SF_SUMA;
END PQ_EJEMPLO;
/
Cuerpo del paquete creado.
-- Llamada al subpograma
DECLARE
V_RESULTADO NUMBER;
BEGIN
V_RESULTADO :=PQ_EJEMPLO .SF_SUMA(10,200);
DBMS_OUTPUT.PUT_LINE(‘Resultado1: ’ || V_RESULTADO);
V_RESULTADO :=PQ_EJEMPLO .SF_SUMA(10,200,100);
DBMS_OUTPUT.PUT_LINE(‘Resultado2: ’ || V_RESULTADO);
END;
/
Resultado1: 210
Resultado2: 310
Procedimiento PL/SQL terminado correctamente.
5) Paquetes en Oracle
El motor de Base de Datos Oracle contiene un conjunto variado de paquetes
preestablecidos que pueden ser usados para ejecutar diversas tareas. Entre los principales
tenemos :
-

DBMS_OUTPUT
UTL_FILE
DBMS_SQL
DBMS_APPLICATION_INFO

Listado de Paquetes en la base de datos
SELECT object_name FROM dba_objects WHERE object_type=’PACKAGE’;
Contenido de un paquete
DESC nombre_paquete
Problema1: Implementar un paquete PQ_VENTAS que tenga los siguientes elementos:
-

Función que reciba como parámetro el código de un empleado y devuelva el total de
ventas realizado por ese empleado.
Procedimiento que imprima en pantalla el ranking de ventas de empleados.

-- Cabecera del trigger
CREATE OR REPLACE PACKAGE PQ_VENTAS
AS
-- Función que retorna el total de ventas por empleados
FUNCTION SF_TOT_VENTAS( V_EMPNO IN EMP.EMPNO%TYPE)
RETURN NUMBER;
-- Procedimiento que devuelve el ranking de ventas
PROCEDURE SP_RANKING_VENTAS;
E_SINVENTAS EXCEPTION;
END PQ_VENTAS;
/
Paquete creado.
-- Cuerpo del trigger
CREATE OR REPLACE PACKAGE BODY PQ_VENTAS
AS
-- Función que retorna el total de ventas por empleados
FUNCTION SF_TOT_VENTAS(V_EMPNO IN EMP.EMPNO%TYPE)
RETURN NUMBER
IS
V_RESUL NUMBER(10,2);
BEGIN
SELECT SUM(TOTAL) INTO V_RESUL
FROM ORD
WHERE EMPNO=V_EMPNO;
RETURN V_RESUL;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error inesperado.' || SQLERRM);
RETURN –1;
END SF_TOT_VENTAS;
-- procedimiento que devuelve el ranking de ventas
PROCEDURE SP_RANKING_VENTAS
CURSOR CUR_RANKING IS
SELECT EMPNO,ENAME,SF_TOT_VENTAS(EMPNO) FROM EMP;
REG_RANKING CUR_RANKING%ROWTYPE;
V_POSICION NUMBER(4,2):=1;
BEGIN
DBMS_OUTPUT.PUT_LINE('ranking de empleados por venta');
DBMS_OUTPUT.PUT_LINE(RPAD('*',100,'*'));
OPEN CUR_RANKING;
LOOP
FETCH CUR_RANKING INTO REG_RANKING;
EXIT WHEN CUR_RANKING%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(RPAD(V_POSICION,10) ||
RPAD(REG_RANKING.EMPNO,10) || RPAD(REG_RANKING.ENAME,20)
|| RPAD(REG_RANKING.TOTAL,10));
END LOOP;
CLOSE CUR_RANKING;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('EROR DESCONOSIDO');
END SP_RANKING_VENTAS;
END PQ_VENTAS;
/
Cuerpo del paquete creado.

Más contenido relacionado

La actualidad más candente

Patrones de diseño(presentación 7)
Patrones de diseño(presentación 7)Patrones de diseño(presentación 7)
Patrones de diseño(presentación 7)
programadorjavablog
 
Teoria procedimientos almacenados
Teoria procedimientos almacenadosTeoria procedimientos almacenados
Teoria procedimientos almacenados
hirmaroxana13
 
Modelo requisitos UML
Modelo requisitos UMLModelo requisitos UML
Modelo requisitos UML
ramirezjaime
 
Funciones y procedimientos en SQL
Funciones y procedimientos en SQLFunciones y procedimientos en SQL
Funciones y procedimientos en SQL
Ronald Rivas
 

La actualidad más candente (20)

Modelos de Procesos de Software
Modelos de Procesos de SoftwareModelos de Procesos de Software
Modelos de Procesos de Software
 
Diagrama de Actividades
Diagrama de ActividadesDiagrama de Actividades
Diagrama de Actividades
 
Patrones de diseño(presentación 7)
Patrones de diseño(presentación 7)Patrones de diseño(presentación 7)
Patrones de diseño(presentación 7)
 
Cuestionario
CuestionarioCuestionario
Cuestionario
 
Plsql y paquetes
Plsql y paquetesPlsql y paquetes
Plsql y paquetes
 
Procedimientos almacenados en MySQL
Procedimientos almacenados en MySQLProcedimientos almacenados en MySQL
Procedimientos almacenados en MySQL
 
Herencia y Polimorfismo
Herencia y PolimorfismoHerencia y Polimorfismo
Herencia y Polimorfismo
 
Introducción a PHP
Introducción a PHPIntroducción a PHP
Introducción a PHP
 
Poo 3 herencia
Poo 3 herenciaPoo 3 herencia
Poo 3 herencia
 
OOSE
OOSEOOSE
OOSE
 
Diseño orientado a objeto
Diseño orientado a objetoDiseño orientado a objeto
Diseño orientado a objeto
 
SSTQB - Glosario de terminos de pruebas de software
SSTQB  - Glosario de terminos de pruebas de softwareSSTQB  - Glosario de terminos de pruebas de software
SSTQB - Glosario de terminos de pruebas de software
 
Teoria procedimientos almacenados
Teoria procedimientos almacenadosTeoria procedimientos almacenados
Teoria procedimientos almacenados
 
Programación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaProgramación 3: Clases y objetos en Java
Programación 3: Clases y objetos en Java
 
Modelo requisitos UML
Modelo requisitos UMLModelo requisitos UML
Modelo requisitos UML
 
Modelo Del Negocio con RUP y UML Parte 2
Modelo Del Negocio con RUP y UML Parte 2Modelo Del Negocio con RUP y UML Parte 2
Modelo Del Negocio con RUP y UML Parte 2
 
Funciones y procedimientos en SQL
Funciones y procedimientos en SQLFunciones y procedimientos en SQL
Funciones y procedimientos en SQL
 
8b Curso de POO en java - paso de diagrama clases a java 1
8b Curso de POO en java - paso de diagrama clases a java 18b Curso de POO en java - paso de diagrama clases a java 1
8b Curso de POO en java - paso de diagrama clases a java 1
 
Administración de requerimiento de software
Administración de requerimiento de softwareAdministración de requerimiento de software
Administración de requerimiento de software
 
Procedimientos almacenados
Procedimientos almacenadosProcedimientos almacenados
Procedimientos almacenados
 

Destacado

Como Utilizar Word
Como Utilizar WordComo Utilizar Word
Como Utilizar Word
enriquessss
 

Destacado (20)

Sesión12 - Trigger (Oracle)
Sesión12 - Trigger (Oracle)Sesión12 - Trigger (Oracle)
Sesión12 - Trigger (Oracle)
 
Sesión14 – Archivos redologs (Oracle)
Sesión14 – Archivos redologs (Oracle)Sesión14 – Archivos redologs (Oracle)
Sesión14 – Archivos redologs (Oracle)
 
Sesion09 - Manejo de Excepciones (Oracle)
Sesion09 - Manejo de Excepciones (Oracle)Sesion09 - Manejo de Excepciones (Oracle)
Sesion09 - Manejo de Excepciones (Oracle)
 
Sesion10 - Funciones y procedimientos (Oracle)
Sesion10 - Funciones y procedimientos (Oracle)Sesion10 - Funciones y procedimientos (Oracle)
Sesion10 - Funciones y procedimientos (Oracle)
 
Sesión13 - Archivos de Control (Oracle)
Sesión13 - Archivos de Control (Oracle)Sesión13 - Archivos de Control (Oracle)
Sesión13 - Archivos de Control (Oracle)
 
Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)
 
Sesión03 - Creación de objetos (Oracle)
Sesión03 - Creación de objetos (Oracle)Sesión03 - Creación de objetos (Oracle)
Sesión03 - Creación de objetos (Oracle)
 
Sesion06b - Introducción al PL-SQL (Oracle)
Sesion06b - Introducción al PL-SQL (Oracle)Sesion06b - Introducción al PL-SQL (Oracle)
Sesion06b - Introducción al PL-SQL (Oracle)
 
Sesion05 - Manipulacion de datos (Oracle)
Sesion05 - Manipulacion de datos (Oracle)Sesion05 - Manipulacion de datos (Oracle)
Sesion05 - Manipulacion de datos (Oracle)
 
Sesión02 - Creación de objetos (Oracle)
Sesión02 - Creación de objetos (Oracle)Sesión02 - Creación de objetos (Oracle)
Sesión02 - Creación de objetos (Oracle)
 
Sesion06a - Manipulacion de datos (Oracle)
Sesion06a - Manipulacion de datos (Oracle)Sesion06a - Manipulacion de datos (Oracle)
Sesion06a - Manipulacion de datos (Oracle)
 
Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)
 
Sesión04 - Diccionario de datos (Oracle)
Sesión04 - Diccionario de datos (Oracle)Sesión04 - Diccionario de datos (Oracle)
Sesión04 - Diccionario de datos (Oracle)
 
Sesion06c - Sentencias SQL en PL-SQL (Oracle)
Sesion06c - Sentencias SQL en PL-SQL (Oracle)Sesion06c - Sentencias SQL en PL-SQL (Oracle)
Sesion06c - Sentencias SQL en PL-SQL (Oracle)
 
Sesión01 - Gestión de instancia (Oracle)
Sesión01 - Gestión de instancia (Oracle)Sesión01 - Gestión de instancia (Oracle)
Sesión01 - Gestión de instancia (Oracle)
 
Como Utilizar Word
Como Utilizar WordComo Utilizar Word
Como Utilizar Word
 
Temeschwar - Rumänien
Temeschwar - RumänienTemeschwar - Rumänien
Temeschwar - Rumänien
 
Pee març 2013
Pee març 2013Pee març 2013
Pee març 2013
 
Business 2.0 -- Realiaet oder Blase (Juni 2007)
Business 2.0 -- Realiaet oder Blase (Juni 2007)Business 2.0 -- Realiaet oder Blase (Juni 2007)
Business 2.0 -- Realiaet oder Blase (Juni 2007)
 
Balanç àrea social. Temporada 2013 14
Balanç àrea social. Temporada 2013 14Balanç àrea social. Temporada 2013 14
Balanç àrea social. Temporada 2013 14
 

Similar a Sesión11 - Paquetes (Oracle)

Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery
Javier P.
 
Funciones store proc_triggers
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggers
Luis Jherry
 
7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server
Corfapo
 

Similar a Sesión11 - Paquetes (Oracle) (20)

gestion de datos de informacion
gestion de datos de informaciongestion de datos de informacion
gestion de datos de informacion
 
Tarea 3
Tarea 3Tarea 3
Tarea 3
 
Paquete
PaquetePaquete
Paquete
 
Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery
 
Intro aplicaciones web con php
Intro aplicaciones web con phpIntro aplicaciones web con php
Intro aplicaciones web con php
 
Ayudantia 4 de junio
Ayudantia 4 de junioAyudantia 4 de junio
Ayudantia 4 de junio
 
1 -programacion_oo
1  -programacion_oo1  -programacion_oo
1 -programacion_oo
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
Comandos java
Comandos javaComandos java
Comandos java
 
Comandos java
Comandos javaComandos java
Comandos java
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
Funciones store proc_triggers
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggers
 
Funcionesclase1
Funcionesclase1Funcionesclase1
Funcionesclase1
 
Ejercicios resueltos de_pl-sql
Ejercicios resueltos de_pl-sqlEjercicios resueltos de_pl-sql
Ejercicios resueltos de_pl-sql
 
preparedstatement
preparedstatementpreparedstatement
preparedstatement
 
7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server
 
Packages pl sql
Packages pl sqlPackages pl sql
Packages pl sql
 
Replica
ReplicaReplica
Replica
 
Funciones
FuncionesFunciones
Funciones
 
Trabajo dehoy (1)
Trabajo dehoy (1)Trabajo dehoy (1)
Trabajo dehoy (1)
 

Último

Concepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptxConcepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptx
Fernando Solis
 
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdfNUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
UPTAIDELTACHIRA
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
EliaHernndez7
 

Último (20)

Tema 10. Dinámica y funciones de la Atmosfera 2024
Tema 10. Dinámica y funciones de la Atmosfera 2024Tema 10. Dinámica y funciones de la Atmosfera 2024
Tema 10. Dinámica y funciones de la Atmosfera 2024
 
Concepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptxConcepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptx
 
PLAN DE REFUERZO ESCOLAR MERC 2024-2.docx
PLAN DE REFUERZO ESCOLAR MERC 2024-2.docxPLAN DE REFUERZO ESCOLAR MERC 2024-2.docx
PLAN DE REFUERZO ESCOLAR MERC 2024-2.docx
 
Sesión de clase: Fe contra todo pronóstico
Sesión de clase: Fe contra todo pronósticoSesión de clase: Fe contra todo pronóstico
Sesión de clase: Fe contra todo pronóstico
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
 
Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024
 
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdfNUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
 
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptxSEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
 
Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdfTema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
 
PIAR v 015. 2024 Plan Individual de ajustes razonables
PIAR v 015. 2024 Plan Individual de ajustes razonablesPIAR v 015. 2024 Plan Individual de ajustes razonables
PIAR v 015. 2024 Plan Individual de ajustes razonables
 
SESION DE PERSONAL SOCIAL. La convivencia en familia 22-04-24 -.doc
SESION DE PERSONAL SOCIAL.  La convivencia en familia 22-04-24  -.docSESION DE PERSONAL SOCIAL.  La convivencia en familia 22-04-24  -.doc
SESION DE PERSONAL SOCIAL. La convivencia en familia 22-04-24 -.doc
 
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICABIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
 
AFICHE EL MANIERISMO HISTORIA DE LA ARQUITECTURA II
AFICHE EL MANIERISMO HISTORIA DE LA ARQUITECTURA IIAFICHE EL MANIERISMO HISTORIA DE LA ARQUITECTURA II
AFICHE EL MANIERISMO HISTORIA DE LA ARQUITECTURA II
 
Supuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docxSupuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docx
 
LABERINTOS DE DISCIPLINAS DEL PENTATLÓN OLÍMPICO MODERNO. Por JAVIER SOLIS NO...
LABERINTOS DE DISCIPLINAS DEL PENTATLÓN OLÍMPICO MODERNO. Por JAVIER SOLIS NO...LABERINTOS DE DISCIPLINAS DEL PENTATLÓN OLÍMPICO MODERNO. Por JAVIER SOLIS NO...
LABERINTOS DE DISCIPLINAS DEL PENTATLÓN OLÍMPICO MODERNO. Por JAVIER SOLIS NO...
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
 
Infografía EE con pie del 2023 (3)-1.pdf
Infografía EE con pie del 2023 (3)-1.pdfInfografía EE con pie del 2023 (3)-1.pdf
Infografía EE con pie del 2023 (3)-1.pdf
 
Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...
 
Medición del Movimiento Online 2024.pptx
Medición del Movimiento Online 2024.pptxMedición del Movimiento Online 2024.pptx
Medición del Movimiento Online 2024.pptx
 
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLAACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
 

Sesión11 - Paquetes (Oracle)

  • 1. /* Sesión12 – Paquetes Estudiante: José Luis Toro Alcarraz Curso: Base de Datos Avanzado II Correo:i201010865@cibertec.edu.pe */ Objetivos de la sesión.    Usar paquetes predefinidos por Oracle Empaquetar funciones y procedimientos en paquetes Invocar a un subprograma que reside en un paquete 1) Definición de paquete 2) Especificación y Cuerpo de un paquete 3) Ámbito para los paquetes. 4) Sobrecarga de los subprogramas de un paquete 5) Paquetes en Oracle 1) Definición de paquete     Es una estructura de PL/SQL que permite almacenar de manera agrupada varios objetos relacionados. Un paquete consta de dos partes, la especificación y el cuerpo. Cada una de ellas se almacena independientemente en el diccionario de datos. Un paquete no puede ser local, debe estar almacenado en la base de datos. Presentan una serie de ventajas de rendimiento. 2) Especificación y Cuerpo de un paquete a) Especificación de un paquete        La especificación del paquete, también conocida como cabecera del paquete, incluye información acerca del contenido del paquete. No contiene código ninguno de los procedimientos. Los elementos dentro del paquete (especificaciones de procedimientos y funciones, variables, etc.) son idénticos a cómo serían si estuviesen en la sección declarativa de un bloque anónimo. Las reglas sintácticas para la cabecera de un paquete son las mismas que para la sección declarativa de un bloque PL/SQL, excepto en el caso de declaraciones de procedimientos y funciones. Los elementos del paquete pueden aparecer en cualquier orden. Sin embrago, como en una sección declarativa, un objeto debe declararse antes de hacer referencia al mismo. No es necesario que aparezcan todos los tipos de elementos. Cualquier declaración de procedimientos y funciones debe ser formal. Un declaración formal describe el subprograma y sus argumentos pero no incluye el código. Este se incluirá en el cuerpo del paquete.
  • 2. SINTAXIS: CREATE [OR REPLACE] PACKAGE Nombre_paquete {IS|AS} Especificación_procedimiento | Especificación_función | Especificación_variable | Definición_tipo | Declaración_excepción | Declaración_cursor END [nombre_paquete]; Ejemplo: CREATE OR REPLACE PACKAGE PQ_DEPT AS -- Procedimiento que inserta un nuevo departamento PROCEDURE SP_INSERTA_DEPT( P_NOMBRE IN DEPT.DNAME%TYPE, P_LOCAL IN DEPT.LOC%TYPE, P_CODIGO OUT DEPT.DEPTNO%TYPE ); -- Procedimiento que elimina un departamento PROCEDURE SP_ELIMINA_DEPT( P_CODIGO IN DEPT.DEPTNO%TYPE); -- Función que muestra el número de empleados por departamento FUNCTION SF_NUM_EMP( P_CODIGO IN DEPT.DEPTNO%TYPE) RETURN NUMBER; -- Excepciones E_DEPTNOREGISTRADO EXCEPTION; END PQ_DEPT; / Paquete creado. b) Cuerpo de un paquete    El cuerpo de un paquete es un objeto independiente de la especificación del paquete en el diccionario de datos. El cuerpo del paquete no puede compilarse hasta que la especificación del paquete se haya compilado correctamente. Contiene el código correspondiente a las declaraciones formales de los subprogramas que aparecen en la especificación del paquete. Ejemplo: -- Creamos una sequencia CREATE SEQUENCE SEQ_DEPT START WITH 50 INCREMENT BY 10; Secuencia creada.
  • 3. -- Creamos el cuerpo del paquete CREATE OR REPLACE PACKAGE BODY PQ_DEPT AS -- Procedimiento que inserta un nuevo departamento PROCEDURE SP_INSERTA_DEPT( P_NOMBRE IN DEPT.DNAME%TYPE, P_LOCAL IN DEPT.LOC%TYPE, P_CODIGO OUT DEPT.DEPTNO%TYPE) IS BEGIN SELECT SEQ_DEPT.NEXTVAL INTO P_CODIGO FROM DUAL; INSERT INTO DEPT VALUES (P_CODIGO, P_NOMBRE, P_LOCAL); COMMIT; END SP_INSERTA_DEPT; -- Procedimiento que elimina un departamento PROCEDURE SP_ELIMINA_DEPT(P_CODIGO IN DEPT.DEPTNO%TYPE) IS BEGIN DELETE FROM DEPT WHERE DEPTNO = P_CODIGO; COMMIT; END SP_ELIMINA_DEPT; -- Función que muestra el número de empleados por departamento FUNCTION SF_NUM_EMP(P_CODIGO IN DEPT.DEPTNO%TYPE) RETURN NUMBER IS V_RESUL NUMBER(4); BEGIN SELECT COUNT(1) INTO V_RESUL FROM EMP WHERE DEPTNO = P_CODIGO; RETURN V_RESUL; END SF_NUM_EMP; END PQ_DEPT; / c) Llamada a un paquete DECLARE V_NUMEMP NUMBER(4); V_CODIGO DEPT.DEPTNO%TYPE; BEGIN -- Procedimiento que inserta un nuevo departamento PQ_DEPT.SP_INSERTA_DEPT('MANTENIMIENTO','LIMA',V_CODIGO); DBMS_OUTPUT.PUT_LINE('Nuevo departamento: ' || V_CODIGO); -- Función que muestra el número de empleados por departamento V_NUMEMP := PQ_DEPT.SF_NUM_EMP(20); DBMS_OUTPUT.PUT_LINE('Departamento 20 tiene ' || V_NUMEMP || ' empleados'); END; / Insertamos el nuevo registro. Nuevo departamento: 50 Departamento 20 tiene 0 empleados
  • 4. Procedimiento PL/SQL terminado correctamente. 3) Ámbito para los paquetes. Cualquier objeto que se declare en la cabecera del paquete se encuentra dentro de ámbito y es visible desde fuera del paquete siempre que el objeto se distinga precediéndolo con el nombre del paquete donde se encuentra. La llamada al procedimiento es la misma que sería en el caso de un procedimiento independiente. La única diferencia es el uso del nombre del paquete como prefijo. Cuando un objeto solo es declarado dentro del cuerpo del paquete, su ámbito es el propio cuerpo del paquete y puede llamarse desde otros procedimientos que se encuentren en el cuerpo, pero no puede verse fuera del mismo. Ejemplo: -- Especificación nuevo paquete CREATE OR REPLACE PACKAGE PQ_DEPT_2 AS -- Funcion1 FUNCTION SF_DESC_LOCAL(P_CODIGO IN DEPT.DEPTNO%TYPE) RETURN VARCHAR2; END PQ_DEPT_2; / Paquete creado. -- Cuerpo del paquete con una función local CREATE OR REPLACE PACKAGE BODY PQ_DEPT_2 AS -- Funcion2 FUNCTION SF_FORMATEA(P_NOMBRE IN DEPT.DNAME%TYPE, P_LOCAL IN DEPT.LOC%TYPE)RETURN VARCHAR2 IS BEGIN RETURN 'El departamento ' || P_NOMBRE || ' se encuentra en el local ' || P_LOCAL; END SF_FORMATEA; -- Funcion1 FUNCTION SF_DESC_LOCAL(P_CODIGO IN DEPT.DEPTNO%TYPE) RETURN VARCHAR2 IS V_NOMBRE DEPT.DNAME%TYPE; V_LOCAL DEPT.LOC%TYPE; BEGIN SELECT DNAME,LOC INTO V_NOMBRE, V_LOCAL FROM DEPT WHERE DEPTNO = P_CODIGO; RETURN SF_FORMATEA(V_NOMBRE, V_LOCAL); END SF_DESC_LOCAL; END PQ_DEPT_2; / Cuerpo del paquete creado. -- Llamada a las funciones de los paquetes DECLARE
  • 5. V_RESUL VARCHAR2(500); V_NOMBRE DEPT.DNAME%TYPE; V_LOCAL DEPT.LOC%TYPE; BEGIN -- Función 1 V_RESUL := PQ_DEPT_2.SF_DESC_LOCAL(30); DBMS_OUTPUT.PUT_LINE(V_RESUL); -- Función 2 SELECT DNAME,LOC INTO V_NOMBRE,V_LOCAL FROM DEPT WHERE DEPTNO = 30; V_RESUL := PQ_DEPT.SF_FORMATEA(V_NOMBRE,V_LOCAL); DBMS_OUTPUT.PUT_LINE(V_RESUL); END; / V_RESUL := PQ_DEPT.SF_FORMATEA(V_NOMBRE,V_LOCAL); * ERROR en lÝnea 12: ORA-06550: lÝnea 12, columna 20: PLS-00302: el componente 'SF_FORMATEA' se debe declarar ORA-06550: lÝnea 12, columna 1: PL/SQL: Statement ignored 4) Sobrecarga de los subprogramas de un paquete Los procedimientos y funciones dentro de un paquete pueden sobrecargarse, lo que significa que puede haber más de un procedimiento o función con el mismo nombre, pero con diferentes parámetros. No pueden sobrecargarse dos subprogramas si sus parámetros difieren únicamente en el nombre o en el modo. No pueden sobrecargarse dos funciones que únicamente difieren en tipo de dato que se devuelve. Para que una función pueda sobrecargarse los tipos de los parámetros deben pertenecer a familias diferentes. Ejemplo: -- Especificación nuevo paquete CREATE OR REPLACE PACKAGE PQ_EJEMPLO AS -- Función1 FUNCTION SF_SUMA(P_1 IN NUMBER, P_2 IN NUMBER) RETURN NUMBER; -- Función2 FUNCTION SF_SUMA(P_1 IN NUMBER,P_2 IN NUMBER,P_3 IN NUMBER) RETURN NUMBER; END PQ_EJEMPLO; / Paquete creado.
  • 6. -- Cuerpo del paquete con sobre carga CREATE OR REPLACE PACKAGE BODY PQ_EJEMPLO AS -- Función1 FUNCTION SF_SUMA(P_1 IN NUMBER, P_2 IN NUMBER) RETURN NUMBER IS BEGIN RETURN P_1 + P_2; END SF_SUMA; -- Función2 FUNCTION SF_SUMA(P_1 IN NUMBER, P_2 IN NUMBER, P_3 IN NUMBER ) RETURN NUMBER IS BEGIN RETURN P_1 + P_2 + P_3; END SF_SUMA; END PQ_EJEMPLO; / Cuerpo del paquete creado. -- Llamada al subpograma DECLARE V_RESULTADO NUMBER; BEGIN V_RESULTADO :=PQ_EJEMPLO .SF_SUMA(10,200); DBMS_OUTPUT.PUT_LINE(‘Resultado1: ’ || V_RESULTADO); V_RESULTADO :=PQ_EJEMPLO .SF_SUMA(10,200,100); DBMS_OUTPUT.PUT_LINE(‘Resultado2: ’ || V_RESULTADO); END; / Resultado1: 210 Resultado2: 310 Procedimiento PL/SQL terminado correctamente. 5) Paquetes en Oracle El motor de Base de Datos Oracle contiene un conjunto variado de paquetes preestablecidos que pueden ser usados para ejecutar diversas tareas. Entre los principales tenemos : - DBMS_OUTPUT UTL_FILE DBMS_SQL DBMS_APPLICATION_INFO Listado de Paquetes en la base de datos SELECT object_name FROM dba_objects WHERE object_type=’PACKAGE’;
  • 7. Contenido de un paquete DESC nombre_paquete Problema1: Implementar un paquete PQ_VENTAS que tenga los siguientes elementos: - Función que reciba como parámetro el código de un empleado y devuelva el total de ventas realizado por ese empleado. Procedimiento que imprima en pantalla el ranking de ventas de empleados. -- Cabecera del trigger CREATE OR REPLACE PACKAGE PQ_VENTAS AS -- Función que retorna el total de ventas por empleados FUNCTION SF_TOT_VENTAS( V_EMPNO IN EMP.EMPNO%TYPE) RETURN NUMBER; -- Procedimiento que devuelve el ranking de ventas PROCEDURE SP_RANKING_VENTAS; E_SINVENTAS EXCEPTION; END PQ_VENTAS; / Paquete creado. -- Cuerpo del trigger CREATE OR REPLACE PACKAGE BODY PQ_VENTAS AS -- Función que retorna el total de ventas por empleados FUNCTION SF_TOT_VENTAS(V_EMPNO IN EMP.EMPNO%TYPE) RETURN NUMBER IS V_RESUL NUMBER(10,2); BEGIN SELECT SUM(TOTAL) INTO V_RESUL FROM ORD WHERE EMPNO=V_EMPNO; RETURN V_RESUL; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error inesperado.' || SQLERRM); RETURN –1; END SF_TOT_VENTAS; -- procedimiento que devuelve el ranking de ventas PROCEDURE SP_RANKING_VENTAS CURSOR CUR_RANKING IS SELECT EMPNO,ENAME,SF_TOT_VENTAS(EMPNO) FROM EMP; REG_RANKING CUR_RANKING%ROWTYPE; V_POSICION NUMBER(4,2):=1; BEGIN DBMS_OUTPUT.PUT_LINE('ranking de empleados por venta'); DBMS_OUTPUT.PUT_LINE(RPAD('*',100,'*'));
  • 8. OPEN CUR_RANKING; LOOP FETCH CUR_RANKING INTO REG_RANKING; EXIT WHEN CUR_RANKING%NOTFOUND; DBMS_OUTPUT.PUT_LINE(RPAD(V_POSICION,10) || RPAD(REG_RANKING.EMPNO,10) || RPAD(REG_RANKING.ENAME,20) || RPAD(REG_RANKING.TOTAL,10)); END LOOP; CLOSE CUR_RANKING; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('EROR DESCONOSIDO'); END SP_RANKING_VENTAS; END PQ_VENTAS; / Cuerpo del paquete creado.