UTNianos

Versión completa: [APORTE] FINAL gestión de datos 15/12/2015
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Muchachos les dejo una foto del final del Ayer (porque es la 1am)

Yo me saqué un humilde 4 haciendo el último ejercicio y la teoría.

1a) Falso
3b) lo justifiqué diciendo que con el dato de 0<N<M se puede suponer que en la tabla hay claves mas grandes que cantidad de valores, por ende no son correlativas las claves. así que hay huecos.
puse un ejemplo de lo que podría haber en la tabla
Clave__Valor
1_______20
2_______30
4_______50
6_______55
3_______10
10______12
claramente la función devolvería 3 ya que es la primer clave libre, pero nunca se fijó si mas abajo ya existía la clave 3.
Además por temas de isolation level también podría pasar que se inserte una clave ya existente
por ende Si. existe la posibilidad de que el insert con la función tire error por primary key existente.

Saludos!
El 1B) creo que es Verdadero
Incluso podes justificar en el 3B, que como tu funcion retorna 1 (si no hay huecos), Vos al hacer el insert en tu tabla, tomas como clave lo que te retorna la función anteriormente desarrollada. Si ésta devuelve 1, va a tomarlo como clave y ésta ya existe, entonces al querer hacer INSERT INTO TABLA VALUES (1, 22) ,por ejemplo, te va a dar dicho error.
Rendí ayer, me saqué un 8, paso mis resoluciones.

1A) Falso. En sql server te deja un null por ejemplo, mysql varios.
1B) Verdadero. Hay que agarra un arbol binario y le aplicas el barrido y queda ordenado.

2a)Lectura sucia: Cuando una transaccion se puede ver afectada por otra transaccion sin que esta ultima haya hecho el commit. Se dice lecturas sucias, porque la segunda transaccion nunca hizo el commit, y puede que antes de terminar haga un rollback y en verdad ese registro nunca tuvo que ser leido. Con el isolation level read uncommited pasa esto.

Lectura repetible: Se dice que hay lectura repetible cuando ejecuto 2 selects en una transaccion y esta devuelve la los mismos datos en los mismos registros devueltos(en otras palabras, significa que si hay otra transaccion que quiere updatear los registros afectados por la primera transaccion, va a bloquearse hasta que la primera termine) El isolation level repetible reads asegura lecturas repetibles.

Lecturas fantasmas: Es cuando uno hace un select y en el where pone un rango y luego hace el mismo select con el mismo where y aparecen nuevos registros. Esto sucede por ejemplo en el isolation level repetible reads porque si bien bloquea los registros afectados, permite agregar nuevos registros en ese rango. Para solucionar este problema se debe usar isolation level serializable.

2b) En pocas palabras, puse que un datamart es un datawarehouse pero orientado a un negocio particular dentro de la organización. y se hace así, para que sea mas especializado, mas perfomante. Y sus datos estan desnormalizados porque a las personas que lo utilizan, le importa los datos ya sumarizados para poder tomar decisiones, no les sirve de nada tener las transacciones puras, sino las conclusiones de todas esas transacciones.(osea lo que ellos piden)

3a)

En la funcion el select que me devuelve la primera clave vacia lo hice asi



SELECT TOP 1 (s1.clave + 1) primer_hueco

FROM Secuencias s1 LEFT JOIN Secuencias s2
ON s1.clave = (s2.clave + 1)

WHERE s2.clave IS NULL

ORDER BY 1 ASC



despues hice un if de la variable primer_hueco y si daba mayor o igual que max(clave) es porque no habia huecos, entonces asignaba a la variable un 1, luego retornaba.

el 3b) Puse que si es posible por 2 motivos.
porque como ya dijeron, si retonar 1 y se inserta el valor, luego puede volver a retornar 1 y ya no se podria insertar mas.
Y yo hice una aclaracion, no se si estará bien, que decia que en un sistema concurrente si dos transacciones ejecutan la misma funcion y tiene un isolation level read uncommited, puede que ambas funciones retornen el mismo resultado al mismo tiempo.


Espero que sirva.
Slds.
(16-12-2015 01:19)aguZion escribió: [ -> ]Muchachos les dejo una foto del final del Ayer (porque es la 1am)

Yo me saqué un humilde 4 haciendo el último ejercicio y la teoría.

