Está en la página 1de 9

Taller F/P

Bases de Datos 2

Daniela Zuñiga Pino 2200625


Roxana Reina Sánchez 2205049

1. Realice un procedimiento almacenado (usando cursores) con nombre P_MONITOREA_TS el


cual, cada que se ejecute, alimente una tabla con nombre T_MONITOREA_TS y contenga la
siguiente información:

- Nombre del tablespace


- Tamaño expresado en MB
- Estado
- Ubicación del datafile
- Fecha (en formato dd-mon-yyyy
- Hora (en formato hh:mi:ss)

R//

● SQLPLUS DZUNIGA/dzuniga
● SQLPLUS Roxana11/oracle11g
● sqlplus */ as sysdba
● SET SERVEROUTPUT ON
● SET LINE 1000;
● SET PAGES 1000;
● CREATE TABLE T_MONITOREA_TS as
select b.name, b.bigfile, a.bytes/(1024*1024) mb, c.status, a.file_name,
TO_CHAR(SYSDATE, ‘dd-mon-yyyy’) fecha,
TO_CHAR(SYSDATE, ‘hh:mi:ss’) hora
from dba_data_files a, v$tablespace b, dba_tablespaces c
where a.tablespace_name=b.name and a.tablespace_name=c.tablespace_name;
● select * from T_MONITOREA_TS;
● delete from T_MONITOREA_TS WHERE BIGFILE='YES';
● delete from T_MONITOREA_TS WHERE BIGFILE='NO';

GRANT SELECT ON DBA_DATA_FILES TO Roxana11;


GRANT SELECT ON DBA_TABLESPACES TO Roxana11;

CREATE OR REPLACE PROCEDURE P_MONITOREA_TS


AS
CURSOR C1 IS
SELECT C.TABLESPACE_NAME, C.BIGFILE, A.BYTES/(1024*1024) MB, C.STATUS,
A.FILE_NAME
FROM SYS.DBA_DATA_FILES A,
SYS.DBA_TABLESPACES C
WHERE A.TABLESPACE_NAME=C.TABLESPACE_NAME;
BEGIN
FOR ITEM IN C1
LOOP
INSERT INTO T_MONITOREA_TS VALUES
( ITEM.TABLESPACE_NAME,
ITEM.BIGFILE,
ITEM.MB,
ITEM.STATUS,
ITEM.FILE_NAME,
TO_CHAR(SYSDATE, ‘DD-MON-YYYY’),
TO_CHAR(SYSDATE, ‘HH:MI:SS’) );
END LOOP;
COMMIT;
END;
/

2. Sobre la tabla del punto anterior, cree un trigger con nombre TR_AUD_INS_TS que alimente
una tabla de auditoría llamada AUDIT_TS_CREA cada que se creen registros nuevos en la
tabla T_MONITOREA_TS (la misma del punto anterior) con la siguiente información.
Tambien que audite si se modifica el valor del tamaño del tablespace hacia arriba.

● Nombre del tablespace


● Estado
● Tamaño original del TS
● Nuevo tamaño del TS
● Usuario
● Fecha y hora (en formato dd/mm/yyyy hh:mi)

R//

create table AUDIT_TS_CREA


(nombre VARCHAR2(100),
estado VARCHAR2(20),
tam_original_ts NUMBER,
tam_nuevo_ts NUMBER,
usuario VARCHAR2(20),
fecha_hora VARCHAR2(20) );

create or replace trigger TR_AUD_INS_TS


before insert or update of mb on T_MONITOREA_TS
for each row
begin
if INSERTING then
insert into AUDIT_TS_CREA values
(:new.name, :new.status,:old.mb, :new.mb, user,
TO_CHAR(SYSDATE, ‘ dd/mm/yyyy hh:mi’) );
else
if (:old.mb < :new.mb) THEN
insert into AUDIT_TS_CREA VALUES
(:old.name, :old.status, :old.mb, :new.mb, user,
TO_CHAR(SYSDATE, ‘ dd/mm/yyyy hh:mi’) );
end if;
end if;
end;
/

UPDATE T_MONITOREA_TS
SET mb=100
WHERE name= ‘TS_UAO2’;

SELECT * FROM

3. Teniendo en cuenta el siguiente cuadro de divisas internacionales y su valor en pesos


colombianos:

DIVISA NOMENCLATURA VALOR


Libras GBP 4.837,74
Dólar USD 3.882,27
Euro EUR 4.222,66
Yuan CNY 549,78

A) Realice una función con nombre F_CONVIERTE_A que retorne la cantidad en pesos
al ingresar como parámetros la nomenclatura de la divisa y el valor a convertir.
B) Encuentre una forma de realizar la misma función con nombre F_CONVIERTE_B,
de forma tal que los valores y las divisas de cambio sean parametrizables (convierta
la lista anterior en una tabla).

R//

A)
create or replace function F_CONVIERTE_A (nom_divisa IN VARCHAR2, valor IN NUMBER)
return NUMBER
is
total NUMBER:= 0;
BEGIN
CASE nom_divisa
WHEN 'GBP' THEN
total := valor * 4837.74;
DBMS_OUTPUT.PUT_LINE('La cantidad en pesos al ingresar como parámetros '||
valor||' '||nom_divisa||' es: '||total);
WHEN 'USD' THEN
total := valor * 3882.27;
DBMS_OUTPUT.PUT_LINE('La cantidad en pesos al ingresar como parámetros '||
valor||' '||nom_divisa||' es: '||total);
WHEN 'EUR' THEN
total := valor * 4222.66;
DBMS_OUTPUT.PUT_LINE('La cantidad en pesos al ingresar como parámetros '||
valor||' '||nom_divisa||' es: '||total);
WHEN 'CNY' THEN
total := valor * 549.78;
DBMS_OUTPUT.PUT_LINE('La cantidad en pesos al ingresar como parámetros '||
valor||' '||nom_divisa||' es: '||total);
ELSE
DBMS_OUTPUT.PUT_LINE('No existe esa nomenclatura de la divisa');
END CASE;
RETURN(total);
END;
/

