Programación de Base de Datos - IL4 - S13
Programación de Base de Datos - IL4 - S13
Programación de Base de Datos - IL4 - S13
Objetivo del Construye programas avanzados utilizando el lenguaje PL/SQL que soporten la lógica de
Laboratorio negocio mediante la incorporación de funciones y procedimientos almacenados,
organizados en paquetes y a través de disparadores almacenados en la base de datos.
Oracle es un sistema gestor de base de datos con características objeto - relacional, que
pertenece al modelo evolutivo de SGDB, este sistema permite controlar y gestionar
grandes volúmenes de contenidos.
a. Hardware
Recursos Sistema. Oracle en Windows requiere un PC Intel x86, AMD64 o Intel EM64T
Memoria. Al menos 1 GB de RAM y el doble en virtual.
Espacio en disco duro. Al menos 6 GB para la instalación (algunas instalaciones
requieren menos). Además, necesitamos poder almacenar 500 MB en la carpeta TEMP
del sistema.
Tarjeta gráfica. Debe de ser capaz de mostrar 1024 por 768 píxeles como mínimo y
256 colores.
b. Software
Windows 2003 Server y 2003 Server R2.
Windows XP Professional.
Windows Vista, pero no la versión Home Edition.
Windows Server 2008 y 2012. No la versión Server Core.
Compiladores. Se usan para la gente que crean aplicaciones en Oracle usando
lenguajes como Pro C, Pro COBOL, JAVA.
Visual C++.NET 2005 8.0 o Intel 10.1 C, .Net Express.
Navegador. Para configurar algunos servicios de Oracle. Debe de ser navegador
moderno (Internet Explorer 6 o superior, Firefox 2.0 o superior, Safari 3.1 o
superior, Chrome 3.0 o superior)
Usar dirección IP única en la máquina en la que se instala Oracle. Es decir, no usar
DHCP para direccionar la IP en el servidor de Oracle. No es un requisito obligatorio,
pero es muy recommendable.
1
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
Oracle permite acceder y manipular información de la base de datos definiendo objetos procedurales
(subprogramas) que se almacenan en la base de datos. Estos objetos procedurales son unidades de
programa PL/SQL: Funciones y Procedimientos almacenados.
Los procedimientos o funciones son bloques PL/SQL con nombre, que pueden recibir parámetros y
pueden ser invocados desde distintos entornos: SQL*PLUS, Oracle*Forms, desde otros
procedimientos y funciones y desde otras herramientas Oracle y aplicaciones.
Los procedimientos y funciones llevan a cabo tareas específicas, y su mayor diferencia radica en que
las funciones devuelven un valor.
RECORDEMOS:
Su sintaxis es la siguiente:
CREATE OR REPLACE PROCEDURE <NOMBRE_PROCEDURE> (PARAMETROS)
IS
<DEFINICION_VARIABLES_LOCALES_DEL_PROCEDIMIENTO,>
BEGIN
<CODIGO_PLSQL>
. . . . . . . . . . . . . .
END;
Debemos especificar el tipo de datos de cada parámetro. Al especificar el tipo de dato del
parámetro no debemos especificar la longitud del tipo.
IN (Default):
Si un parámetro es IN (Entrada) no puede ser modificado en el transcurso del código PLSQL.
OUT:
Si un parámetro es OUT (Salida) siempre llega al código del stored procedure con el valor de NULL y
cuando termina el código de PLSQL el parámetro mantiene el valor de forma persistente.
IN OUT: (Entrada/Salida)
Es una combinación de ambos.
Programación avanzada en Oracle.
2
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
3
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
GRABAR CLIENTE:
CREATE OR REPLACE PROCEDURE SP_GRABAR_CLIENTE
(CODIGO IN VARCHAR2, NOM IN VARCHAR2,
RUC IN VARCHAR2, DIR IN VARCHAR2, EST IN VARCHAR2)
IS
BEGIN
INSERT INTO CLIENTE VALUES (CODIGO, NOM, RUC, DIR, EST);
COMMIT;
DBMS_OUTPUT.PUT_LINE ('EXITO: Cliente Grabado Satisfactoriamente!');
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE ('ERROR: El Cliente ya existe');
END;
CONSULTAR CLIENTE:
CREATE OR REPLACE PROCEDURE SP_CONSULTAR_CLIENTE
(CODIGO IN VARCHAR2)
IS
COD CLIENTE.IDCLI%TYPE;
NOM CLIENTE.NOMBRE%TYPE;
RUC CLIENTE.RUC%TYPE;
DIR CLIENTE.DIRECCION%TYPE;
EST CLIENTE.ESTADO%TYPE;
BEGIN
SELECT IDCLI, NOMBRE,RUC,DIRECCION,ESTADO INTO COD,NOM,RUC,DIR,EST
FROM CLIENTE WHERE IDCLI=CODIGO;
DBMS_OUTPUT.PUT_LINE ('============================================');
DBMS_OUTPUT.PUT_LINE ('EXITO: Cliente Encontrado!');
DBMS_OUTPUT.PUT_LINE ('============================================');
DBMS_OUTPUT.PUT_LINE ('Codigo : ' || COD);
DBMS_OUTPUT.PUT_LINE ('Hombre : ' || NOM);
DBMS_OUTPUT.PUT_LINE ('Ruc : ' || RUC);
DBMS_OUTPUT.PUT_LINE ('Dirección : ' || DIR);
DBMS_OUTPUT.PUT_LINE ('Estado : ' || EST);
DBMS_OUTPUT.PUT_LINE ('============================================');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line ('Código de Cliente No Existe!');
END;
ACTUALIZAR CLIENTE:
4
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
5
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
Mediante una consulta a la tabla Cliente, verifique el contenido de la tabla, debe existir un nuevo
registro cuyo código empieza con ‘C0006’. SELECT * FROM CLIENTE;
Ejecute este código, para realizar una consulta del código de cliente: ‘C0006’.
SET SERVEROUTPUT ON;
BEGIN
SP_CONSULTAR_CLIENTE ('C0006');
END;
Resultado:
Mediante una consulta a la tabla Cliente, verifique el contenido de la tabla, debe existir un nuevo
registro cuyo código empieza con ‘C0006’. SELECT * FROM CLIENTE;
Si ingresamos un código de cliente que no existe, por ejemplo: ‘C0100’, el programa devolverá
“Código de Cliente no Existe!”
Para realizar una actualización, requerimos un registro modelo, para hacer cambios, en este ejemplo
usaremos al código de cliente ‘C0006’, cambiaremos el nombre y su estado
SELECT * FROM CLIENTE;
6
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
Ejecute este procedimiento, para realizar los cambios en código de cliente: ‘C0006’
BEGIN
SP_ACTUALIZAR_CLIENTE ('C0006',
‘OLIVARES CARPIO ALEXA’,
'1085858587',
'JR. HUARAZ 432 BREÑA’,
'ACTIVO');
END;
7
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
GRABAR EMPLEADO:
CREATE OR REPLACE PROCEDURE SP_GRABAR_EMPLEADO
(CODIGO IN VARCHAR2, NOM IN VARCHAR2, RUC IN VARCHAR2,
DIR IN VARCHAR2, EST IN VARCHAR2)
IS
BEGIN
INSERT INTO EMPLEADO VALUES (CODIGO, NOM, RUC, DIR, EST);
COMMIT;
DBMS_OUTPUT.PUT_LINE ('EXITO: Empleado Grabado Satisfactoriamente!');
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE ('ERROR: El Empleado ya existe');
END;
ELIMINAR EMPLEADO.
CREATE OR REPLACE PROCEDURE SP_GRABAR_EMPLEADO
(CODIGO IN VARCHAR2)
IS
BEGIN
DELETE FROM EMPLEADO WHERE IDEMP = CODIGO;
COMMIT;
DBMS_OUTPUT.PUT_LINE ('EXITO: Eliminado Satisfactoriamente!');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line ('Empleado No Existe!');
END;
CONSULTAR EMPLEADO:
CREATE OR REPLACE PROCEDURE SP_CONSULTAR_EMPLEADO
(CODIGO IN VARCHAR2)
IS
COD EMPLEADO.IDEMP%TYPE;
NOM EMPLEADO.NOMBRE%TYPE;
RUC EMPLEADO.RUC%TYPE;
DIR EMPLEADO.DIRECCION%TYPE;
EST EMPLEADO.ESTADO%TYPE;
BEGIN
SELECT IDEMP,NOMBRE,RUC,DIRECCION,ESTADO INTO COD,NOM,RUC,DIR,EST
FROM EMPLEADO WHERE IDEMP=CODIGO;
DBMS_OUTPUT.PUT_LINE ('============================================');
DBMS_OUTPUT.PUT_LINE ('EXITO: Empleado Encontrado!');
DBMS_OUTPUT.PUT_LINE ('============================================');
DBMS_OUTPUT.PUT_LINE ('Codigo : ' || COD);
DBMS_OUTPUT.PUT_LINE ('Nombre : ' || NOM);
DBMS_OUTPUT.PUT_LINE ('Ruc : ' || RUC);
DBMS_OUTPUT.PUT_LINE ('Direccion : ' || DIR);
DBMS_OUTPUT.PUT_LINE ('Estado : ' || EST);
DBMS_OUTPUT.PUT_LINE ('============================================');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line ('Código de Empleado No Existe!');
END;
8
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
ACTUALIZAR EMPLEADO:
CREATE OR REPLACE PROCEDURE SP_ACTUALIZAR_EMPLEADO
(CODIGO IN VARCHAR2, newNOM IN VARCHAR2,
newRUC IN VARCHAR2, newDIR IN VARCHAR2, newEST IN VARCHAR2)
IS
oldCOD EMPLEADO.IDEMP%TYPE;
oldNOM EMPLEADO.NOMBRE%TYPE;
oldRUC EMPLEADO.RUC%TYPE;
oldDIR EMPLEADO.DIRECCION%TYPE;
oldEST EMPLEADO.ESTADO%TYPE;
CONDICION VARCHAR2(50):='CAMBIOS REALIZADOS CON EXITO';
BEGIN
SELECT IDEMP, NOMBRE, RUC, DIRECCION, ESTADO
INTO oldCOD, oldNOM, oldRUC, oldDIR, oldEST
FROM EMPLEADO WHERE IDEMP=CODIGO;
IF newNOM <> oldNOM THEN
UPDATE EMPLEADO SET NOMBRE=newNom WHERE IDEMP=CODIGO;
ELSIF newRUC<>oldRUC THEN
UPDATE EMPLEADO SET RUC=newRUC WHERE IDEMP=CODIGO;
ELSIF newDIR<>oldDIR THEN
UPDATE EMPLEADO SET DIRECCION=newDIR WHERE IDEMP=CODIGO;
ELSIF newEST<>oldEST THEN
UPDATE EMPLEADO SET ESTADO=newEST WHERE IDEMP=CODIGO;
ELSE
CONDICION: ='NO HUBO CAMBIOS';
END IF;
9
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
Mediante una consulta a la tabla Empleado, verifique el contenido de la tabla, debe existir un nuevo
registro cuyo código empieza con ‘E0006’. SELECT * FROM EMPLEADO;
Ejecute este código, para realizar una consulta del código de cliente: ‘E0006’.
SET SERVEROUTPUT ON;
BEGIN
SP_CONSULTAR_EMPLEADO ('E0006');
END;
Resultado:
Si ingresamos un código de Empleado que no existe, por ejemplo: ‘E0100’, el programa devolverá
“Código de Empleado no Existe!”
Para realizar una actualización, requerimos un registro modelo, para hacer cambios, en este ejemplo
usaremos al código de cliente ‘E0006’.
10
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
Ejecute este procedimiento, para realizar los cambios en código de cliente: ‘E0006’
BEGIN
SP_ACTUALIZAR_EMPLEADO ('E0006',
'COLMENARES PEREZ ELENA',
'00000000000',
'AV. PERU 3676 SMP',
'ACTIVO');
END;
11
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
GRABAR PRODUCTO:
CREATE OR REPLACE PROCEDURE SP_GRABAR_PRODUCTO
(CODIGO IN VARCHAR2, NOM IN VARCHAR2, PREC IN NUMERIC,
ST IN INTEGER, EST IN VARCHAR2)
IS
BEGIN
INSERT INTO PRODUCTO VALUES (CODIGO, NOM, PREC, ST, EST);
COMMIT;
DBMS_OUTPUT.PUT_LINE ('EXITO: Producto Grabado Satisfactoriamente!');
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE ('ERROR: El Producto ya existe');
END;
CONSULTAR PRODUCTO:
CREATE OR REPLACE PROCEDURE SP_CONSULTAR_PRODUCTO
(CODIGO IN VARCHAR2)
IS
COD PRODUCTO.IDPROD%TYPE;
NOM PRODUCTO.NOMBRE%TYPE;
PREC PRODUCTO.PRECIO%TYPE;
ST PRODUCTO.STOCK%TYPE;
EST PRODUCTO.ESTADO%TYPE;
BEGIN
SELECT IDPROD, NOMBRE,PRECIO,STOCK,ESTADO INTO COD,NOM,PREC,ST,EST
FROM PRODUCTO WHERE IDPROD=CODIGO;
DBMS_OUTPUT.PUT_LINE ('============================================');
DBMS_OUTPUT.PUT_LINE ('EXITO: Producto Encontrado!');
DBMS_OUTPUT.PUT_LINE ('============================================');
DBMS_OUTPUT.PUT_LINE ('Codigo : ' || COD);
DBMS_OUTPUT.PUT_LINE ('Nombre : ' || NOM);
DBMS_OUTPUT.PUT_LINE ('Ruc : ' || PREC);
DBMS_OUTPUT.PUT_LINE ('Direccion : ' || ST);
DBMS_OUTPUT.PUT_LINE ('Estado : ' || EST);
DBMS_OUTPUT.PUT_LINE ('============================================');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line ('Código de Producto No Existe!');
END;
12
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
ACTUALIZAR PRODUCTO:
CREATE OR REPLACE PROCEDURE SP_ACTUALIZAR_PRODUCTO
(CODIGO IN VARCHAR2, newNOMBRE IN VARCHAR2,
newPRECIO IN NUMERIC, newSTOCK IN INTEGER, newESTADO IN VARCHAR2)
IS
oldCODIGO PRODUCTO.IDPROD%TYPE;
oldNOMBRE PRODUCTO.NOMBRE%TYPE;
oldPRECIO PRODUCTO.PRECIO%TYPE;
oldSTOCK PRODUCTO.STOCK%TYPE;
oldESTADO PRODUCTO.ESTADO%TYPE;
CONDICION VARCHAR2(50):='CAMBIOS REALIZADOS CON EXITO';
BEGIN
SELECT IDPROD, NOMBRE, PRECIO, STOCK, ESTADO
IF newNOMBRE
INTO <> oldNOMBRE,
oldCODIGO, oldNOMBRE THEN
oldPRECIO, oldSTOCK, oldESTADO
UPDATE PRODUCTO SET NOMBRE=newNOMBRE WHERE IDPROD=CODIGO;
FROM PRODUCTO WHERE IDPROD=CODIGO;
ELSIF newPRECIO <> oldPRECIO THEN
UPDATE PRODUCTO SET PRECIO=newPRECIO WHERE IDPROD=CODIGO;
ELSIF newSTOCK <> oldSTOCK THEN
UPDATE PRODUCTO SET STOCK=newSTOCK WHERE IDPROD=CODIGO;
ELSIF newESTADO <> oldESTADO THEN
UPDATE PRODUCTO SET ESTADO=newESTADO WHERE IDPROD=CODIGO;
ELSE
CONDICION:='NO HUBO CAMBIOS';
END IF;
IF CONDICION ='CAMBIOS REALIZADOS CON EXITO' THEN
COMMIT;
END IF;
DBMS_OUTPUT.PUT_LINE (CONDICION);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line ('Código del Producto No Existe!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE ('Error de Actualizacion');
END;
13
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
Mediante una consulta a la tabla Producto, verifique el contenido de la tabla, debe existir un nuevo
registro cuyo código empieza con ‘P0011’. SELECT * FROM PRODUCTO;
Ejecute este código, para realizar una consulta del código de cliente: ‘P0011’.
SET SERVEROUTPUT ON;
BEGIN
SP_CONSULTAR_PRODUCTO ('P0011');
END;
Resultado:
Si ingresamos un código de Empleado que no existe, por ejemplo: ‘P0100’, el programa devolverá
“Código de Producto no Existe!”
14
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
Para realizar una actualización, requerimos un registro modelo, para hacer cambios, en este ejemplo
usaremos al código de cliente ‘P0011’.
Ejecute este procedimiento, para realizar los cambios en código de cliente: ‘E0006’
SET SERVEROUTPUT ON;
BEGIN
SP_ACTUALIZAR_PRODUCTO ('P0011',' LAPTOP i5 15P 500GB HD H6565', +
1800.99, +
50, +
'ACTIVO');
END;
15
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
16
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
GENERADOR DE CODIGOS.
Para realizar este ejemplo, se debe contar con el siguiente modelo relacional.
Ejemplo 2:
Se pide crear los procedimientos y funciones necesarios para generar código automático en la tabla
PERSONAS, con los mantenimientos de datos incluidos.
.
PARA GENERAR CODIGOS AUTOMATICOS, SE DEBE CONTAR CON LA TABLA GENERADOR,
ESTA TABLA CONTENDRÁ EL ULTIMO VALOR GENERADO DE DICHA TABLA.:
17
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
ESTA FUNCIÓN PERMITE MULTIPLICAR UNA CADENA UNA CIERTA CANTIDAD DE VECES.
CREATE OR REPLACE FUNCTION REPLICATE (IN_STR VARCHAR2, IN_INT NUMBER)
RETURN VARCHAR2
IS
P_STR VARCHAR2(4000);
BEGIN
P_STR := '';
FOR I IN 1..IN_INT LOOP
P_STR := P_STR||IN_STR;
END LOOP;
RETURN P_STR;
END;
18
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
REALICE UNA CONSULTA EN LA TABLA PERSONAS: VERA QUE HAY 5 NUEVAS FILAS CON
LOS CODIGOS: ‘P0023’, ‘P0024’, ‘P0025’, ‘P0026’ y ‘P0027’. AUTOGENERADOS
19
______________________________________________________________________
Guía de Nombre Nombre
laboratorio de carrera Del curso
RESULTADO DE LA ACTUALIZACION.
La codificación PL/SQL de Oracle es tan amplia, que ofrece a los estudiantes una alta gama de
alternativas para la resolución de problemas en procedimientos y funciones, no difíciles de entender,
con la prioridad de manejar los datos con suma responsabilidad por el programador Oracle.
20
______________________________________________________________________