martes, 20 de julio de 2010

Trabajo Grupal_de la explicacion de los ejercicios de Carlitos Cacique

ESCUELA POLITÉCNICA DEL EJÉRCITO

NOMBRE:
David Páez
José Zambrano
CURSO:
Séptimo “C”
MATERIA:
Aplicación de Base de Datos  
EJEMPLO 1
Lo unico que hace es mostrar una linea en consola.
CREATE OR REPLACE PROCEDURE proc01 IS
BEGIN
dbms_output.put_line('Hola mundo con los procedimientos de Oracle');
END;

Después de la ejecución del procedimiento podemos comprobar que solamente imprime una línea en el prompt.
EJEMPLO 2
Igual que el anterior pero ahora la última línea finaliza con el nombre del procedimiento
CREATE OR REPLACE PROCEDURE proc02 IS
BEGIN
dbms_output.put_line('Otro procedimiento pero ahora con otro texto');
END proc02;

En realidad cuando se ejecuto este procedimiento realizó lo mismo que el anterior, no imprimió el nombre del procedimiento al final.

EJEMPLO 3
Uso de la clausula %TYPE y %ROWTYPE, la clausula %TYPE sirve para asignar los tipos de datos heredados de otras variables en tiempo de ejecución lo mismo para %ROWTYPE que actúa a nivel de fila
CREATE OR REPLACE PROCEDURE proc03 IS
v_fecha_sistema DATE;
v_fecha_contratacion v_fecha_sistema%TYPE;
v_salario employees.salary%TYPE;
reg_empleados employees%ROWTYPE;
BEGIN
SELECT sysdate INTO v_fecha_sistema FROM dual;
SELECT * INTO reg_empleados FROM employees WHERE employee_id=200;
v_salario := reg_empleados.salary;
v_fecha_contratacion := reg_empleados.hire_date;
dbms_output.put_line('El nombre del empleado es:'||reg_empleados.first_name);
dbms_output.put_line('El salario del empleado es:'||v_salario);
dbms_output.put_line('La fecha de contratación del empleado es:'||v_fecha_contratacion);
dbms_output.put_line('La fecha del sistema es:'||v_fecha_sistema);
END proc03;

Al empezar declaramos variables donde almacenaremos los campos de la tabla employees del empleado cuyo id sea 200, y definimos un registro donde se almacenen los datos de la tabla para luego extraerlos. Al empezar el procedimiento, se hacen dos sentencias select, una para almacenar la hora y fecha del sistema y otra para obtener los datos de la tabla employees, para finalizar se imprime el nombre, salario, fecha de contratación del empleado y la fecha del sistema.
EJEMPLO 4
Muestra el uso de etiquetas para resolucion de nombres de variables, analiza el ámbito de la variable v_cantidad
CREATE OR REPLACE PROCEDURE proc04 IS
BEGIN
<>
DECLARE
v_cantidad NUMBER := 100;
BEGIN
DECLARE
v_cantidad NUMBER := 150;
BEGIN
-- Inicio de un bloque de codigo interno
dbms_output.put_line('Valor de la variable interna:'||v_cantidad);
dbms_output.put_line('Valor de la variable externa:'||ambito_externo.v_cantidad);
END;
-- Aqui podemos continuar con los datos de la variable etiquetada externamente
dbms_output.put_line('Valor de la variable:'||v_cantidad);
END;
END proc04;

Este procedimiento ilustra el uso de etiquetas en la programación, nos indica ámbitos dentro del mismo procedimientos, es decir, donde es válida la variable y donde no, lo primero que se hace es indicar el ámbito de la misma, dándole nombre y encerrándolo entre <<>>, luego, vamos declarando bloques internos dentro del mayor, al imprimir dentro del bloque mas interno, para imprimir la variable presente en dicho bloque simplemente la enviamos a imprimir, y ara llamar al valor de la variable externa anteponemos el nombre del ámbito seguido por un punto, entonces se imprimirán dos valores distintos, luego al volver a imprimir se asignará a la variable el ultimo valor del bufer.

