You are on page 1of 20

Universidad Nacional De Costa Rica Facultad de Ciencias Exactas EXAMEN 2

'Diseo e Implementacin de Bases de Datos'

Profesor: Johnny Villalobos Murillo Integrantes: -Ronald Pineda Cartn. -David Contreras Ziga. - Stephanie Carvajal Garca.

05/6/11
Pregunta 1 (50% )

Uno de los aspectos ms importantes relacionados con el lenguaje de consultas estructuradas SQL, es la facilidad que brinda al usuario para manipular la informacin en las bases de datos relacionales, al ser este un lenguaje no procedimental el usuario se despreocupa de la implementacin de la solucin, es decir solo solicita la informacin y espera su respuesta, tal es el caso de la siguiente instruccin. Select * from t1, (1) la cual retorna el contenido de todas las columnas de la tabla t1. Suponga por un momento que el uso del asterisco no es permitido, entonces esta sentencia debera de ser planteada de la siguiente forma: select a,b,c,d from t1, para T1 (a, b, c, d). (2). Desarrolle en procedimiento o funcin almacenada que permita realizar la misma funcin de la sentencia (1), es decir implemente del operador (*), la funcin o procedimiento a desarrollar se llama asterisco. Suponiendo que es un procedimiento almacenado, este debe recibir como prametro la tabla que se desea consultar, como por ejemplo Exec asterisco ( t1); (3) Algo importante de esta funcin es que debe funcionar para cualquier tabla de la base de datos ya sean tablas de usuario o tablas del diccionario de datos. Para hacer la prueba de esta funcin es necesario que construya una interfaz de usuario que permita conectarse, ejecutar la funcin y presentar los resultados, la cual debe crearse en cualquier lenguaje de programacin.

Script
CREATE OR REPLACE FUNCTION ASTERISCO(XTABLA NVARCHAR2) RETURN NVARCHAR2 IS ACTUAL NVARCHAR2(20); SQL_STR NVARCHAR2(2000); CURSOR C1 IS SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = XTABLA; BEGIN OPEN C1; FETCH C1 INTO ACTUAL; SQL_STR := 'SELECT '; WHILE C1%FOUND LOOP SQL_STR := SQL_STR||ACTUAL; FETCH C1 INTO ACTUAL; IF C1%FOUND THEN

SQL_STR := SQL_STR||' , '; END IF; END LOOP; SQL_STR := SQL_STR||' FROM '||XTABLA; RETURN SQL_STR; END;

Cdigo del Programa

using Oracle.DataAccess.Client; using System.Data; using System.Data.Odbc;