● select F_CONVIERTE_A(‘GBP’, 5) conversion1, F_CONVIERTE_A(‘CNY’, 5) conversion2,


F_CONVIERTE_A(‘EUR’, 5) conversion3, F_CONVIERTE_A(‘USD’, 5) conversion4 from
dual;
B)

create table DIVISA


(divisa VARCHAR2(100),
nomenclatura VARCHAR2(20),
valor NUMBER);

INSERT INTO DIVISA VALUES('Libras', ‘GBP’, 4837.74 );


INSERT INTO DIVISA VALUES('Dólar', ‘USD’, 3882.27 );
INSERT INTO DIVISA VALUES('Euro', ‘EUR’, 4222.66 );
INSERT INTO DIVISA VALUES('Yuan', ‘CNY’, 549.78 );

select * from DIVISA;


create or replace function F_CONVIERTE_B (nom_divisa IN VARCHAR2, valor1 IN NUMBER)
return NUMBER
is
total NUMBER:= 0;
valorhoy NUMBER:= 0;
BEGIN
Select valor INTO valorhoy from divisas where nomenclatura = ‘nom_divisa’;
CASE nom_divisa
return NUMBER
Is
tasa NUMBER(20,2) := 0;
pesos NUMBER(20,2) := 0;
begin
select valor into valor hoy from divisas where nomenclatura = nomenc;
pesos := val*tasa;
RETURN(total);
end;
/

● select F_CONVIERTE_B(‘GBP’, 5)conversion1 from dual;


● select F_CONVIERTE_A(‘GBP’, 5) conversion1, F_CONVIERTE_A(‘CNY’, 5) conversion2,
F_CONVIERTE_A(‘EUR’, 5) conversion3, F_CONVIERTE_A(‘USD’, 5) conversion4 from
dual;
4. Cree la tabla EMPLEADOS en su propio esquema basado en la tabla EMPLOYEES del
esquema HR. Cree un procedimiento que ante uno de los siguientes 3 parametros de entrada
liste (con dbms_output) la información de los primeros n empleados ordenados:
● 1: informacion basica (nombre, apellido, employee_id (cedula) y telefono)
● 2: antiguedad (nombre, apellido, email y antiguedad en años)
● 3: salarial (nombre, apellido, salario, comisiones, salario total
[salario+salario*comisiones])

● CREATE TABLE EMPLEADOS as


select * from hr.employees;

CREATE OR REPLACE PROCEDURE P4( N INT, NUM INT)


AS
CURSOR C1 IS
SELECT FIRST_NAME, LAST_NAME, EMPLOYEE_ID, PHONE_NUMBER
FROM EMPLEADOS;
CURSOR C2 IS
SELECT FIRST_NAME, LAST_NAME, EMAIL, (SYSDATE- HIRE_DATE )/365 TIME
FROM EMPLEADOS;
CURSOR C3 IS
SELECT FIRST_NAME, LAST_NAME, SALARY, COMMISSION_PCT, (SALARY+
(SALARY*COMMISSION_PCT)) TOTAL
FROM EMPLEADOS;
COUNTER NUMBER := 0;
nombre empleados.first_name%TYPE;
apellido empleados.last_name%TYPE;
cedula empleados.employee_id%TYPE;
telefono empleados.phone_number%TYPE;
correo empleados1.email%TYPE;
antiguedad number:=0;
salario number:=0;
comision number:=0;
salario_total number :=0;
BEGIN
CASE NUM
WHEN 1 THEN
OPEN C1;
FETCH C1 INTO nombre, apellido, cedula, telefono ;
WHILE (C1% FOUND) and (N>COUNTER)
LOOP
COUNTER :=COUNTER+1;
DBMS_OUTPUT.PUT_LINE(‘Nombre: ’|| nombre ||‘, Apellido: ’||
apellido||‘, Cedula: ’|| cedula||‘, Telefono: ’|| telefono);
END LOOP;
CLOSE C2;
WHEN 2 THEN
OPEN C2;
FETCH C2 INTO nombre, apellido, correo, antiguedad;
WHILE (C2% FOUND) and (N>COUNTER)
LOOP
COUNTER :=COUNTER+1;
DBMS_OUTPUT.PUT_LINE(‘Nombre: ’|| nombre ||‘, Apellido: ’||
apellido||‘, Correo: ’|| correo||‘, Antiguedad: ’|| antiguedad);
END LOOP;
CLOSE C2;
WHEN 3 THEN
OPEN C3;
FETCH C3 INTO nombre, apellido, salario, comision, salario_total;
WHILE (C3% FOUND) and (N>COUNTER)
LOOP
COUNTER :=COUNTER+1;
DBMS_OUTPUT.PUT_LINE(‘Nombre: ’|| nombre ||‘, Apellido: ’||
apellido||‘, Salario: ’|| salario||‘, Comision: ’|| comision|| ‘, Salario Total: ’||
salario_total);
END LOOP;
CLOSE C3;
ELSE
DBMS_OUTPUT.PUT_LINE(‘NO EXISTE EL PARAMETRO
INGRESADO’);
END CASE;
END;
/

También podría gustarte