EJERCICIO NÚMERO 5
CREATE OR REPLACE PROCEDURE proc05 IS
-- Creamos un procedimiento llamado proc05, y, si este ya existe lo reemplazamos
-- Funcion sumar:
FUNCTION sumar(ope1 IN NUMBER,ope2 IN NUMBER) RETURN NUMBER IS
-- CREAMOS LA FUNCION SUMAR INGRESANDO COMO PARAMETROS OPE1 Y OPE2, E INDICA QUE EL PARAMETRO DE SALIDA ES UN NUMERO
BEGIN
RETURN ope1+ope2;
-- RETORNAMOS LA SUMA DE OPE1+OPE2
END sumar;
--TERMINAMOS LA FUNCION SUMAR
-- Funcion restar:
FUNCTION restar(ope1 IN NUMBER,ope2 IN NUMBER) RETURN NUMBER IS
-- CREAMOS LA FUNCION RESTA INGRESANDO COMO PARAMETROS OPE1 Y OPE2, E
BEGIN
RETURN ope1-ope2;
-- RETORNAMOS LA DIFERENCIA ENTRE OPE1 Y OPE2
END restar;
--TERMINAMOS LA FUNCION RESTAR

-- Funcion multiplicar:
FUNCTION multiplicar(ope1 IN NUMBER,ope2 IN NUMBER) RETURN NUMBER IS
-- CREAMOS LA FUNCION MULTIPLICAR INGRESANDO COMO PARAMETROS OPE1 Y OPE2, E INDICAMOS QUE EL PARAMETRO DE SALIDA ES NUMERO
BEGIN
RETURN ope1*ope2;
--RETORNAMOS EL VALOR DE LA MULTIPLICACION ENTRE OPE1 Y OPE2
END multiplicar;
--FINALIZAMOS LA FUNCION DE MUTIPLICAR
-- Funcion dividir:
FUNCTION dividir(ope1 IN NUMBER,ope2 IN NUMBER) RETURN NUMBER IS
-- CREAMOS LA FUNCION DIVIDIR INGRESANDO COMO PARAMETROS OPE1 Y OPE2, E INDICAMOS QUE EL PARAMETRO DE SALIDA ES TIPO NUMERO
BEGIN
RETURN ope1/ope2;
-- RETORNAMOS LA DIVISION ENTRE OPE1 Y OPE2
END dividir;
--FINALIZAMOS LA FUNCION DE DIVISION
BEGIN
dbms_output.put_line('Suma de 15 y 45: '||sumar(15,45));
-- MOSTRAMOS UN TEXTO SEGUIDO DE LA SUMA DE DOS VARIABLES INGRESADAS
dbms_output.put_line('Resta de 15 y 45: '||restar(15,45));
-- MOSTRAMOS UN TEXTO SEGUIDO DE LA DIFERENCIA DE DOS VARIABLES INGRESADAS
dbms_output.put_line('Multiplicacion de 15 y 45: '||multiplicar(15,45));
-- MOSTRAMOS UN TEXTO SEGUIDO DE LA MULTIPLICACION DE DOS VARIABLES INGRESADAS
dbms_output.put_line('Division de 15 y 45: '||dividir(15,45));
-- MOSTRAMOS UN TEXTO SEGUIDO DE LA DIVISION DE DOS VARIABLES INGRESADAS
END proc05;
--FINALIZAMOS EL PROCESO
EJERCICIO NÚMERO 6
CREATE OR REPLACE PROCEDURE proc06(vi_cantidad_minima IN INTEGER) IS
--CREAMOS UN PROCEDIMIENTO PROC06 EN EL CUAL INDICAMOS QUE LA VARIABLE vi_cantidad_minima ES DE ENTRADA
v_sueldo_base NUMBER := 4000;
v_cantidad_empleados INTEGER := 0;
--DECLARAMOS VARIABLES A UTILIZAR
BEGIN
--Obtenemos la cantidad de empleados que tienen un sueldo mayor al sueldo base
SELECT COUNT(employee_id) INTO v_cantidad_empleados FROM employees
WHERE salary > v_sueldo_base;
-- Testeamos si la cantidad de empleados es mayor a una constante
dbms_output.put_line('La cantidad de empleados es:'||v_cantidad_empleados);
dbms_output.put_line('-----------------------------------------------------');
dbms_output.put_line('Uso de las estructura if-then');
-- MOSTRAMOS MENSAJES DE TEXTO Y EL VALOR DE LA CANTIDAD DE EMPLEADOS
IF v_cantidad_empleados > vi_cantidad_minima THEN
--INICIAMOS UN CONDICIONAL
dbms_output.put_line('La cantidad de empleados:'||v_cantidad_empleados||', ES MAYOR a la minima');
-- SI LA CANTIDAD DE EMPLEADOS ES MAYOR A LA CANTIDAD MINIMA MOSTRAMOS DICHO MENSAJE
END IF;
--TERMINAMOS EL CONDICIONAL
dbms_output.put_line('Uso de las estructura if-then-else');
IF v_cantidad_empleados > vi_cantidad_minima THEN
--COMENZAMOS OTRO CONDICIONAL PERO MAS COMPLETO UTILIZANDO ADEMAS DE IF Y THEN, ELSE
dbms_output.put_line('La cantidad de empleados:'||v_cantidad_empleados||', ES MAYOR a la minima');
ELSE
dbms_output.put_line('La cantidad de empleados:'||v_cantidad_empleados||', NO ES MAYOR a la minima');
END IF;
--TERMINAMOS EL CONDICIONAL
END proc06;
--FINLAIZAMOS EL PROCEDIMIENO
----
EXECUTE proc06(80); --- Ejecutamos el procedimiento


