Descarga la aplicación para disfrutar aún más
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
Compartir