Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Problema conceptual con tablas y funciones

Estas en el tema de Problema conceptual con tablas y funciones en el foro de Oracle en Foros del Web. Buenas tardes, estoy haciendo un trabajo en el que llevo la BD de una tienda. Quiero calcular los ingresos que lleva al mes. Tengo estas ...
  #1 (permalink)  
Antiguo 21/06/2015, 05:42
Avatar de blueMuffin010  
Fecha de Ingreso: mayo-2015
Ubicación: Sevilla
Mensajes: 19
Antigüedad: 8 años, 11 meses
Puntos: 0
Pregunta Problema conceptual con tablas y funciones

Buenas tardes, estoy haciendo un trabajo en el que llevo la BD de una tienda. Quiero calcular los ingresos que lleva al mes. Tengo estas dos tablas para ello:

Código SQL:
Ver original
  1. CREATE TABLE RECIBO
  2.                    (
  3.                    FECHA_ENTR DATE,
  4.                    SEC_CLIENTE INTEGER,
  5.                    SEC_RECIBO INTEGER,
  6.                    PRIMARY KEY (SEC_RECIBO),
  7.                    FOREIGN KEY(SEC_CLIENTE) REFERENCES CLIENTE(SEC_CLIENTE)
  8.                    );
  9.  
  10. CREATE TABLE LINEA_DE_RECIBO
  11.                             (PRECIO NUMERIC,
  12.                             CANTIDAD INTEGER,
  13.                             SEC_LINEA_DE_RECIBO INTEGER,
  14.                             SEC_RECIBO INTEGER,
  15.                             SEC_PRODUCTO INTEGER,
  16.                             PRIMARY KEY (SEC_LINEA_DE_RECIBO),
  17.                             FOREIGN KEY(SEC_RECIBO) REFERENCES RECIBO(SEC_RECIBO),
  18.                             FOREIGN KEY (SEC_PRODUCTO) REFERENCES PRODUCTO(SEC_PRODUCTO)
  19.                             );


En un primer momento había pensado en esta función:
Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION ingreso_mensual(fecha DATE)
  2.   RETURN NUMERIC IS res NUMERIC;
  3.   secuencia INTEGER;
  4.   BEGIN
  5.   SELECT SEC_RECIBO INTO secuencia FROM RECIBO WHERE EXTRACT(MONTH FROM recibo.FECHA_ENTR)=EXTRACT(MONTH FROM fecha) AND
  6.     EXTRACT(YEAR FROM recibo.FECHA_ENTR)=EXTRACT(YEAR FROM fecha);
  7.    
  8.     SELECT SUM(PRECIO) INTO res FROM LINEA_DE_RECIBO WHERE LINEA_DE_RECIBO.SEC_RECIBO=secuencia;
  9.    
  10.     IF(res IS NULL ) THEN res:=0;
  11.          END IF;
  12.          
  13.    RETURN res;
  14.    END ingreso_mensual;
  15. /


Dejando a un lado que no me funciona cuando lo pruebo (me da un error de "exact fetch returns more than requested number of rows") luego he caído en la cuenta de que con el primer SELECT me selecciona sólo una SEC_RECIBO y sólo me daría el precio de uno de los recibos con la fecha introducida por parámetros.

He buscado en internet a ver si había ejemplos de for para ir seleccionando todas las SEC_RECIBO pero no encuentro nada que me sirva (En realidad ni siquiera sé si se usan FOR en sql, yo es que soy más de JAVA)

En fin, no sé por dónde coger esta función. Si alguien me echara una mano se lo agradecería.

Última edición por gnzsoloyo; 21/06/2015 a las 09:55
  #2 (permalink)  
Antiguo 21/06/2015, 06:05
Avatar de blueMuffin010  
Fecha de Ingreso: mayo-2015
Ubicación: Sevilla
Mensajes: 19
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Problema conceptual con tablas y funciones

El problema creo que lo tengo porque no tengo el pensamiento correcto de sql, como ya he dicho antes yo soy de java, si tuviera que hacerlo por ahí guardaría en una lista todas las SEC_RECIBO de la tabla recibo que se correspondieran con la fecha, y luego haría un for que recorriera esa lista y preguntara si la contiene la tabla LINEA_DE_RECIBO, y en caso afirmativo que fuera guardando la suma de precio en otra variable, pero claro, no sé como hacer eso aquí.
  #3 (permalink)  
Antiguo 21/06/2015, 06:15
Avatar de blueMuffin010  
Fecha de Ingreso: mayo-2015
Ubicación: Sevilla
Mensajes: 19
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Problema conceptual con tablas y funciones

Vale, sigo con mi monólogo (jaja) he encontrado algo y creo que es correcto, a ver si alguien me lo puede confirmar:

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION ingreso_mensual(fecha DATE)
  2.   RETURN NUMERIC IS res NUMERIC;
  3.   BEGIN
  4.   SELECT SUM(PRECIO) INTO res FROM LINEA_DE_RECIBO INNER JOIN RECIBO ON LINEA_DE_RECIBO.SEC_RECIBO=RECIBO.SEC_RECIBO
  5.                   WHERE EXTRACT(MONTH FROM RECIBO.FECHA_ENTR)=EXTRACT(MONTH FROM fecha) AND
  6.                                                 EXTRACT(YEAR FROM RECIBO.FECHA_ENTR)=EXTRACT(YEAR FROM fecha);
  7.  
  8.  
  9.     IF(res IS NULL ) THEN res:=0;
  10.          END IF;
  11.          
  12.    RETURN res;
  13.    END ingreso_mensual;
  14. /

Última edición por gnzsoloyo; 21/06/2015 a las 09:56
  #4 (permalink)  
Antiguo 21/06/2015, 10:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema conceptual con tablas y funciones

Creo que estás encarando mal la idea.
Concretamente:
Cita:
Quiero calcular los ingresos que lleva al mes.
¿No te parece más sencillo que comiences, antes que con una función almacenada, creando la query que fuese capaz de obtener ese dato?
Algo como:
Código SQL:
Ver original
  1. SELECT SUM(PRECIO) total
  2. FROM RECIBO R LINEA_DE_RECIBO  LR ON R.SEC_RECIBO = LR.SEC_RECIBO
  3. WHERE R.FECHA_ENTR BETWEEN TO_DATE('01/'||TO_CHAR(SYSDATE, 'mm/rrrr'), 'dd/mm/rrrr') AND TRUNC(SYSDATE);
seria posiblemente la solución. Y ni siquiera necesita parámetros de entrada...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 21/06/2015 a las 10:07

Etiquetas: bd, function, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:47.