EJERCICIO NÚMERO 7
CREATE OR REPLACE PROCEDURE proc07(vi_cantidad_iteraciones IN INTEGER) IS
-- CREAMOS UN PROCEDIMIENTO LLAMADO PROC07
v_contador1 INTEGER := 0;
v_contador2 INTEGER := 0;
-- DECLARAMOS LAS VARIABLES
BEGIN
-- Primero con una declaración EXIT para salir de un bucle.
dbms_output.put_line('Iteracion con clausula EXIT');
-- MOSTRAMOS UN MENSAJE
LOOP
-- INICIAMOS UN BUCLE
IF v_contador1 = vi_cantidad_iteraciones THEN
-- CREAMOS UN CONDICIONAL INDICANDO SI LAS DOS VARIABLES SON IGUALES
EXIT;
--DEBERA SALIR DEL BUCLE
ELSE
-- CASO CONTRARIO
dbms_output.put_line('Iterando con EXIT');
-- MOSTRARA UN MENSAJE
END IF;
--FINALIZA EL CONDICIONAL
v_contador1 := v_contador1 + 1;
-- Y SUMA UNO AL CONTADOR1
END LOOP;
--TERMINA EL BUCLE
--Ahora iteramos pero con la clausula EXIT WHEN
v_contador1 := 0;
dbms_output.put_line('Iteracion con la clausula EXIT WHEN');
--MOSTRAMOS UN MENSAJE PARA INDICAR LO QUE SE VA A HACER
LOOP
--CREAMOS UN BUCLE
v_contador1 := v_contador1 + 1;
dbms_output.put_line('Iterando con EXIT WHEN');
--COMENZAMOS DESDE UNO EN EL CONTADOR Y MOSTRAMOS UN MENSAJE
EXIT WHEN v_contador1 >= 20;
--CUANDO EL CONTADOR SEA MAYOR O IGUAL A 20 SALIMOS DEL BUCLE
END LOOP;
--TERMINAMOS EL BUCLE
--Ahora iteramos con la clausula EXIT WHEN con etiquetas
v_contador1 := 0;
v_contador2 := 0;
dbms_output.put_line('Iteracion con la clausula EXIT WHEN CON ETIQUETAS');
--CREAMOS DOS VARIABLES Y MOSTRAMOS OTRO MENSAJE PARA ENTENDER LO QUE SE VA A HACER
<>
--DENOTAMOS QUE ESE ES UN BUCLE EXTERNO
LOOP
-- Y COMENZAMOS EL BUCLE
v_contador1 := v_contador1 + 1;
dbms_output.put_line('Iterando con EXIT WHEN');
v_contador2 := 0;
<>
--DAMOS VALORES AL PRIMER CONTADOR Y MOSTRAMOS UN MENSAJE, AL SEGUNDO CONTADOR LE APLICAMOS EL VALOS DE 0 Y
--DENOTAMOS QUE INICIAMOS UNB BUCLE INTERNO
LOOP
--COMENZAMOS EL SEGUNDO BUCLE (INTERNO)
v_contador2 := v_contador2 + 1;
dbms_output.put_line('Iterando con EXIT WHEN ANIDADO');
-- SUMAMOS UNO AL CONTADOR NUMERO 2
EXIT externo WHEN (v_contador1 = 2 AND v_contador2 = 3);
--INDICAMOS QUE NOS SAQUE DEL BUCLE EXTERNO SI EL PRIMER CONTADOR Y EL SEGUNDO SON IGUALES A 2 Y 3 RESPECTIVAMENTE
EXIT interno WHEN v_contador2 >= 3;
--INDICAMOS QUE NOS SAQUE DEL BUCLE INTERNO SI EL SEGUNDO CONTADOR ES MAYOR O IGUAL A 3
END LOOP;
--TERMINAMOS EL BUCLE
EXIT externo WHEN v_contador1 >= 3;
--ORDENAMOS QUE NOS SAQUE DEL BUCLE EXTERNO SI EL CONTADOR UNO ES MAYOR O IGUAL A 3
END LOOP;
--TERMINAMOS EL BUCLE
END proc07;
--FINALIZAMOS EL PROCEDIMIENTO

