SQL - Bloque anónimo

 
Vista:

Bloque anónimo

Publicado por Estudiante58372 (2 intervenciones) el 25/01/2019 14:43:57
Ayuda, porfavor alguien sabe cómo hacer este ejercicio:

Nos piden realizar un bloque anónimo para obtener el numero gandador de una lotería:



partiremos de una tabla llamada LOTERIA, que tendrá dos campos number (numero_secuencial y numero_aleatorio)



esta tabla la rellenaremos con un número secuencial 1,2,3... (del 1 al 1000) y en número aleatorio la rellenaremos con un numero aleatorio,

el numero aleatorio lo obtendremos con la función de Oracle TRUNC(DBMS_RANDOM.VALUE(0, 1000)). Esta función devuelve un valor aleatorio de 0 a 1000



El Bloque anónimo, tendrá una variable de sustitución, donde insertaremos un numero de 1 a 1000. Si el valor no está en este rango, debemos mostrar un mensaje: “error, el valor introducido no es correcto”.

Si el valor está en el rango correcto, buscaremos ese valor en la tabla Lotería por el campo Numero_secuencial, y mostraremos como numero ganador que es el valor almacenado en Numero_aleatorio. Indicaremos el mensaje. “EL GANADRO ES EL NUMERO ….”.



Mostramos un Ejemplo de la tabla. Si insertamos el valor 3 como variable de sustitución, tenemos que mostrar un mensaje diciendo EL GANADOR ES EL NUMERO 980.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Bloque anónimo

Publicado por Isaias (1921 intervenciones) el 29/01/2019 17:20:11
Si ya creo la tabla y tiene los datos, solo requiere hacer un PROCEDIMIENTO o query que haga la búsqueda, reciba como parámetro el "Numero ganador", ¿cierto?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 18
Ha aumentado 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Bloque anónimo

Publicado por Roger (6 intervenciones) el 29/01/2021 21:01:13
Estoy tratando de resolver el ejercicio en sí, estoy aprendiendo a programar,pero para crear la tabla sería
create table CESTA (
posicion number ,
ganador number) ;

hacer un bucle for de 1 a 1000 en el campo posicion (secuencial)
trunc(dbms_random.value(1,10000)); en el campo ganador (aleatorio)

Justo aquí estoy atascado, alguien que sepa? resolver el ejercicio?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Bloque anónimo

Publicado por anonymous (43 intervenciones) el 29/01/2021 21:21:07
Haber les aporto un poco.

En Oracle tendrás que crear una secuencia que estará actualizando el secuencial algo así como:

1
CREATE SEQUENCE SQ_Loteria INCREMENT BY 1 START WITH 1;

Y el ciclo es un simple loop

1
2
3
4
5
6
WHILE condition
LOOP
   {...statements...}
END LOOP;
 
Donde condition <= 1000

Y bueno el procedure supongo recibe el número con que se intenta apostar, entonces sería algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE OR REPLACE PROCEDURE SPR_Loteria(
p_NumeroApuesta   IN CESTA.ganador%TYPE,
p_RESULTADO        OUT NUMERIC)
 
IS
 
-- Acá irá tu loop
 
EXCEPTION
      WHEN OTHERS THEN
      p_RESULTADO := SUBSTR(SQLCODE,1,20);
 
END SPR_Loteria;

Si no logras ponerlo a punto, pues escribes y algo hacemos hasta que camine, por cierto creaste la tabla cesta sin PK.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 18
Ha aumentado 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Bloque anónimo

Publicado por Roger (6 intervenciones) el 30/01/2021 00:33:36
Hola Jorge, muchas gracias, estoy deseando levantarme para probar todo, tienes razón no tiene pk, pensaba aplicarla luego, pero supongo que mejor desde el inicio, mañana cuelgo como quedaría, un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 18
Ha aumentado 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Bloque anónimo

Publicado por Roger (6 intervenciones) el 30/01/2021 02:22:12
Buenas Jorge, llevo hecho lo siguiente:

