Vous êtes sur la page 1sur 24

Programación de Base de Datos.

PL/SQL Estructuras Básicas de


Control.
Estructuras de Control.
Como PL/SQL es un lenguaje 3GL, cuenta con las estructuras
básicas de control de flujo:

• Selectivas/Condicionales,

• Bucles.
Estructura Selectiva IF:
Sintaxis:

IF condición THEN
Bloque de instrucciones;
ELSE
Bloque de instrucciones;
END IF;
Ejemplo 1:
Requerimiento:
Determinar si la edad promedio de los
empleados es mayor a los 40 años, si es
asi desplegar un mensaje por consola que
diga GRUPO ADULTO UNO caso contario
GRUPO ADULTO DOS.
set serveroutput on
declare
mEdad int;
begin
Select AVG((extract(year from current_date) - extract(year from fechanacimiento))) INTO mEdad
From Empleados;
if (mEdad > 40) then
dbms_output.put_line('GRUPO ADULTO UNO..'|| to_char(mEdad));
else
dbms_output.put_line('GRUPO ADULTO DOS..'|| to_char(mEdad));
end if;
end;
/
Demostración.
Realizar un reporte que me permita determinar de que cuidad es el cliente que
realizo el pedido mas alto entre los meses de Enero a Mayo del 2017, si la
ciudad es Guayaquil mostrar por consola el mensaje "CLIENTE REGION COSTA",
caso contrario "CLIENTE INDETERMINADO"
set serveroutput on
declare
mciudad Clientes.Ciudad%TYPE;
mmonto int;
begin
Select c.Ciudad, d.cantidad INTO mciudad, mmonto
From Clientes c inner join Pedidos p on c.idcliente = p.idcliente
inner join detalle_pedidos d on p.idpedido = d.idpedido
Where d.cantidad = (Select max(cantidad) From detalle_pedidos)
and p.fechapedido between '01/01/2017' and '30/05/2017’;
--dbms_output.put_line('Ciudad y Monto: '||mciudad||mmonto);
if (mciudad ='Guayaquil') then
dbms_output.put_line('CLIENTE DE LA REGION COSTA');
else
dbms_output.put_line('CLIENTE NO INDETERMINADO');
end if;
end;
Laboratorio.
Ejercicios Propuestos:
A. Determinar si la edad promedio de los Empleados de las
ciudades de Guayaquil o Babahoyo es mayor a la edad
promedio de los empleados que habitan en la región Sierra.
Muestre por consola un mensaje que indique el resultado
de dicha comparación.

B. Determinar si la existencia total de todos los productos


pertenecientes a la categoría carnes es mayor a 150
unidades, si fuere así mostrar por consola el mensaje
STOCK VALIDO caso contrario STOCK POR
SUMINISTRAR.
Estructura Selectiva CASE:
CASE [valor_a_comparar]
Sintaxis:
WHEN [valor1 | condición1] THEN
Instrucciones;
WHEN [valor2 | condición2] THEN
Instrucciones;
………….
ELSE
Bloque de instrucciones;
END CASE;
Ejemplo 1:
Requerimiento:
Determinar el descuento en base al
promedio del precio de todos los productos
pertenecientes a la categoría carnes, según
tabla adjunta.

Implementando bajo la 1RA FORMAR de la


instrucción CASE:
set serveroutput on
declare
mPrecio Productos.PrecioUnidad%TYPE;
mDescuento number(4,2);
begin
Select AVG(p.PrecioUnidad) into mPrecio
From Productos p inner join Categorias c on c.idcategorias = p.idcategorias
Where NombreCategoria = 'Carnes';
Case mPrecio
when 100 Then mDescuento:=0.10;
when 200 Then mDescuento:=0.20;
when 300 Then mDescuento:=0.30;
else
mDescuento:=0.05;
End case;
dbms_output.put_line('El descuento es: '||to_char(mDescuento));
end;
/
Ejemplo 2:

Requerimiento:
Veamos ahora el mismo ejemplo
anterior pero aplicando la 2DA FORMA
del CASE, revisemos como se hace:
set serveroutput on
declare
mPrecio Productos.PrecioUnidad%TYPE;
mDescuento number(4,2);
begin
Select AVG(p.PrecioUnidad) into mPrecio
From Productos p inner join Categorias c on c.idcategorias = p.idcategorias
Where NombreCategoria = 'Carnes';
Case
when mPrecio < 100 Then mDescuento:=0.10;
when mPrecio > 100 and mPrecio < 200 Then mDescuento:=0.20;
when mPrecio > 200 and mPrecio < 300 Then mDescuento:=0.30;
else
mDescuento:=0.05;
End case;
dbms_output.put_line('El descuento es: '||to_char(mDescuento));
end;
/
Laboratorio.
Ejercicios Propuestos:
Determinar el status de los clientes de la región costa, en base
al promedio de los montos de compra en el mes de Febrero.
Mostrar un mensaje bajo el siguiente criterio:
MONTO PEDIDO STATUS

< 500 CLIENTE REGULAR

>= 500 Y <=1000 CLIENTE BUENO

>1000 Y <=1500 CLIENTE MUY BUENO

> 1500 Y <=2000 CLIENTE EXCELENTE

Caso contrario CLIENTE TEMPORAL


Estructuras Repetitivas o Bucles.
En PL/SQL tenemos a nuestra disposición los siguientes
iteradores o bucles:

a) LOOP
b) WHILE
c) FOR
El Bucle LOOP.
El bucle LOOP, se repite tantas veces como sea necesario hasta que
se fuerza su salida con la instrucción EXIT.
Su sintaxis es la siguiente:
LOOP
Instrucciones; LOOP
IF (condición) THEN Instrucciones;
Instrucciones; EXIT WHEN (condición);
EXIT; Instrucciones;
END IF; END LOOP;
END LOOP;
SET SERVEROUTPUT ON;
DECLARE
resultado number:=0;
multiplicador number:=1;
BEGIN
LOOP
resultado := 3 * multiplicador;
DBMS_OUTPUT.PUT_LINE('3x'||TO_CHAR(multiplicador)||'='||TO_CHAR(resultado));
multiplicador := multiplicador + 1;
EXIT WHEN multiplicador > 5;
END LOOP;
END;
/
El Bucle WHILE.
El bucle WHILE, se repite mientras que se cumpla una condición
lógica. Su sintaxis es la siguiente:

WHILE (Condición_Lógica) LOOP


Instrucciones;
END LOOP;
El Bucle FOR.
El bucle FOR, se repite tanta veces como le indiquemos en los
identificadores inicio y final. Su sintaxis es la siguiente:

FOR (Condición_Lógica) LOOP


Instrucciones;
END LOOP;
Ejercicio Consolidado.
Desarrolle un bloque anónimo en ORACLE que permita visualizar un reporte con el total de
productos según las categorías existentes, bajo el siguiente formato:

Id Categoría Nombre Categoría Mensaje Total Producto

1 lácteos Tiene un total de Productos 3

Vous aimerez peut-être aussi