-- INDICAMOS QUE SE MUESTRE EL RESULTADO DE LAS VARIABLES
SET SERVEROUTPUT ON;
EXECUTE PROC07(4);
--EJECUTAMOS EL PROCEDIMIENTO


EJERCICIO NÚMERO 8
CREATE OR REPLACE
PROCEDURE proc08(vi_cantidad_iteraciones IN INTEGER) IS
v_contador1 INTEGER := 0;
v_contador2 INTEGER := 0;
v_contador3 INTEGER := 0;
--CREAMOS EL PROCEDIMIENTO, DECLARAMOS 3 CONTADORES ENTEROS CON UN VALOR INICIAL DE 0
BEGIN
--Ahora iteramos con la clausula EXIT WHEN con etiquetas
v_contador1 := 0;
v_contador2 := 0;
dbms_output.put_line('Iteracion con la clausula EXIT WHEN CON ETIQUETAS');
<>
--ASIGNAMOS UN VALOR A LOS 2 PRIMEROS CONTADORES, MOSTRAMOS UN MENSAJE Y COLOCAMOS LA ETIQUEDA DE EXTERNO
LOOP
v_contador1 := v_contador1 + 1;
dbms_output.put_line('Iterando con EXIT WHEN');
v_contador2 := 0;
<>
-- SUMAMOS UNO AL CONTADOR 1 Y AL CONTADOR 2 ASIGNAMOS EL VALOR DE 0, ADEMAS DE CREAR UNA SEGUNDA ETIQUETA LLAMADO INTERNO
LOOP
--INICIAMOS EL BUCLE
v_contador2 := v_contador2 + 1;
dbms_output.put_line('Iterando con EXIT WHEN ANIDADO');
v_contador3 := 0;
--SUMAMOS UNO AL CONTADOR 2, MOSTRAMOS UN MENSAJE Y ASIGNAMOS AL CONTADOR 3 EL VALOR DE CERO
WHILE (v_contador3 < 5 ) LOOP
--INDICAMOS QUE MIENTRAS EL CONTADOR 3 SEA MENOR A 5 SE REALICE UN BUCLE
v_contador3 := v_contador3 + 1;
dbms_output.put_line('Iterando con EXIT WHEN ANIDADO CON WHILE-LOOP-END LOOP');
--AL CONTADOR 3 SUMAMOS UNO, MOSTRAMOS UN MENSAJE
END LOOP;
--TERMINAMOS EL BUCLE
EXIT externo WHEN (v_contador1 = 2 AND v_contador2 = 3);
-- QUE SE SALTE EL BUCLE EXTERNO SI EL CONTADOR UNO Y CONTADOR 2 SON IGUALES A 2 Y 3 RESPECTIVAMENTE
EXIT interno WHEN v_contador2 >= 3;
--QUE SE SALGA DEL BUCLE INTERNO SI EL CONTADOR 2 ES IGUAL A 3
END LOOP;
--SALIMOS DEL BUCLE
EXIT externo WHEN v_contador1 >= 3;
--SALIMOS DEL BUCLE EXTERNO SU EL CONTADOR1 ES MAYOR O IGUAL A 3
END LOOP;
--SALIMOS DEL BUCLE
END proc08;
--TERMINAMOS EL PROCEDIMIENTO