Logo Studenta

SandovalCastroTellezGonzalez_PC12 - Jorge González

¡Este material tiene más páginas!

Vista previa del material en texto

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
FACULTAD DE INGENIERÍA
Bases de Datos (T)
Grupo: 05 - Semestre: 2022-1
Práctica Complementaria 12:
Programación con SQL. Parte 1.
FECHA DE ENTREGA: 21/12/2021
Profesor:
Rodríguez Campos Jorge Alberto Ing.
Alumnos:
Téllez González Jorge Luis
Sandoval Castro Josmar Leonardo
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
1. Objetivo
Poner en práctica los conceptos de programación PL/SQL para crear bloques anónimos,
procedimientos, disparadores (triggers) así como funciones creadas por el usuario.
2. C1. Código
Ejercicio 1: Auditoría de operaciones al catálogo de autos
--Autor: Jorge Luis Téllez González y Josmar Leonardo Sandoval Castro
--Fecha: 16/12/2021
--Descripción: Script del trigger tr_auto_auditoria.
/*create table auditoria_auto(
auditoria_auto_id number(10,0) not null constraint auditoria_auto_pk primary key,
fecha_evento date not null,
usuario varchar2(40) not null,
tipo_evento char not null,
precio_anterior number(9,2),
precio_actual number(9,2),
detalle_evento varchar2(2000) not null,
auto_id number(10,0)
);/*
drop table auditoria_auto;
/*create sequence auditoria_auto_seq
start with 1
increment by 1
cache 5
nocycle; */
create or replace trigger tr_auto_auditoria
after insert
or update
or delete
on auto
for each row
declare
v_auditoria_auto_id auditoria_auto.auditoria_auto_id%type;
v_fecha_evento auditoria_auto.fecha_evento%type;
v_tipo_evento auditoria_auto.tipo_evento%type;
v_precio_anterior auditoria_auto.precio_anterior%type;
v_precio_actual auditoria_auto.precio_actual%type;
v_detalle_evento auditoria_auto.detalle_evento%type;
v_auto_id auditoria_auto.auto_id%type;
BEGIN
case
when inserting then
1
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
select auditoria_auto_seq.nextval into v_auditoria_auto_id from dual;
select to_date(sysdate, 'DD/MM/YYYY HH24:MI:SS') into v_fecha_evento from dual;
v_precio_anterior:= null;
v_precio_actual:= :new.precio;
v_detalle_evento:= 'El usuario '
|| sys_context('USERENV', 'SESSION_USER')
|| ' ha creado un nuevo auto con fecha '
|| v_fecha_evento
|| ' con los siguientes valores: auto_id='
|| :new.auto_id
|| ', marca='
|| :new.marca
|| ', modelo='
|| :new.modelo
|| ', anio='
|| :new.anio
|| ', num_serie='
|| :new.num_serie
|| ', tipo='
|| :new.tipo
|| ', precio='
|| :new.precio;
if (:new.descuento is not null)
then
v_detalle_evento:=v_detalle_evento || ', descuento=' || (to_char(:new.descuento)) || ',
';
end if;
v_detalle_evento:=v_detalle_evento
|| 'fecha_status='
|| :new.fecha_status
|| ', status_auto_id='
|| :new.status_auto_id
|| ', agencia_id='
|| :new.agencia_id;
if (:new.cliente_id is not null)
then
v_detalle_evento:=v_detalle_evento || ', cliente_id' || (to_char(:new.cliente_id));
end if;
insert into auditoria_auto (auditoria_auto_id, fecha_evento, usuario, tipo_evento,
precio_anterior, precio_actual, detalle_evento, auto_id)
values(v_auditoria_auto_id, v_fecha_evento, sys_context('USERENV', 'SESSION_USER'), 'I',
v_precio_anterior, v_precio_actual, v_detalle_evento, :new.auto_id);
when updating then
select auditoria_auto_seq.nextval into v_auditoria_auto_id from dual;
select to_date(sysdate, 'DD/MM/YYYY HH24:MI:SS') into v_fecha_evento from dual;
v_precio_anterior:= :old.precio;
v_precio_actual:= :new.precio;
v_detalle_evento:= 'El usuario '
|| sys_context('USERENV', 'SESSION_USER')
|| ' ha actualizado los datos de un auto con fecha '
|| v_fecha_evento
|| '. Datos anteriores: ';
if (:old.marca!=:new.marca)
then
2
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
v_detalle_evento:=v_detalle_evento || 'marca: '||(to_char(:old.marca)) || ', ';
end if;
if (:old.modelo!=:new.modelo)
then
v_detalle_evento:=v_detalle_evento || 'modelo= '||(to_char(:old.modelo)) || ', ';
end if;
if (:old.anio!=:new.anio)
then
v_detalle_evento:=v_detalle_evento || 'anio= '|| (to_char(:old.anio)) || ', ';
end if;
if (:old.num_serie!=:new.num_serie)
then
v_detalle_evento:=v_detalle_evento || 'num_serie= '|| (to_char(:old.num_serie)) || ', ';
end if;
if (:old.tipo!=:new.tipo)
then
v_detalle_evento:=v_detalle_evento || 'modelo= '|| (to_char(:old.tipo)) || ', ';
end if;
if (:old.precio!=:new.precio)
then
v_detalle_evento:=v_detalle_evento || 'precio= '|| (to_char(:old.precio)) || ', ';
end if;
if (:old.descuento!=:new.descuento)
then
v_detalle_evento:=v_detalle_evento || 'descuento= '|| (to_char(:old.descuento)) || ',
';
end if;
if (:old.fecha_status!=:new.fecha_status)
then
v_detalle_evento:=v_detalle_evento || 'fecha_status= '|| (to_char(:old.fecha_status))
|| ', ';
end if;
if (:old.status_auto_id!=:new.status_auto_id)
then
v_detalle_evento:=v_detalle_evento || 'status_auto_id= '||
(to_char(:old.status_auto_id)) || ', ';
end if;
if (:old.agencia_id!=:new.agencia_id)
then
v_detalle_evento:=v_detalle_evento || 'agencia_id= '|| (to_char(:old.agencia_id)) || ',
';
end if;
if (:old.cliente_id!=:new.cliente_id)
then
v_detalle_evento:=v_detalle_evento || 'cliente_id= '|| (to_char(:old.cliente_id)) || ',
';
end if;
v_detalle_evento:=v_detalle_evento || '. Datos nuevos: ';
if (:old.marca!=:new.marca)
then
3
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
v_detalle_evento:=v_detalle_evento || 'marca: '||(to_char(:new.marca)) || ', ';
end if;
if (:old.modelo!=:new.modelo)
then
v_detalle_evento:=v_detalle_evento || 'modelo= '|| (to_char(:new.modelo)) || ', ';
end if;
if (:old.anio!=:new.anio)
then
v_detalle_evento:=v_detalle_evento || 'anio= '|| (to_char(:new.anio)) || ', ';
end if;
if (:old.num_serie!=:new.num_serie)
then
v_detalle_evento:=v_detalle_evento || 'num_serie= '|| (to_char(:new.num_serie)) || ',
';
end if;
if (:old.tipo!=:new.tipo)
then
v_detalle_evento:=v_detalle_evento || 'tipo= '|| (to_char(:new.tipo)) || ', ';
end if;
if (:old.precio!=:new.precio)
then
v_detalle_evento:=v_detalle_evento || 'precio= '|| (to_char(:new.precio)) || ', ';
end if;
if (:old.descuento!=:new.descuento)
then
v_detalle_evento:=v_detalle_evento || 'descuento= '|| (to_char(:new.descuento)) || ',
';
end if;
if (:old.fecha_status!=:new.fecha_status)
then
v_detalle_evento:=v_detalle_evento || 'fecha_status= '|| (to_char(:new.fecha_status))
|| ', ';
end if;
if (:old.status_auto_id!=:new.status_auto_id)
then
v_detalle_evento:=v_detalle_evento || 'status_auto_id= '||
(to_char(:new.status_auto_id)) || ', ';
end if;
if (:old.agencia_id!=:new.agencia_id)
then
v_detalle_evento:=v_detalle_evento || 'agencia_id= '|| (to_char(:new.agencia_id)) || ',
';
end if;
if (:old.cliente_id!=:new.cliente_id)
then
v_detalle_evento:=v_detalle_evento || 'cliente_id= '|| (to_char(:new.cliente_id)) || ',
';
end if;
if (v_precio_anterior!=v_precio_actual) then
insert into auditoria_auto (auditoria_auto_id, fecha_evento, usuario, tipo_evento,
precio_anterior, precio_actual, detalle_evento, auto_id)
4
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
values(v_auditoria_auto_id,v_fecha_evento, sys_context('USERENV', 'SESSION_USER'), 'U',
v_precio_anterior, v_precio_actual, v_detalle_evento, :new.auto_id);
else
insert into auditoria_auto (auditoria_auto_id, fecha_evento, usuario, tipo_evento,
precio_actual, detalle_evento, auto_id)
values(v_auditoria_auto_id, v_fecha_evento, sys_context('USERENV', 'SESSION_USER'),
'U', v_precio_actual, v_detalle_evento, :new.auto_id);
end if;
when deleting then
select auditoria_auto_seq.nextval into v_auditoria_auto_id from dual;
select to_date(sysdate, 'DD/MM/YYYY HH24:MI:SS') into v_fecha_evento from dual;
v_precio_anterior:= :old.precio;
v_precio_actual:= null;
v_detalle_evento:= 'El usuario '
|| sys_context('USERENV', 'SESSION_USER')
|| ' ha eliminado los datos de un auto con fecha '
|| v_fecha_evento
|| '. Datos del auto eliminado: auto_id='
|| :old.auto_id
|| ', marca='
|| :old.marca
|| ', modelo='
|| :old.modelo
|| ', anio='
|| :old.anio
|| ', num_serie='
|| :old.num_serie
|| ', tipo='
|| :old.tipo
|| ', precio='
|| :old.precio;
if (:old.descuento is not null)
then
v_detalle_evento:=v_detalle_evento || ', descuento=' || (to_char(:old.descuento));
end if;
v_detalle_evento:=v_detalle_evento || ', fecha_status='
|| :old.fecha_status
|| ', status_auto_id='
|| :old.status_auto_id
|| ', agencia_id='
|| :old.agencia_id;
if (:old.cliente_id is not null)
then
v_detalle_evento:=v_detalle_evento || ', cliente=' || (to_char(:old.cliente_id));
end if;
insert into auditoria_auto (auditoria_auto_id, fecha_evento, usuario, tipo_evento,
precio_anterior, detalle_evento, auto_id)
values(v_auditoria_auto_id, v_fecha_evento, sys_context('USERENV', 'SESSION_USER'), 'D',
v_precio_anterior, v_detalle_evento, :old.auto_id);
end case;
END;
/
show errors
5
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
Ejercicio 1: Script de prueba
--@Autor(es): Jorge Luis Téllez Gonzalez y Josmar Leonardo Sandoval Castro
--@Fecha creación: 18/21/2021
--@Descripción: Script de prueba para validar el trigger tr_auto_auditoria
set serveroutput on
/*PRUEBAS AUTOMATIZADAS PARA TRIGGERS*/
Prompt =======================================
Prompt Prueba 1.
prompt Insertando un registro válido (Un auto nuevo)
Prompt ========================================
--Insert de prueba para disparar el trigger de un auto recien
--insertado. Se espera la cadena indicando la inserción realizada.
insert into auto (auto_id, marca, modelo, anio, num_serie, tipo, precio, descuento, foto,
fecha_status, status_auto_id, agencia_id)
values(10001, 'TOYOTA', 'YARIS', '2009', '12345', 'P', 97000, 5, empty_blob(),
trunc(sysdate), 1, 1);
declare
v_auto_id auto.auto_id%type;
v_registro_encontrado number;
v_auditoria_auto_id auditoria_auto.auditoria_auto_id%type;
v_fecha_evento auditoria_auto.fecha_evento%type;
v_tipo_evento auditoria_auto.tipo_evento%type;
v_precio_anterior auditoria_auto.precio_anterior%type;
v_precio_actual auditoria_auto.precio_actual%type;
v_detalle_evento auditoria_auto.detalle_evento%type;
v_usuario auditoria_auto.usuario%type;
v_count number;
v_cadena_insercion auditoria_auto.detalle_evento%type;
begin
v_auto_id:=10001;
--validar que efectivamente el registro en auditoria_auto existe.
--Usa un bloque anónimo con los datos proporcionados del auto.
--Si count vale más que 0, el registro existe.
select count(*) into v_count
from auditoria_auto
where auto_id = v_auto_id;
if v_count > 0 then
dbms_output.put_line('OK, auditoria realizada.');
v_registro_encontrado:=1;
select auditoria_auto_id, fecha_evento, usuario, tipo_evento,
precio_anterior, precio_actual, detalle_evento
into v_auditoria_auto_id, v_fecha_evento, v_usuario, v_tipo_evento,
v_precio_anterior, v_precio_actual, v_detalle_evento
from auditoria_auto
where auto_id=v_auto_id;
if v_tipo_evento <> 'I' then
raise_application_error(-20001, 'El valor del campo tipo_evento es incorrecto, se obtuvo
' ||v_tipo_evento|| ', se esperaba I');
else
dbms_output.put_line('Valor para columna tipo_evento correcta.');
6
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
end if;
if v_usuario <> 'TGSC_P1201_AUTOS' then
raise_application_error(-20001, 'El valor del campo usuario es incorrecto, se obtuvo '
||v_usuario|| ', se esperaba tgsc_p1201_autos');
else
dbms_output.put_line('Valor para columna usuario correcta.');
end if;
else
--Si no se encuentra, lanza un error.
raise_application_error(-20001,'El registro auditado no se insertó. El trigger presenta
una anomalía.');
end if;
dbms_output.put_line('OK, prueba 1 exitosa');
end;
/
--validar que efectivamente el registro en auditoria_auto refleja
--el tipo de operacion de eliminación.
Prompt =======================================
Prompt Prueba 2.
prompt Insertando un registro válido (Un auto nuevo)
Prompt ========================================
delete from auto where auto_id=10001;
declare
v_auto_id auto.auto_id%type;
v_registro_encontrado number;
v_auditoria_auto_id auditoria_auto.auditoria_auto_id%type;
v_fecha_evento auditoria_auto.fecha_evento%type;
v_tipo_evento auditoria_auto.tipo_evento%type;
v_precio_anterior auditoria_auto.precio_anterior%type;
v_precio_actual auditoria_auto.precio_actual%type;
v_detalle_evento auditoria_auto.detalle_evento%type;
v_usuario auditoria_auto.usuario%type;
v_count number;
begin
select count(*) into v_count
from auditoria_auto
where auto_id = 10001
and tipo_evento='D';
if v_count > 0 then
dbms_output.put_line('OK, registro eliminado auditado.');
v_registro_encontrado:=1;
select auditoria_auto_id, fecha_evento, usuario, tipo_evento,
precio_anterior, precio_actual, detalle_evento
into v_auditoria_auto_id, v_fecha_evento, v_usuario, v_tipo_evento,
v_precio_anterior, v_precio_actual, v_detalle_evento
from auditoria_auto
where auto_id=10001
and tipo_evento='D';
if v_tipo_evento <> 'D' then
7
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
raise_application_error(-20001, 'El valor del campo tipo_evento es incorrecto, se obtuvo
' ||v_tipo_evento|| ', se esperaba D');
else
dbms_output.put_line('Valor para columna tipo_evento correcta.');
end if;
if v_usuario <> 'TGSC_P1201_AUTOS' then
raise_application_error(-20001, 'El valor del campo usuario es incorrecto, se obtuvo '
||v_usuario|| ', se esperaba tgsc_p1201_autos');
else
dbms_output.put_line('Valor para columna usuario correcta.');
end if;
else
--Si no se encuentra, lanza un error.
raise_application_error(-20001,'El registro auditado no se insertó. El trigger presenta
una anomalía.');
end if;
end;
/
show errors
rollback;
Ejercicio 2: Registro de autos nuevos
--@Autor: Jorge Luis Téllez Gonzalez y Josmar Leonardo Sandoval Castro
--@Fecha creación: 19/12/2021
--@Descripción: Script para insertar autos
create or replace procedure p_crea_auto(
p_auto_id in out number, p_marca in varchar2,
p_modelo in varchar2, p_anio in number,
p_num_serie in number, p_tipo in char,
p_precio in number, p_agencia_id in number,
p_num_cilindros in number, p_num_pasajeros in number,
p_clase in char, p_peso_maximo in number,
p_volumen in number, p_tipo_combustible in char
) is
v_status_auto_id auto.status_auto_id%type;
v_fecha_status auto.fecha_status%type;
begin
v_fecha_status:=sysdate;
v_status_auto_id:=2;
if ((p_num_cilindros is null or p_num_pasajeros is null or p_clase is null)
and p_tipo='P') then
raise_application_error(-20010, 'El auto es de tipo Particularpero no define
alguno de sus campos particulares');
end if;
if((p_peso_maximo is null or p_volumen is null or p_tipo_combustible is null)
and p_tipo='C') then
raise_application_error(-20010, 'El auto es de tipo Carga pero no define alguno de sus
campos particulares');
end if;
if((p_peso_maximo is not null or p_volumen is not null or p_tipo_combustible is not null)
and p_tipo='P') then
raise_application_error(-20010, 'El auto es de tipo Particular pero se definieron campos
de un auto de tipo Carga.');
8
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
end if;
if((p_num_pasajeros is not null or p_num_cilindros is not null or p_clase is not null)
and p_tipo='C') then
raise_application_error(-20010, 'El auto es de tipo Carga pero se definieron campos
de un auto de tipo Particular.');
end if;
select auto_seq.nextval into p_auto_id from dual;
case
when p_tipo='C' then
--Insertando en supertipo
insert into auto (auto_id, marca, modelo, anio, num_serie, tipo, precio,
foto, fecha_status, status_auto_id, agencia_id)
values(p_auto_id, p_marca, p_modelo, p_anio, p_num_serie, p_tipo,
p_precio, empty_blob(), v_fecha_status, v_status_auto_id, p_agencia_id);
--Insertando en subtipo
insert into auto_carga (auto_id, peso_maximo, volumen, tipo_combustible)
values(p_auto_id, p_peso_maximo, p_volumen, p_tipo_combustible);
--Insertando en el histórico
insert into historico_status_auto (historico_status_id, fecha_status, status_auto_id,
auto_id)
values (historico_status_auto_seq.nextval, v_fecha_status, v_status_auto_id,
p_auto_id);
when p_tipo='P' then
--Insertando en supertipo
insert into auto (auto_id, marca, modelo, anio, num_serie, tipo, precio,
foto, fecha_status, status_auto_id, agencia_id)
values(p_auto_id, p_marca, p_modelo, p_anio, p_num_serie, p_tipo,
p_precio, empty_blob(), v_fecha_status, v_status_auto_id, p_agencia_id);
--Insertando en subtipo
insert into auto_particular (auto_id, num_cilindros, num_pasajeros, clase)
values (p_auto_id, p_num_cilindros, p_num_pasajeros, p_clase);
--Insertando en el histórico
insert into historico_status_auto (historico_status_id, fecha_status,
status_auto_id, auto_id)
values (historico_status_auto_seq.nextval, v_fecha_status, v_status_auto_id,
p_auto_id);
else
raise_application_error(-20010, 'Se ingresó un tipo de auto no válido.');
end case;
end;
/
show errors
Ejercicio 2: Script de prueba
--@Autor: Jorge Luis Téllez Gonzalez y Josmar Leonardo Sandoval Castro
--@Fecha creación: 19/12/2021
--@Descripción: Script para insertar autos pruebas
set serveroutput on
Prompt =======================================
Prompt Prueba 1.
prompt Insertando un nuevo auto de tipo Particular válido
Prompt ========================================
9
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
declare
v_auto_id auto.auto_id%type;
v_2 varchar2(4000);
v_count number;
begin
p_crea_auto(v_auto_id,'Ford','Mustang',2018,'148697884','P',150000,2,2,12,'A',null,null,null);
select count(*) into v_count
from auto
where auto_id = v_auto_id
and tipo = 'P';
if v_count > 0 then
dbms_output.put_line('OK, auto registrado exitosamente');
else
--Si no se encuentra, lanza un error.
raise_application_error(-20010,'El registro no se insertó en la tabla.');
end if;
dbms_output.put_line('Prueba exitosa de auto con id: '||v_auto_id);
rollback;
end;
/
Prompt =======================================
Prompt Prueba 2.
prompt Insertando un nuevo auto de tipo Particular invalido
Prompt ========================================
declare
v_auto_id auto.auto_id%type;
v_2 varchar2(4000);
v_count number;
begin
p_crea_auto(v_auto_id,'Ford','Mustang',2018,'148697884','P',150000,null,null,null,null,null,12
,null);
dbms_output.put_line('Auto creado con éxito, id: '||v_auto_id);
rollback;
end;
/
Prompt =======================================
Prompt Prueba 3.
prompt Insertando un nuevo auto de tipo Particular que también definió campos de Carga
Prompt ========================================
declare
v_auto_id auto.auto_id%type;
begin
p_crea_auto(v_auto_id,'Ford','MUSTANG',2018,'148697884','P',150000,2,2,12,'A',1000,125,'D');
dbms_output.put_line('Auto creado con éxito, id: '||v_auto_id);
end;
/
Prompt =======================================
Prompt Prueba 4.
prompt Insertando un nuevo auto de tipo Carga valido
Prompt ========================================
declare
v_auto_id auto.auto_id%type;
v_2 varchar2(4000);
v_count number;
begin
10
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
p_crea_auto(v_auto_id,'Nissan','Urvan',2003,'454891321','C',200000,2,null,null,null,120000,500
,'D');
dbms_output.put_line('Auto creado con éxito, id: '||v_auto_id);
select count(*) into v_count
from auto
where auto_id = v_auto_id
and tipo = 'C';
if v_count > 0 then
dbms_output.put_line('OK, auto registrado exitosamente');
else
--Si no se encuentra, lanza un error.
raise_application_error(-20010,'El registro no se insertó en la tabla. Verifique su
inserción.');
end if;
rollback;
end;
/
Prompt =======================================
Prompt Prueba 5.
prompt Insertando un nuevo auto de tipo Carga invalido
Prompt ========================================
declare
v_auto_id auto.auto_id%type;
begin
p_crea_auto(v_auto_id,'Ford','Mustang',2018,'148697884','C',150000,2,null,10,null,null,null,nu
ll);
dbms_output.put_line('Auto creado con éxito, id: '||v_auto_id);
end;
/
Prompt =======================================
Prompt Prueba 6.
prompt Insertando un nuevo auto de tipo Carga valido pero con campos de Particular adicionales
Prompt ========================================
declare
v_auto_id auto.auto_id%type;
begin
p_crea_auto(v_auto_id,'Nissan','Urvan',2003,'454891321','C',200000,2,2,10,'A',120000,500,'D');
dbms_output.put_line('Auto creado con éxito, id: '||v_auto_id);
end;
/
Prompt =======================================
Prompt Prueba 7.
prompt Insertando un nuevo auto con datos invalidos
Prompt ========================================
Prompt insertando un nuevo auto con datos invalidos
declare
v_auto_id auto.auto_id%type;
begin
p_crea_auto(v_auto_id,'Nissan','Urvan',2003,'454891321','A',200000,2,null,null,null,null,null,
null);
dbms_output.put_line('Auto creado con éxito, id: '||v_auto_id);
end;
/
rollback;
11
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
Ejercicio 3: Función para exportar autos
--@Autor: Jorge Luis Téllez Gonzalez y Josmar Leonardo Sandoval Castro
--@Fecha creación: 19/12/2021
--Descripción: Script de los ejercicios de la PC12. Función de exportar datos.
create or replace function exporta_datos_auto_csv_fx(
p_auto_id number, p_num_pago number
) return varchar2 is
--Declaración de variables
v_cadena varchar2(4000);
v_num_serie auto.num_serie%type;
v_tipo auto.tipo%type;
v_precio auto.precio%type;
v_num_cilindros auto_particular.num_cilindros%type;
v_peso_maximo auto_carga.peso_maximo%type;
v_importe_pago pago_auto.importe%type;
v_email_cliente cliente.email%type;
BEGIN
select a.num_serie, a.tipo, a.precio, apa.num_cilindros,
ac.peso_maximo, pa.importe, c.email
into v_num_serie, v_tipo, v_precio, v_num_cilindros, v_peso_maximo,
v_importe_pago, v_email_cliente
from auto aleft join auto_particular apa
on apa.auto_id=a.auto_id
left join auto_carga ac
on ac.auto_id=a.auto_id
join pago_auto pa
on pa.auto_id=a.auto_id
left join cliente c
on c.cliente_id=a.cliente_id
where a.auto_id=p_auto_id
and pa.num_pago=p_num_pago;
--Generacion de la cadena concatenada con el resultado de la consulta.
v_cadena:= p_auto_id
|| ','|| v_num_serie || ',' || v_tipo
|| ','|| v_precio || ',' || p_num_pago
|| ','|| nvl(to_char(v_num_cilindros), 'N/A')
|| ','|| nvl(to_char(v_peso_maximo), 'N/A')
|| ','|| v_importe_pago
|| ','|| nvl(v_email_cliente, 'N/A');
return v_cadena;
--Cachar una excepcion por un registro invalido.
EXCEPTION
when NO_DATA_FOUND then
return '';
when others then
raise;
END;
/
show errors
Ejercicio 3: Script de prueba
--@Autor: Jorge Luis Téllez Gonzalez y Josmar Leonardo Sandoval Castro
12
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
--@Fecha creación: 19/12/2021
--@Descripción: Bloque anonimo para prueba de exportar en formato csv
Prompt =======================================
Prompt Prueba 1.
prompt Las cadenas coinciden
Prompt ========================================
set serveroutput on
Prompt generando reportes CSV
declare
v_cadena_obtenida varchar(4000);
v_cadena_esperada varchar2(4000)
:='1,TFP850679QVMFN134222,P,233057.46,2,4,N/A,7109.37,kespada6e@aol.com';
begin
--invocar a la función
select exporta_datos_auto_csv_fx(1,2) into v_cadena_obtenida from dual;
-- comparar las cadenas
if v_cadena_esperada = v_cadena_obtenida then
dbms_output.put_line('OK, prueba exitosa');
else
raise_application_error(-20001,'Las cadenas no coinciden: Cadema esperada '
||v_cadena_esperada ||' Cadena obtenida:' ||v_cadena_obtenida);
end if;
end;
/
Prompt =======================================
Prompt Prueba 2.
prompt Las cadenas no coinciden
Prompt ========================================
set serveroutput on
Prompt generando reportes CSV
declare
v_cadena_obtenida varchar(4000);
v_cadena_esperada varchar2(4000)
:='1,TFP850679QVMFN134222,P,233057.46,2,4,N/A,7109.37,kespada6e@aol.com';
begin
--invocar a la función
select exporta_datos_auto_csv_fx(2,2) into v_cadena_obtenida from dual;
-- comparar las cadenas
if v_cadena_esperada = v_cadena_obtenida then
dbms_output.put_line('OK, prueba exitosa');
else
raise_application_error(-20001,'Las cadenas no coinciden: Cadema esperada '
||v_cadena_esperada ||' Cadena obtenida:' ||v_cadena_obtenida);
end if;
end;
/
3. C2. Ejecución
Ejercicio 1: Script de prueba
13
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
Ejercicio 2: Script de prueba
14
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
15
Facultad de Ingeniería Bases de Datos______________________________________________________________________________________________________________
Ejercicio 3: Script de prueba
4. Conclusiones
En esta primera parte de programación en PL/SQL se vieron los conceptos básicos y se puso en
práctica cada uno de ellos con diversos ejercicios que ayudaron a comprender de mejor manera.
Programar con PL/SQL no es del todo diferente a lo que conocemos de otros lenguajes, al inicio
si costó un poco comprender bien los conceptos, pero se logró cumplir el objetivo de la pŕactica.
Lo que más se nos complicó fue implementar correctamente el trigger y su prueba, pero se logró
resolver mediante diversas pruebas en donde nos surgían dudas de los resultados y ver como
funcionaba nuestro código.
16

Continuar navegando