Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
• 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;
BEGIN
cata:=:cata;
catb:=:catb;
hipotenusa:= sqrt(cata + catb);
DBMS_OUTPUT.put_line('La hipotenusa es igual a: '|| hipotenusa);
END;
• 1 – 30 caracteres alfanuméricos.
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;
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;
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.
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)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;
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;
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;
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;
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;
DECLARE
Numero number(14);
Divisor number(14);
BEGIN
Numero:=:Numero;
Divisor:=0;
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;
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;
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;
*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:
Hallar el valor minimo y el valor máximo de la tabla X sin utilizar las funciones Max ni Min:
declare
cursor recorre is
Datos Tabla_X%RowType;
mayor number:=0;
minimo number:=99;
Begin
open recorre;
if mayor<Datos.Ur then
mayor:=Datos.Ur;
end if;
end loop;
Dbms_output.put_line('El numero mayor es: '||mayor|| ' Y el numero menor es: '||minimo);
close recorre;
end;
Primeros Ok!!
Realizar un procedimiento sobre la tabla_x -que permita intercambiar los
valores de la siguiente forma.
IMPAR
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
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:
return varchar2
is
Cursor recorre_avion is
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;
end loop;
close recorre_avion;
return retorno;
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;
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;
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;