Está en la página 1de 37

16/08/2022

David Álvarez

BASE DE DATOS ll
Origen PL/SQL: Es un lenguaje basado en otro lenguaje de programación
llamado ADA, el cual fue un lenguaje diseñado por el departamento de
defensa de Estados Unidos. ADA es un lenguaje que se enfoca en la
abstracción, ocultamiento de información y otras estrategias de diseño.
Gracias a este diseño, PL/SQL es un lenguaje muy poderoso que incluye la
mayoría de los elementos de los lenguajes procedurales.
El PL/SQL es un lenguaje procedimental dentro de sus características
encontramos:
• Manejo de procedimientos y funciones.

• Inicio/final.

• Modularidad.

• Escalable: capacidad de adaptarse.

• Manejo de objetos: vectores/matrices/cursores.

• Manejo de variables/constantes.
• Trabajo en bloque, paquete, bloques anónimos.

• Manejo de errores(excepcions).

EJEMPLOS:
DECLARE
num1 number(3);
num2 number(3);
sumatoria number(6);
BEGIN
num1:=:num1;
num2:=:num2;
sumatoria:=num1+num2;
DBMS_OUTPUT.put_line('Hola mundo!'||sumatoria);
END;
DECLARE
num1 number(3);
num2 number(3);
Resta number(6);
BEGIN
num1:=:num1;
num2:=:num2;
Resta:=num1-num2;
DBMS_OUTPUT.put_line('Hola mundo!'||Resta);
END;