1a) Falso
3b) lo justifiqué diciendo que con el dato de 0<N<M se puede suponer que en la tabla hay claves mas grandes que cantidad de valores, por ende no son correlativas las claves. así que hay huecos.
puse un ejemplo de lo que podría haber en la tabla
Clave__Valor
1_______20
2_______30
4_______50
6_______55
3_______10
10______12
claramente la función devolvería 3 ya que es la primer clave libre, pero nunca se fijó si mas abajo ya existía la clave 3.
Además por temas de isolation level también podría pasar que se inserte una clave ya existente
por ende Si. existe la posibilidad de que el insert con la función tire error por primary key existente.

Saludos!

Según entendí yo, al estar el 3 entre las claves no habría hueco ahí en este caso sino en 5.

Para mi la justificación de porque existe la posibilidad sería mostrar el siguiente ejemplo.

Clave 1 Valor NULL
Clave 2 Valor NULL
Clave 3 Valor 8

En este caso se cumpliría como me indican que 0<N<M porque N sería 1 y M sería 3. La función me devolvería 1, y el INSERT INTO Secuenticas VALUES (1,55) da error de PK duplicada.
(16-12-2015 13:16)_Gabo escribió: [ -> ]
(16-12-2015 01:19)aguZion escribió: [ -> ]Muchachos les dejo una foto del final del Ayer (porque es la 1am)

Yo me saqué un humilde 4 haciendo el último ejercicio y la teoría.

1a) Falso
3b) lo justifiqué diciendo que con el dato de 0<N<M se puede suponer que en la tabla hay claves mas grandes que cantidad de valores, por ende no son correlativas las claves. así que hay huecos.
puse un ejemplo de lo que podría haber en la tabla
Clave__Valor
1_______20
2_______30
4_______50
6_______55
3_______10
10______12
claramente la función devolvería 3 ya que es la primer clave libre, pero nunca se fijó si mas abajo ya existía la clave 3.
Además por temas de isolation level también podría pasar que se inserte una clave ya existente
por ende Si. existe la posibilidad de que el insert con la función tire error por primary key existente.

Saludos!

Según entendí yo, al estar el 3 entre las claves no habría hueco ahí en este caso sino en 5.

Para mi la justificación de porque existe la posibilidad sería mostrar el siguiente ejemplo.

Clave 1 Valor NULL
Clave 2 Valor NULL
Clave 3 Valor 8

En este caso se cumpliría como me indican que 0<N<M porque N sería 1 y M sería 3. La función me devolvería 1, y el INSERT INTO Secuenticas VALUES (1,55) da error de PK duplicada.

Está bien lo que decís, pasa que reinosa en el medio del final, porque muchos se paraban a preguntar, aclaró cosas del ejercicio porque muchos preguntaban, y ahi me dió a entender que si había 1, 2 y 3 te daba la 4..

No se si entendí mal yo o que onda, pero hubo muchos problemas con el enunciado porque era medio ambiguo..

Saludos!
Una consulta, ¿no se supone que al insertar el 3, la tabla se ordena por primary key?

Clave__Valor
1_______20
2_______30
4_______50
6_______55

Si está así e inserto el 3 quedaría así

Clave__Valor
1_______20
2_______30
3_______10
4_______50
6_______55

(16-12-2015 12:43)gonzalo.gobea escribió: [ -> ]3a)

En la funcion el select que me devuelve la primera clave vacia lo hice asi



SELECT TOP 1 (s1.clave + 1) primer_hueco

FROM Secuencias s1 LEFT JOIN Secuencias s2
ON s1.clave = (s2.clave + 1)

WHERE s2.clave IS NULL

ORDER BY 1 ASC



despues hice un if de la variable primer_hueco y si daba mayor o igual que max(clave) es porque no habia huecos, entonces asignaba a la variable un 1, luego retornaba.

Si tengo
1
2
4

Tu función retorna 2, y no 3.

Cómo sería realizar una sentencia DML?

Con esto alcanza?

insert into secuencias (clave,valor) values (dbo.FINAL_20151215(),55)


Lo resolví con un cursor la primer parte.



create function FINAL_20151215()
returns int
as
begin

declare CursorFinal cursor for select clave from Secuencias order by clave
open CursorFinal

declare @clave int
declare @clave_anterior int
declare @hueco int
set @hueco = 1

fetch next from CursorFinal into @clave

set @clave_anterior = @clave

while (@@FETCH_STATUS = 0)
begin

if ((@clave - @clave_anterior) > 1)
begin
set @hueco = @clave_anterior + 1
break
end

set @clave_anterior = @clave
fetch next from CursorFinal into @clave
end

close CursorFinal
deallocate CursorFinal
return @hueco
end


URLs de referencia