namespace examen { public partial class Examen : Form { public Examen() { InitializeComponent(); } private void btnOk_Click(object sender, System.EventArgs e) { String nombre_Tabla = this.campoTabla.Text.ToString(); nombre_Tabla=nombre_Tabla.ToUpper(); String connString = "User id=admin;Password=admin;"; OracleConnection conn = new OracleConnection(connString); conn.Open(); String comando = "SELECT ASTERISCO('" + nombre_Tabla + "') //MessageBox.Show(comando); OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = comando; cmd.CommandType = CommandType.Text; Object sentencia = cmd.ExecuteScalar(); cmd.CommandText = sentencia.ToString(); OracleDataReader reader = cmd.ExecuteReader(); int i; int h; string texto=""; if (reader.HasRows) while (reader.Read()) { h = int.Parse(reader.FieldCount.ToString());

FROM DUAL";

for (i = 0; i < h; i++) { if (reader.GetDataTypeName(i) == "Decimal") { texto += reader.GetOracleDecimal(i).ToString(); //aqu le ponen el tipo de dato que reciben de la BD (decimal, string, date etc) this.Sentencia.Text = comando; } if (reader.GetDataTypeName(i) == "Date") { texto += reader.GetOracleDate(i).ToString(); //qu le ponen el tipo de dato que reciben de la BD (decimal, string, date etc) this.Sentencia.Text = comando; } else { if (reader.GetDataTypeName(i) == "String") { texto += reader.GetOracleString(i).ToString(); //qu le ponen el tipo de dato que reciben de la BD (decimal, string, date etc) this.Sentencia.Text = comando; } } texto += " , ";

} texto += "\n";

} MessageBox.Show(texto, comando); reader.Close(); //Console.ReadKey(); } } }

Prueba

Se desea realizar la misma accin de la imagen anterior, pero sin utilizar el (*). Pantallazos

Ingreso de la Tabla TA1

Resultado de ver

Resultado de Sentencia

Prueba con tabla Receta

Resultado de ver

Resultado de Sentencia

Pregunta 3 (50 %) Sea el modelo R-,

T1(a,b,f), t2(c,d,x), t3(a,c,e), t4(m,n,c), t5(o,a,c) un modelo relacional que fue implementado sin restricciones de integridad relacional o referencial. Y el procedimiento almacenado Escoba( ), el cual es un procedimiento capaz de barrer literalmente todos los errores de integridad relacional o referencia de RConstruya el procedimento almacenado Escoba( ), el cual, adems de barrer, deja en una tabla llamada polvo (tabla, c1,c2,c3) los registros que fueron barridos de la base de datos. Donde tabla es la tabla con error, c1, c2, c2 es una copia del registro que se consider error.

SCRIPT
CREATE TABLE T1 (A INT, B INT, F INT)

CREATE TABLE T2 (C INT, D INT, X INT)

CREATE TABLE T3 (A INT, C INT, E INT)

CREATE TABLE T4 (C INT, M INT, N INT)

CREATE TABLE T5 (A INT, C INT, O INT)

CREATE TABLE POLVO(TABLA NVARCHAR2(50), A INT, B INT, C INT)

CREATE OR REPLACE PROCEDURE INSERT_POLVO_T1(XA INT) AS CURSOR C1 IS SELECT B,F FROM T1 WHERE A = XA; XB INT; XF INT; BEGIN OPEN C1; FETCH C1 INTO XB,XF; WHILE C1%FOUND LOOP INSERT INTO POLVO VALUES ('T1',XA,XB,XF); FETCH C1 INTO XB,XF; END LOOP; END;

CREATE OR REPLACE PROCEDURE REVISA_T1 AS CURSOR C1 IS SELECT A FROM T1 GROUP BY A HAVING COUNT(A) > 1; ACTUAL INT; BEGIN OPEN C1; FETCH C1 INTO ACTUAL; WHILE C1%FOUND LOOP

INSERT_POLVO_T1(ACTUAL); EXECUTE IMMEDIATE 'DELETE FROM T1 WHERE A = '||ACTUAL; FETCH C1 INTO ACTUAL; END LOOP; CLOSE C1; END;

CREATE OR REPLACE PROCEDURE INSERT_POLVO_T2(XC INT) AS CURSOR C1 IS SELECT D,X FROM T2 WHERE C = XC; XD INT; XX INT; BEGIN OPEN C1; FETCH C1 INTO XD,XX; WHILE C1%FOUND LOOP INSERT INTO POLVO VALUES ('T2',XC,XD,XX); FETCH C1 INTO XD,XX; END LOOP; END;

CREATE OR REPLACE PROCEDURE REVISA_T2 AS CURSOR C1 IS SELECT C FROM T2 GROUP BY C HAVING COUNT(C) > 1; ACTUAL INT; BEGIN OPEN C1;

FETCH C1 INTO ACTUAL; WHILE C1%FOUND LOOP INSERT_POLVO_T2(ACTUAL); EXECUTE IMMEDIATE 'DELETE FROM T2 WHERE C = '||ACTUAL; FETCH C1 INTO ACTUAL; END LOOP; CLOSE C1; END;

CREATE OR REPLACE PROCEDURE INSERT_POLVO_T3(XA INT, XC INT) AS CURSOR C1 IS SELECT E FROM T3 WHERE A = XA AND C = XC; XE INT; BEGIN OPEN C1; FETCH C1 INTO XE; WHILE C1%FOUND LOOP INSERT INTO POLVO VALUES ('T3',XA,XC,XE); FETCH C1 INTO XE; END LOOP; END;

CREATE OR REPLACE PROCEDURE REVISA_T3 AS

CURSOR C1 IS SELECT A,C FROM (SELECT A FROM T3 GROUP BY A HAVING COUNT(A) > 1),(SELECT C FROM T3 GROUP BY C HAVING COUNT(C) > 1); CURSOR C2 IS SELECT A,C,E FROM T3; XA INT; XC INT; XE INT; CONT1 INT; CONT2 INT; ACTUAL INT; BEGIN

OPEN C2; FETCH C2 INTO XA,XC,XE; WHILE C2%FOUND LOOP SELECT COUNT(A) INTO CONT1 FROM T1 WHERE A = XA; SELECT COUNT(C) INTO CONT2 FROM T2 WHERE C = XC; IF CONT1 = 0 OR CONT2 = 0 THEN INSERT INTO POLVO VALUES ('T3',XA,XC,XE); DELETE FROM T3 WHERE A = XA AND C = XC; END IF; FETCH C2 INTO XA,XC,XE; END LOOP; CLOSE C2;

OPEN C1; FETCH C1 INTO XA,XC; WHILE C1%FOUND LOOP

INSERT_POLVO_T3(XA,XC); EXECUTE IMMEDIATE 'DELETE FROM T3 WHERE A = '||XA||' AND C = '|| XC; FETCH C1 INTO XA,XC; END LOOP; CLOSE C1; END;

CREATE OR REPLACE PROCEDURE INSERT_POLVO_T4(XM INT) AS CURSOR C1 IS SELECT C,N FROM T4 WHERE M = XM; XC INT; XN INT; BEGIN OPEN C1; FETCH C1 INTO XC,XN; WHILE C1%FOUND LOOP INSERT INTO POLVO VALUES ('T4',XC,XM,XN); FETCH C1 INTO XC,XN; END LOOP; END;

CREATE OR REPLACE PROCEDURE REVISA_T4 AS CURSOR C1 IS SELECT M FROM T4 GROUP BY M HAVING COUNT(M) > 1; CURSOR C2 IS SELECT C,M,N FROM T4; XC INT;

XM INT; XN INT; CONT2 INT; ACTUAL INT; BEGIN OPEN C2; FETCH C2 INTO XC,XM,XN; WHILE C2%FOUND LOOP SELECT COUNT(C) INTO CONT2 FROM T2 WHERE C = XC; IF CONT2 = 0 THEN INSERT INTO POLVO VALUES ('T4',XC,XM,XN); DELETE FROM T4 WHERE M = XM; END IF; FETCH C2 INTO XC,XM,XN; END LOOP; CLOSE C2;

OPEN C1; FETCH C1 INTO XM; WHILE C1%FOUND LOOP INSERT_POLVO_T4(XM); EXECUTE IMMEDIATE 'DELETE FROM T4 WHERE M = '||XM; FETCH C1 INTO XM; END LOOP; CLOSE C1; END;

CREATE OR REPLACE PROCEDURE INSERT_POLVO_T5(XO INT) AS CURSOR C1 IS SELECT A,C FROM T5 WHERE O = XO; XA INT; XC INT; BEGIN OPEN C1; FETCH C1 INTO XA,XC; WHILE C1%FOUND LOOP INSERT INTO POLVO VALUES ('T5',XA,XC,XO); FETCH C1 INTO XA,XC; END LOOP; END;

CREATE OR REPLACE PROCEDURE REVISA_T5 AS CURSOR C1 IS SELECT A,C,O FROM (SELECT A FROM T5 GROUP BY A HAVING COUNT(A) > 1),(SELECT C FROM T5 GROUP BY C HAVING COUNT(C) > 1), (SELECT O FROM T5 GROUP BY O HAVING COUNT(O) > 1); CURSOR C2 IS SELECT A,C,O FROM T5; XA INT; XC INT; XO INT; CONT2 INT; BEGIN OPEN C2; FETCH C2 INTO XA,XC,XO;

WHILE C2%FOUND LOOP SELECT COUNT(A) INTO CONT2 FROM T3 WHERE A = XA AND C = XC; IF CONT2 = 0 THEN INSERT INTO POLVO VALUES ('T5',XA,XC,XO); DELETE FROM T5 WHERE O = XO; END IF; FETCH C2 INTO XA,XC,XO; END LOOP; CLOSE C2; OPEN C1; FETCH C1 INTO XA,XC,XO; WHILE C1%FOUND LOOP INSERT INTO POLVO VALUES ('T5',XA,XC,XO); EXECUTE IMMEDIATE 'DELETE FROM T5 WHERE O = '||XO||' AND A = '|| XA||' AND C = '||XC; FETCH C1 INTO XA,XC,XO; END LOOP; CLOSE C1; END;

CREATE OR REPLACE PROCEDURE ESCOBA AS BEGIN REVISA_T1; REVISA_T2; REVISA_T3; REVISA_T4;

REVISA_T5; END;

Prueba
Para la prueba vamos a insertar valores en las tablas, con llaves primarias repetidas en caso de T1 y T2 y llaves forneas en el caso de T3.

insert into T1 values (1,2,3) insert into T1 values (1,2,3) // llave repetida insert into T1 values (2,2,3) insert into T1 values (3,2,3) insert into T2 values (4,2,3) insert into T2 values (6,2,3) insert into T2 values (4,2,3) // llave repetida insert into T2 values (7,2,3) insert into T3 values (1,4,3) insert into T3 values (2,6,3) insert into T3 values (1,4,3)//llave repetida insert into T3 values (3,7,3) Ahora llamamos al procedimiento escoba.

begin escoba; end;

Podemos observar ahora que cuando consultamos la tabla T1,T2 y T3 ya no tiene las filas con llaves repetidas.

Ahora con T3 podemos ver el antes y el despus de aplicar el procedimiento escoba. Antes

Despus

De igual forma se maneja con las tablas T4 y T5

You might also like