ACTIVIDAD
• Ingresado el radio de un círculo determinar su área perímetro diámetro
definiendo pi como una variable constante.
DECLARE
radio number(5);
area number(5);
perimetro number(5);
diametro number(5);
pi constant real := 3.1416;
BEGIN
radio:=:radio;
area:= pi * radio**2;
perimetro:= 2*pi*radio;
diametro:= 2*radio;
DBMS_OUTPUT.put_line('area= '||area||' perimetro= '||perimetro||'
diametro= '|| diametro);
END;

• Ingresado los catetos de un triángulo rectángulo determinar su hipotenusa.


DECLARE
cata number(5);
catb number(5);
hipotenusa number(10);

BEGIN
cata:=:cata;
catb:=:catb;
hipotenusa:= sqrt(cata + catb);
DBMS_OUTPUT.put_line('La hipotenusa es igual a: '|| hipotenusa);
END;

• Ingresada una fecha de nacimiento determinar años y meses de dicha fecha


a hoy.
DECLARE
fecha_nac date;
edad number(10,2);
resta number(10,2);
meses number(10,5);
BEGIN
fecha_nac:=:fecha_nac;
edad:= (sysdate-fecha_nac)/365;
resta:= edad-trunc((sysdate-fecha_nac)/365);
meses:= 12*resta;
DBMS_OUTPUT.put_line('Edad '|| trunc(edad)||' Meses ' ||
round(meses));
END;
17/08/2022
Declare: Las variables son declaradas en la sección DECLARE del programa.
Requieren un nombre y un tipo de dato. El nombre como todos los nombres en
oracle , debe seguir las siguientes reglas:

• 1 – 30 caracteres alfanuméricos.

• Primer caracter debe ser alfabético.

• Los Caracteres especiales válidos son _, $ and.

• Se deben evitar palabras reservadas como: SELECT.

ACTIVIDAD
• Ingresado 2 números determinar cual es el mayor y el menor.

DECLARE
Num1 number(3);
Num2 number(3);
BEGIN
Num1:= :Num1;
Num2:= :Num2;
IF(Num1>Num2)then DBMS_OUTPUT.put_line('El numero mayor es
' || Num1);
ELSE
DBMS_OUTPUT.put_line('El numero mayor es ' || Num2);
END IF;
END;

• Ingresado una fecha de nacimiento, determinar si es mayor de edad o


menor de edad, considerando que mayor de edad es mayor de 18.
DECLARE
Fecha_nac date;
Edad number(2);

BEGIN
Fecha_nac:= :Fecha_nac;
Edad:= trunc((sysdate-Fecha_nac)/365);
IF (edad>=18) then DBMS_OUTPUT.put_line('Eres mayor de edad
' );
ELSE
DBMS_OUTPUT.put_line('Eres menor de edad');
END IF;
END;

• Ingresado 3 números, hallar el mayor, el del medio y el menor.


DECLARE
Num1 number(3);
Num2 number(3);
Num3 number(3);
BEGIN
Num1:=:Num1;
Num2:=:Num2;
Num3:=:Num3;

IF(Num1>Num2) then
IF(Num1>Num3)then
DBMS_OUTPUT.put_line('El numero mayor es' ||Num1);
DBMS_OUTPUT.put_line('El numero del medio es ' ||Num3);
DBMS_OUTPUT.put_line('El numero menor es '|| Num2);

ELSE
DBMS_OUTPUT.put_line('El numero mayor es' ||Num3);
DBMS_OUTPUT.put_line('El numero del medio es' ||Num1);
DBMS_OUTPUT.put_line('El numero menor es' ||Num2);
END IF;
ELSE
IF(Num2>Num3)then
DBMS_OUTPUT.put_line('El numero mayor es' ||Num2);
DBMS_OUTPUT.put_line('El numero del medio es' ||Num3);
DBMS_OUTPUT.put_line('El numero menor es' ||Num1);
ELSE
DBMS_OUTPUT.put_line('El numero mayor es' ||Num3);
DBMS_OUTPUT.put_line('El numero del medio es' ||Num2);
DBMS_OUTPUT.put_line('El numero menor es' ||Num1);
END IF;
END IF;
END;
• Buscar un ejercicio donde se le aplique el CASE estructura de selección
múltiple.
• Tipo juego.

• Leído 3 ángulos de un triángulo clasifíquelo:


• Rectangulo: 90 cada uno de sus lados.
• Equilatero: sus ángulos son iguales.
• Escaleno: todos sus ángulos son diferentes.
• Isósceles: dos ángulos iguales.
Sumatoria de los angulos de 180.
DECLARE
ang1 number(3);
ang2 number(3);
ang3 number(3);
sumatoria number(6);

BEGIN
ang1:=:ang1;
ang2:=:ang2;
ang3:=:ang3;
sumatoria:=(ang1+ang2+ang3);
IF(sumatoria=180 and ang1<>0 and ang2 <>0 and ang3<>0)then
DBMS_OUTPUT.put_line('es un triangulo');
if(ang1=90 or ang2=90 or ang3=90)then
DBMS_OUTPUT.put_line('triangulo rectangulo');
END IF;
(ang1=ang2 and ang2=ang3 and ang1=ang3)then
DBMS_OUTPUT.put_line('triangulo equilatero');
END IF;
IF(ang1<>ang2 and ang2<>ang3 and ang1<>ang3)then
DBMS_OUTPUT.put_line('triangulo escaleno');
END IF;
IF(ang1=ang2)then
IF(ang1<>ang3)then
DBMS_OUTPUT.put_line('triangulo isosceles');
END IF;
END IF;
IF(ang2=ang3)then
IF(ang2<>ang1)then
DBMS_OUTPUT.put_line('triangulo isosceles');
END IF;
END IF;
IF(ang3=ang1)then
IF(ang3<>ang2)then
DBMS_OUTPUT.put_line('triangulo isosceles');
END IF;
END IF;
ELSE
DBMS_OUTPUT.put_line('no es un triangulo');
END IF;
END;

23/08/2022
RULETA:
DECLARE
numero1 number(1);
numero2 number(1);
numero3 number(1);
BEGIN
numero1:=trunc(DBMS_RANDOM.VALUE(1,9));
numero2:=trunc(DBMS_RANDOM.VALUE(1,9));
numero3:=trunc(DBMS_RANDOM.VALUE(1,9));
DBMS_OUTPUT.PUT_LINE('El numero es: ' || numero1 || numero2 ||
numero3);

IF(numero1=numero2 and numero2=numero3 and


numero1=numero3)then
DBMS_OUTPUT.PUT_LINE('RULETA!!');
END IF;

IF(numero1=numero2)then
IF(numero1<>numero3)then
DBMS_OUTPUT.PUT_LINE('CASI ES RULETA!!');
END IF;
END IF;
IF(numero2=numero3)then
IF(numero2<>numero1)then
DBMS_OUTPUT.PUT_LINE('CASI ES RULETA!!');
END IF;
END IF;
IF(numero3=numero1)then
IF(numero3<>numero2)then
DBMS_OUTPUT.PUT_LINE('CASI ES RULETA!!');
END IF;
END IF;
IF(numero1<>numero2 and numero1<>numero3 and
numero2<>numero3) then
DBMS_OUTPUT.PUT_LINE('NO HAY NADA!!');
END IF;
END;

EJEMPLO EN CLASE
Inserte a través de PL/SQL un nuevo avión.
DECLARE
V_modelo AVION.modelo%Type;
V_tipo_avion AVION.tipo_avion%Type;
V_nro_motores AVION.nro_motores%Type;
V_marca AVION.marca%Type;
BEGIN
insert into AVION
values(13,:V_modelo,:V_tipo_avion,:V_nro_motores,:V_marca);
END;

ACTIVIDAD EN CLASE
Ingresado un porcentaje actualizar el precio de aquellas rutas cuya ciudad de
destino es Medellin aumentándole dicho porcentaje.
DECLARE
V_porcentaje number(2);
BEGIN
Update RUTA set vr_ruta=vr_ruta + ((vr_ruta*:V_porcentaje)/100)
where
ciudad_llegada = 'Medellin';
END;
Ingresado el código de un piloto hacer su borrado verificando que se
pueda borrar. Si no se puede sacar un mensaje.

30/08/2022
EJEMPLO EN CLASE
Se requiere mostrar los datos del cliente de menor edad que ha viajado en
la aerolínea. Esto con código PL.
DECLARE
V_datos CLIENTE %Rowtype;
BEGIN
SELECT CLIENTE.* INTO V_datos FROM CLIENTE, TIQUETE,
VUELO
WHERE CLIENTE.cod_cliente=TIQUETE.cod_cliente AND
TIQUETE.cod_vuelo=VUELO.cod_vuelo
AND fecha < sysdate
AND fecha_nac= (SELECT max(fecha_nac) FROM CLIENTE);
DBMS_OUTPUT.put_line(V_datos.cod_cliente|| V_datos.nombre||
V_datos.fecha_nac||V_datos.ciudad_residencia||V_datos.genero||
V_datos.profesion||
V_datos.telefono||V_datos.correo);
END;
ACTIVIDAD.
• Se requiere crear un procedimiento que ingresado el código de un piloto
determine cuantos vuelos ha realizado . Si la cantidad de vuelos es
superior a 12 el piloto puede ser ascendido a categoría A de lo contrario
dejarlo en la categoría que se encontraba mostrando esta.

DECLARE
V_codigo PILOTO.cod_piloto %Type;
datos PILOTO %Rowtype;
NumVuelos number(3);
BEGIN
V_codigo:=:V_codigo;
SELECT.* INTO datos
WHERE cod_piloto = V_codigo;
SELECT COUNT(cod_vuelo) INTO NumVuelos FROM VUELO
WHERE cod_piloto = V_codigo AND fecha<sysdate;
IF NumVuelos > 12 then
Update PILOTO SET categoria='A'
WHERE cod_piloto= V_codigo;
ELSE
DBMS_OUTPUT.put_line('NO SE ACTUALIZA CATEGORIA!
Categoria estable en: ' || datos.categoria);
END IF;
EXCEPTION
WHEN No_data_found THEN
DBMS_OUTPUT.put_line('Código ingresado no existe!');
END;

1.Se requiere establecer el volumen y el peso que se está llevando en un


vuelo cuyo código fue ingresado por teclado y el avión que lo hace es un
avión de carga. Establezca el peso y el volumen de las encomiendas que se
han subido hasta el momento y determinar si se tiene capacidad según el
avión y de cuanto es esa capacidad.

DECLARE
V_vuelo VUELO.cod_vuelo%TYPE;
V_avion AVION.cod_avion%TYPE;
Datos AVION%ROWTYPE;
daticos AVION_CARGA%ROWTYPE;
V_sumaV number(6);
V_sumaP number(6);
cap_peso number(6);
cap_volumen number(6);
BEGIN
V_vuelo:=:V_vuelo;
SELECT cod_avion INTO V_avion FROM VUELO WHERE
cod_vuelo=V_vuelo;
SELECT * INTO Datos FROM AVION
WHERE cod_avion=V_avion;
IF Datos.tipo_avion='carga' THEN
SELECT sum(peso) INTO V_sumaP FROM
CARGA,ENCOMIENDA,VUELO WHERE
CARGA.cod_encomienda=ENCOMIENDA.cod_encomienda
and ENCOMIENDA.cod_vuelo=VUELO.cod_vuelo;
SELECT sum(volumen) INTO V_sumaV FROM
CARGA,ENCOMIENDA,VUELO WHERE
CARGA.cod_encomienda=ENCOMIENDA.cod_encomienda
and ENCOMIENDA.cod_vuelo=VUELO.cod_vuelo;
DBMS_OUTPUT.PUT_LINE(V_sumaP);
DBMS_OUTPUT.PUT_LINE(V_sumaV);
SELECT * INTO daticos FROM AVION_CARGA
WHERE cod_avion_carga=V_avion;
IF V_sumaP<daticos.cap_max_peso THEN
DBMS_OUTPUT.PUT_LINE('Todavía hay espacio');
ELSE
DBMS_OUTPUT.PUT_LINE('Ya no hay espacio');
END IF;
IF V_sumaV<daticos.cap_max_volumen THEN
DBMS_OUTPUT.PUT_LINE('Todavía hay espacio');
ELSE
DBMS_OUTPUT.PUT_LINE('Ya no hay espacio');
END IF;
ELSE
DBMS_OUTPUT.PUT_LINE('EL AVION NO ES DE CARGA!');
END IF;
EXCEPTION
WHEN No_data_found THEN
DBMS_OUTPUT.put_line('EL CÓDIGO DEL AVIÓN NO
EXISTE!');
END;

2.Se desea establecer si es requerido hacerle a un determinado avión


Mantenimiento. Se lee el código del avión y de acuerdo al siguiente criterio
se envia o no a mantenimiento:
Avion que ha realizado mas de 7 vuelos y ha recorrido en kilometraje en
sus vuelos 500 millas.

Declare
V_Codigo Avion.Cod_Avion %Type;
Datos Avion%RowType;
NumVuelos number(3);
KmTotal number(10);
Begin
V_Codigo:=:V_Codigo;
Select * into Datos from Avion
Where V_Codigo=Cod_Avion;
Select count(Cod_Vuelo) into NumVuelos from Vuelo
Where Vuelo.Cod_Avion=V_Codigo and Fecha<Sysdate;
Select Sum(Km_Recorrido) into KmTotal
from Rutas,Vuelo
Where Cod_Avion=V_Codigo
and Vuelo.Cod_Ruta=Rutas.Cod_Ruta and Fecha<Sysdate;
If NumVuelos>7 and KmTotal>8046 then
Dbms_output.put_Line('El avión se enviara a mantenimiento');
Else
Dbms_output.put_Line('El avión aun no se enviara a
mantenimiento.');
End if;
Exception
When No_Data_Found then
Dbms_output.put_Line('Codigo ingresado no existe!');
End;

3.Se requiere hacer una clasificación y recategorización de los pilotos según


el numero de vuelos realizados(se lee el código del piloto)
Si el piloto ha realizado mas de 12 vuelos pasarlo a categoría A.
Si el piloto ha realizado entre 5 y 12 pasarlo a categoría B.
Si el piloto ha realizado menos de 5 pasarlo a categoría C.
DECLARE
V_codigo PILOTO.cod_piloto%TYPE;
datos PILOTO%ROWTYPE;
NumVuelos number(3);
BEGIN
V_codigo:=:V_codigo;
SELECT * INTO datos FROM PILOTO
WHERE cod_piloto = V_codigo;
SELECT COUNT(cod_vuelo) INTO NumVuelos FROM VUELO
WHERE cod_piloto = V_codigo;
IF NumVuelos > 12 then
Update PILOTO SET categoria='A'
WHERE cod_piloto = V_codigo;
DBMS_OUTPUT.put_line('PILOTO SEÑOR');
END IF;
IF numVuelos > 5 AND numVuelos <= 12 then
UPDATE PILOTO SET categoria='B'
WHERE cod_piloto = V_codigo;
DBMS_OUTPUT.put_line('PILOTO REGULAR');
END IF;
IF NumVuelos < 5 then
Update PILOTO SET categoria='C'
WHERE cod_piloto = V_codigo;
DBMS_OUTPUT.put_line('PILOTO EN PRUEBA');
END IF;
EXCEPTION
WHEN No_data_found THEN
DBMS_OUTPUT.put_line('Código ingresado no existe!');
END;
Actividad 14/09/22
Ingresado un numero realizar la sumatoria del uno hasta este
limite
1.Ciclo while..
declare
numero number(10);
contador number(10);
sumar number(10);
begin
numero:=:numero;
contador:=0;
sumar:=0;
while contador<numero loop
contador:=contador+1;
sumar:=sumar+contador;
end loop;
Dbms_output.put_Line('La suma de los numeros es: '||sumar);
end;

2.CICLO LOOP:
declare
numero number(10);
contador number(10);
sumar number(10);
begin
numero:=:numero;
contador:=0;
sumar:=0;
loop
contador:=contador+1;
sumar:=sumar+contador;
exit when contador>=numero;
end loop;
Dbms_output.put_Line('La suma de los numeros es: '||sumar);
end;

3.Ciclo for:
declare
numero number(10);
contador number(10);
sumar number(10);
begin
numero:=:numero;
contador:=0;
sumar:=0;
for i in 0 .. numero-1 loop
contador:=contador+1;
sumar:=sumar+contador;
end loop;
Dbms_output.put_Line('La suma de los numeros es: '||sumar);
end;

12) Generando aleatoriamente un numero de 3 cifras determinar el acierto


tipo ruleta entre sus dígitos:

Declare
Num number(3);
Objetivo number(3);
Begin
Num:= (DBMS_RANDOM.VALUE(100,999));
if Num= 111 or Num= 222 or Num= 333 or Num= 444 or Num= 555 or Num=
666 or Num= 777 or Num= 888 or Num= 999 then
Dbms_output.put_Line('Ruleta! El numero es: '||Num);
elsif Num<120 and Num>110 or Num<230 and Num>220 or Num<340 and
Num>330 or Num<450 and Num>440 or Num<560 and Num>550 or Num<670
and Num>660 or Num<780 and Num>770 or Num<890 and Num>880 or
Num<1000 and Num>990 then
Dbms_output.put_Line('Casi! El numero es: '||Num);
Else Dbms_output.put_Line('No hay nada! El numero es: '||Num);
END if;
End;

13) Inserte a través del PL/SQL un nuevo avión:


Declare
V_Modelo Avion.Modelo%Type;
V_Tipo Avion.Tipo%Type;
V_Motor Avion.Num_Motores%Type;
V_Marca Avion.Marca%Type;
Begin
Insert into Avion values
(Avion_SQ.nextval,:V_Modelo,:V_Tipo,:V_Motor,:V_Marca);
End;

Mostrar Si Es Numero Primo O No.

DECLARE
Numero number(14);
Divisor number(14);

BEGIN

Numero:=:Numero;
Divisor:=0;

for i in 1..100 LOOP


if Numero MOD i=0 THEN

Divisor:=Divisor+1;

END IF;
END LOOP;
If Divisor=2 THEN
DBMS_OUTPUT.PUT_LINE('El numero '||Numero|| ' Es Primo');
Else
DBMS_OUTPUT.PUT_LINE('El numero '||Numero|| ' No es Primo');

END IF;
END;

Con WHILE.
DECLARE
numero number(3);
divisor number(3);
i number:=1;
BEGIN
numero:=:numero;
divisor:=1;

WHILE i<numero LOOP


if numero mod i=0 then
divisor:= divisor+1;
End if;
i:=i+1;
end loop;
if (divisor<=2) then
DBMS_OUTPUT.PUT_LINE('El numero '||Numero|| ' Es Primo');
Else
DBMS_OUTPUT.PUT_LINE('El numero '||Numero|| ' No es Primo');

END IF;
END;

Con Loop.
DECLARE
numero number(3);
divisor number(3);
i number:=1;
BEGIN
numero:=:numero;
divisor:=0;
LOOP
if numero mod i=0 then
divisor:=divisor+1;
end if;
EXIT WHEN (i>numero);
i:=i+1;
end loop;
if (divisor=2) then
DBMS_OUTPUT.PUT_LINE('El numero '||Numero|| ' Es Primo');
Else
DBMS_OUTPUT.PUT_LINE('El numero '||Numero|| ' No es Primo');
END IF;
END;

Convertir numero fibonacci método WHILE.


DECLARE
numero1 number(10);
numero2 number(10);
suma number(8);
serie number(10);
i number:=0;

BEGIN
serie:=:serie;
numero1:= 1;
numero2:=0;
suma:=0;
WHILE i<serie LOOP
DBMS_OUTPUT.put_line(suma);
suma:=numero1+numero2;
numero1:=numero2;
numero2:=suma;
i:=i+1;
END LOOP;
END;
Binario con For.
declare
Binario varchar2(64);
Numero number(5);
begin
Numero:=:Numero;

for i in 0..Numero loop

Binario:= mod(Numero, 2) || Binario;


Numero := trunc(Numero / 2);
end loop;
dbms_output.put_line( 'El numero binario es ' ||Binario);
End;

*Declare
Cursor Recorrer is select * from Tabla_X;
Datos Tabla_X%Rowtype;
Acumulador number:=0;
V_Promedio number:=0;
Contador number:=0;

Begin
Open Recorrer;
fetch Recorrer into Datos;
while Recorrer%Found loop
Acumulador:=Acumulador + Datos.ur;
Contador:=Contador + 2;
Fetch Recorrer into Datos;
End loop;
V_Promedio:= Acumulador/Contador;
Dbms_output.put_line(V_Promedio);
Close Recorrer;
End;

Ejercicio
Realizar un procedimiento sobre la tabla X que permita intercambiar los valores de la siguiente
forma:

El primero con el segundo, el tercero con el 4to, y el quinto con el sexto.

Hallar el valor minimo y el valor máximo de la tabla X sin utilizar las funciones Max ni Min:

declare

cursor recorre is

select * from Tabla_X;

Datos Tabla_X%RowType;

mayor number:=0;

minimo number:=99;

Begin

open recorre;

fetch recorre into Datos;

while recorre%found loop

if mayor<Datos.Ur then

mayor:=Datos.Ur;

elsif minimo>Datos.Ur then


minimo:=Datos.Ur;

end if;

fetch recorre into Datos;

end loop;

Dbms_output.put_line('El numero mayor es: '||mayor|| ' Y el numero menor es: '||minimo);

close recorre;

end;

Mostrar invertidos los valores de la tabla_X sin modificar en la tabla:

Primeros Ok!!
Realizar un procedimiento sobre la tabla_x -que permita intercambiar los
valores de la siguiente forma.

Números repetidos en TABLA_X y TABLA_Y


SELECT Vr from TABLA_X
INTERSECT
SELECT Vr from TABLA_Y;
SELECT Vr from TABLA_X
UNION
SELECT Vr from TABLA_Y;
SELECT Vr from TABLA_X
MINUS
SELECT Vr from TABLA_Y;

IMPAR

Ejemplo Números Pares.


DECLARE
Cursor C1 is select* from TABLA_X;
Cursor C2 is select*from TABLA_X;
Datos1 TABLA_X%Rowtype;
Datos2 TABLA_X%Rowtype;
BEGIN OPEN C1;
OPEN C2;
FETCH C1 INTO Datos1;
FETCH C2 INTO Datos2;
FETCH C2 INTO Datos2;
WHILE C1% FOUND LOOP
UPDATE TABLA_X set Vr=Datos2.Vr
WHERE cod_tablaX=Datos1.cod_tablaX;
UPDATE TABLA_X set Vr=Datos1.Vr
WHERE cod_tablaX= Datos2.cod_tablaX;
FETCH C1 INTO Datos1;
FETCH C1 INTO Datos1;
FETCH C2 INTO Datos2;
IF C2%FOUND THEN
FETCH C2 INTO Datos2;
END IF;
END LOOP;
CLOSE C1;
CLOSE C2;
END;

DECLARE
Cursor C1 is select* from TABLA_X;
Cursor C2 is select*from TABLA_X;
Datos1 TABLA_X%Rowtype;
Datos2 TABLA_X%Rowtype;
BEGIN OPEN C1;
OPEN C2;
FETCH C1 INTO Datos1;
FETCH C2 INTO Datos2;
FETCH C2 INTO Datos2;
WHILE C1% FOUND LOOP
IF C2% FOUND THEN
UPDATE TABLA_X set Vr=Datos2.Vr
WHERE cod_tablaX=Datos1.cod_tablaX;
UPDATE TABLA_X set Vr=Datos1.Vr
WHERE cod_tablaX= Datos2.cod_tablaX;
IF C2%FOUND THEN
FETCH C1 INTO Datos1;
FETCH C1 INTO Datos1;
FETCH C2 INTO Datos2;
IF C2%FOUND THEN
FETCH C2 INTO Datos2;
END IF;
END IF;
END IF;
END LOOP;
CLOSE C1;
CLOSE C2;
END;
DECLARE
Cursor recorre is Select Vr from TABLA_X;
numero TABLA_X.Vr%Type;
primo number:=0;
i number:=2;
BEGIN
Open recorre;
Fetch recorre into numero;
WHILE recorre%found loop
If mod(numero,i)=0 then
primo:=primo+1;
elsif mod(numero,i)!=0 then
primo:=primo;
end if;
if primo<1 and numero!=1 or numero=2 then
DBMS_OUTPUT.PUT_LINE(numero || ': es primo');
Else
DBMS_OUTPUT.PUT_LINE(numero || ': no es primo');
End if;
Fetch recorre into numero;
primo:=0;
end loop;
close recorre;
end;
EJEMPLO 1

create or replace function f_incremento (avalor number, aincremento number)


return number
is
begin
return avalor+(avalor*aincremento/100);
end;

Llamado:
select titulo,precio,f_incremento(precio,20) from libros;

EJEMPLO 2
create or replace function f_costoso (avalor number)
return varchar2
is
valorretornado varchar2(20);
begin
valorretornado:='';
if avalor<=20 then
valorretornado:='economico';
else valorretornado:='costoso';
end if;
return valorretornado;
end;

Llamado:

select titulo,precio,f_costoso(precio) from libros;


create or replace function f_mantenimiento (cod_avi number)

return varchar2

is

Cursor recorre_avion is

Select * from Avion where cod_avi=Avion.Cod_Avion;

retorno Varchar2(50);

datos Avion%rowtype;

cant Vuelo.Cod_Vuelo%type;

peso_max number:=(DBMS_RANDOM.VALUE(10000,100000));

volumen_max number:=(DBMS_RANDOM.VALUE(10,20));

peso_min number:=(DBMS_RANDOM.VALUE(1000,9999));

volumen_min number:=(DBMS_RANDOM.VALUE(5,9));

begin

Open recorre_avion;

fetch recorre_avion into datos;

while recorre_avion%found loop

select count(Cod_Vuelo) into cant from Vuelo,Avion where Fecha<Sysdate and


Vuelo.Cod_Avion=cod_avi and cod_avi=Datos.Cod_Avion and Avion.Cod_Avion=cod_avi ;

if cant>=0 and cant<=50 then

retorno:='El avion necesita un mantenimiento regular';

elsif cant>50 and cant<=150 then

retorno:='El avion necesita un mantenimiento regular';

elsif cant>150 then

retorno:='El avion necesita un mantenimiento regular';

insert into Avion_Carga


values(Datos.Cod_Avion,peso_max,volumen_max,peso_min,volumen_min);

Delete from Avion_Pasajeros where cod_avi=Datos.Cod_Avion;

Update Avion set Tipo='Carga' where cod_avi=Datos.Cod_Avion;


end if;

fetch recorre_avion into datos;

end loop;

close recorre_avion;

return retorno;

end;

TALLER PROCEDIMIENTOS Y FUNCIONES 411 (PL/SQL) 


 
1. Elaborar un procedimiento que a través del llamado de funciones y
procedimientos determine con la lectura del radio de un circulo su área, su
perímetro, su diámetro. 
 
2. Elaborar un procedimiento que a través de procedimientos y funciones
determine la clasificación de un triángulo dados los ángulos por teclados. (Tener en
cuenta la comprobación de que es un triángulo. 
 
3. Realizar a través de procedimientos y funciones el cálculo de la nómina de todos
los tripulantes de la organización (No pilotos), teniendo en cuenta de que estos
reciben como salario básico 3 salarios mínimos más un 5% de acuerdo con la
cantidad de vuelos que tienen siempre y cuando estos superen los 5 vuelos. Se debe
mostrar el listado de los tripulantes con su correspondiente futuro pago.  
 
4. Realizar un procedimiento que a través de otros procedimientos y funciones
determine los mantenimientos que se debe hacer a los aviones de acuerdo a los
siguientes parámetros: 
 
0 – 7: “No requiere mantenimiento.” 
8 – 15: “Mantenimiento regular.” 
16 - ….. /Supera las 10000 Millas recorridas: “Mantenimiento exhaustiva” 

Solución. Del Taller. 03/11/22


2-. Create or replace function determinar_triangulo(Angulo1 number,Angulo2
number,Angulo3 number)
return Varchar2
is
Triangulo Varchar2(13);
Tipo Varchar2(30);
Total number(3);
Ang number(3);
resp varchar2(100);
Begin
Ang:=180;
Total:=angulo1+angulo2+angulo3;
if Angulo1=0 or Angulo2=0 or Angulo3=0 then Triangulo:='NO';
elsif Total=Ang then Triangulo:='Triangulo';
else Triangulo:='NO';
end if;
if Triangulo='Triangulo' then
if Angulo1=Angulo2 and Angulo1=Angulo3 then Tipo:='Equilatero isoceles';
Elsif Angulo1!=Angulo2 and Angulo1!=Angulo3 and Angulo2!=Angulo3 and Angulo1=90
or Angulo2=90 or Angulo3=90 then Tipo:='Rectangulo Escaleno';
Elsif Angulo1!=Angulo2 and Angulo1!=Angulo3 and Angulo2!=Angulo3 then
Tipo:='Escaleno';
Elsif Angulo1=Angulo2 or Angulo1=Angulo3 or Angulo2=Angulo3 and Angulo1=90 or
Angulo2=90 or Angulo3=90 then Tipo:='Rectangulo Isoceles';
Elsif Angulo1=Angulo2 or Angulo1=Angulo3 or Angulo2=Angulo3 then
Tipo:='Isoceles';
End if;
resp:=('El triangulo es '||tipo);
Else
resp:=('No es triangulo');
End if;
return resp;
end;

declare
Angulo1 number(3);
Angulo2 number(3);
Angulo3 number(3);
resp Varchar2(100);
begin
Angulo1:=:Angulo1;
Angulo2:=:Angulo2;
Angulo3:=:Angulo3;
resp:= determinar_triangulo(Angulo1,Angulo2,Angulo3);
Dbms_output.put_line(resp);
end;

3- create or replace procedure calculo_nomina

as
retorno number:=0;
Cursor recorre_tripulacion is
Select * from Tripulacion where tipo<>'Piloto';
datos Tripulacion%rowtype;
cant Detalle_Tripulantes.Cod_Vuelo%type;
begin
Open recorre_tripulacion;
fetch recorre_tripulacion into datos;
while recorre_tripulacion%found loop
select count(Cod_Vuelo) into cant from Detalle_Tripulantes where
Detalle_Tripulantes.Cod_Tripulante=Datos.Cod_Tripulacion;
if cant>5 then
retorno:=(3000000*1.05);
else retorno:=3000000;
end if;
CC:=Datos.CC;
Dbms_output.put_line('El tripulante con cedula: '||CC);
Dbms_output.put_line('Tiene una nomina de: '||retorno);end loop;
close recorre_tripulacion;
end;

begin
calculo_nomina;
end;

1- Create or replace function calcular_cir(radio number)


return Varchar2
is
perimetro number:=0;
diametro number:=0;
area number:=0;
resp Varchar2(100);
begin
perimetro:=(2*3.1416)*radio;
diametro:=(perimetro/3.1416);
area:=(3.1416*(radio*radio));
resp:='El perimetro del circulo es: '||perimetro||'. El diametro el circulo es: '||
diametro||'. El area del circulo es: '||area;
return resp;
end;

4- create or replace procedure calculo_mantenimiento

as
retorno varchar2(70);
Cursor recorre_avion is
Select * from Avion;
datos Avion%rowtype;
cant Vuelo.Cod_Vuelo%type;
begin
Open recorre_avion;
fetch recorre_avion into datos;
while recorre_avion%found loop
select count(Cod_Vuelo) into cant from Vuelo,Avion where Fecha<Sysdate and
Vuelo.Cod_Avion=Avion.Cod_Avion and Avion.Cod_Avion=Datos.Cod_Avion;
if cant>=0 and cant<=7 then
Dbms_output.put_line('El avion no requiere mantenimiento, Cod: '||Datos.Cod_Avion);
elsif cant>7 and cant<=15 then
Dbms_output.put_line('El avion necesita un mantenimiento regular, Cod: '||
Datos.Cod_Avion);
elsif cant>15 then
Dbms_output.put_line('El avion necesita un mantenimiento exhaustivo, Cod: '||
Datos.Cod_Avion);
end if;
fetch recorre_avion into datos;
end loop;
close recorre_avion;
end;

begin
calculo_mantenimiento
end;

También podría gustarte