Creo la tabla
Para crear la tabla sería
1
2
3
4
5
CREATE TABLE CESTA(
posicion NUMBER,
ganador NUMBER,
CONSTRAINT CESTA_pk PRIMARY KEY(posicion)
);

Le doy secuencialidad al posicion

1
2
3
4
5
6
BEGIN
    FOR posicion in 1..1000
    LOOP
    DBMS_OUTPUT.PUT_LINE(posicion);
    END LOOP;
END;
Ya se tendrían los 1000 números secuenciales en la tabla posición

1
2
3
4
5
6
7
8
9
create sequence s_posicion
start with 1
increment by 1
minvalue 1
maxvalue 1000
nocycle;
 
insert into CESTA values
(s_posicion.nextval,1);

y en el campo ganador (al buscar aleatorio condbms_random.value(1,10000)
1
2
3
4
5
DECLARE
ganador NUMBER;
BEGIN
    ganador:= trunc(dbms_random.value(1,10000));
END;

se supone que he realizado hasta ahora todo bien y el resultado que me da la tabla en luga de uno así
posicion ganador
1 665
2 7898
3 68

me da esto
posicion ganador
1 21 1

cual es el error/errores?
gracias un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Bloque anónimo

Publicado por anonymous (43 intervenciones) el 30/01/2021 13:54:21
Si tienes algunos problemas.

Por una parte estás haciendo mal el insert pues siempre le estás llevando el valor de 1 a la columna ganador, cuando deberías llevar es el aleatorio, en el enunciado comentas que la tabla tendrá dos campos number (numero_secuencial y numero_aleatorio)

Luego es claro que el primero es el que te da la secuencia y el otro el que genera el random, sin embargo deberás asegurarte de estar aplicando un alter a la secuencia para reinicializarla, ya que solo le diste un máximo de 1000.

La pregunta acá es como distingues cual es el número ganador, lo tendrías que marcar de alguna forma en la tabla, para que en caso de que el apostador acierte, se lo puedas indicar, pues así lo entiendo yo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Bloque anónimo

Publicado por anonymous (43 intervenciones) el 30/01/2021 14:42:52
Pruébalo, porque tengo problemas en mi PC y no lo puedo compilar, pero debería funcionar y creo que no es conveniente usar secuencias.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
CREATE TABLE TBL_CESTA (
  CESTA_ID     NUMBER        NOT NULL PRIMARY KEY,
  ALEATORIO  NUMBER        NOT NULL UNIQUE);
 
CREATE OR REPLACE PROCEDURE SPR_LOTERIA (
 p_NumeroApostado IN  NUMBER,
 p_Resultado      OUT NUMBER
)
 
IS
   v_NumeroGanador NUMBER;
   v_Buscar 	   NUMBER;
 
BEGIN
 
     DELETE FROM TBL_CESTA;
	 COMMIT;
 
 
    FOR i IN 1..1000 LOOP
    	INSERT INTO TBL_CESTA (CESTA_ID, ALEATORIO) VALUES(i, trunc(dbms_random.value(1,10000)));
		COMMIT;
    END LOOP;
 
	v_NumeroGanador:= trunc(dbms_random.value(1,10000)); -- Generamos el ganador de forma aleatoria
 
	IF ((p_NumeroApostado < 0) AND (p_NumeroApostado > 1000)) THEN
	     DBMS_OUTPUT.PUT_LINE('Numero fuera de rango 1 a 1000');
    ELSE
	    SELECT ALEATORIO INTO v_Buscar FROM TBL_CESTA WHERE CESTA_ID = p_NumeroApostado;
		IF (v_Buscar = v_NumeroGanador) THEN
		    DBMS_OUTPUT.PUT_LINE('Haz Acertado');
	    ELSE
		    DBMS_OUTPUT.PUT_LINE('Fallaste porque el ganador es: ' || v_NumeroGanador);
		END IF;
	END IF;
 
EXCEPTION
      WHEN OTHERS THEN
      p_RESULTADO := SUBSTR(SQLCODE,1,20);
 
END SPR_LOTERIA;
/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 18
Ha aumentado 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Bloque anónimo

Publicado por Roger (6 intervenciones) el 30/01/2021 18:02:24
Buenas Jorge, he creado un ejemplo de lo que has enviado y no me pide el cuadro de valor, se me ocurrió esto antes del IF
1
2
3
4
5
DECLARE
  numero_secuencial number:= &valor;
  begin
 
  DBMS_OUTPUT.PUT_LINE('El valor introducido es ' || numero_secuencial);

y ya me sale un cuadro pidiendo un valor, pero no reacciona a si el valor es menos de 1000 o más de 1000, ya queda un último empujón.
Ajustado al ejercicio, he cambiado toda la nomenclatura quedando así

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
CREATE OR REPLACE PROCEDURE LOTERIA (
 p_NumeroApostado IN  NUMBER,
 p_Resultado      OUT NUMBER
)
 
IS
   Numero_secuencial 	   NUMBER;
   Numero_aleatorio 	   NUMBER;
 
     DELETE FROM CESTA;
     COMMIT;
 
end;
 
    FOR i IN 1..1000 LOOP
    	INSERT INTO CESTA (posicion, ganador) VALUES(i, trunc(dbms_random.value(1,10000)));
		COMMIT;
    END LOOP;
 
	Numero_secuencial:= trunc(dbms_random.value(1,10000));
 
 DECLARE
  numero_secuencial number:= &valor;
  begin
 
  DBMS_OUTPUT.PUT_LINE('El valor introducido es ' || numero_secuencial);
 
	IF ((p_NumeroApostado < 0) AND (p_NumeroApostado > 1000)) THEN
	     DBMS_OUTPUT.PUT_LINE('Numero fuera de rango 1 a 1000');
    ELSE
	    SELECT ganador INTO Numero_aleatorio FROM CESTA WHERE posicion = p_NumeroApostado;
		IF (Numero_aleatorio = Numero_secuencial) THEN
		    DBMS_OUTPUT.PUT_LINE('EL GANADOR ES: ');
	    ELSE
		    DBMS_OUTPUT.PUT_LINE('error, el valor introducido no es correcto' || Numero_secuencial);
		END IF;
	END IF;
    end;
 
EXCEPTION
      WHEN OTHERS THEN
      p_RESULTADO := SUBSTR(SQLCODE,1,20);
 
END LOTERIA;
/

Como harías para que tras introducir el valor diga error o ganador, es decir, reaccione bien o mal a mi valor.

Muchas gracias Jorge
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Bloque anónimo

Publicado por anonymous (43 intervenciones) el 30/01/2021 19:04:56
Si te fijas el procedimiento recibe un parámetro de tipo IN, entonces cuando lo ejecutas le pasas ese parámetro así:

Execute SPR_LOTERIA(50);

No tienes necesidad de pedirlo, simplemente lo envías como argumento.

Por último, te sugiero alteres la estructura que yo diseñé, para que la columna Aleatorio no sea de tipo Unique, pues la instrucción que genera el random, en cualquier momento puede generar un repetido, y te sacará error de clave duplicada.

Entonces o le quitas la restricción de Unique a la columna para que admita duplicados, y/o haces una búsqueda para verificar si ese número generado ya existe, y obligas a que genere otro, esto porque pues si hay repetidos quiere decir que el usuario que apueste por ese número, tiene más posibilidades de ganar y la idea es que sea igual para todos.

Si algo me puedes escribir al correo interno de lwdp para seguirte ayudando y cortar ya este hilo en el foro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 18
Ha aumentado 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Bloque anónimo

Publicado por Roger (6 intervenciones) el 30/01/2021 19:37:33
bien me sigue fallando algo, ahora te escribo por mp,

un saludo y 1000 gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar