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

No veo el error en el procedimiento

Estas en el tema de No veo el error en el procedimiento en el foro de Oracle en Foros del Web. HOla vereis, tengo que hacer urgentement una serie de procedimientos almacenados. Ya he escrito varios mensajes ( a lo mejor habeis leido alguno..) Bueno finalmente ...
  #1 (permalink)  
Antiguo 11/01/2008, 12:01
 
Fecha de Ingreso: mayo-2005
Mensajes: 294
Antigüedad: 19 años, 6 meses
Puntos: 0
No veo el error en el procedimiento

HOla vereis, tengo que hacer urgentement una serie de procedimientos almacenados. Ya he escrito varios mensajes ( a lo mejor habeis leido alguno..) Bueno finalmente buscando y buscando, leyendo y leyendo he conseguido hacer algo parecido a un procedimiento almacenado pero evidentemente no me funciona (tal y como me esperaba) Me da errores de que ha encontrado la palabra "end" y si comento la línea me da el error en otra y así...
Os pego el código a ver si me podeis hechar un cable ok?

CREATE OR REPLACE PROCEDURE completaEstadisticos(identAlmacen IN varchar2,producto IN varchar2,cantidad IN varchar2,fecha IN Date) as
cant number;
cantiActual number;
cursor c1 IS select cantidad from pedidosEstadisticos where idProducto=producto and fechacaducidadProducto>fecha;
BEGIN
cantiActual:=cantidad;
open c1;
LOOP
Fetch c1 into cant;
if c1%notfound then
cant := 9999;
else
if cant<cantidad then
insert into copias (nombre,fecha) values('HOLA¡','ADIOS');
cantiActual=cantiActual-cant;
end if
end if
END LOOP
commit;
close c1;


Si lo cierto es que el procedimiento es sencillo pero como es elp rimero que hago...
Espero que me podais ayudar. Gracias!!!
  #2 (permalink)  
Antiguo 11/01/2008, 12:22
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Re: No veo el error en el procedimiento

Hola,

Código:
SQL> CREATE OR REPLACE PROCEDURE completaEstadisticos
  2  (
  3  identAlmacen IN varchar2,
  4  producto IN varchar2,
  5  cantidad IN varchar2,
  6  fecha IN Date
  7  )
  8  AS
  9  cant number;
 10  cantiActual number;
 11  cursor c1 IS SELECT cantidad
 12               FROM pedidosEstadisticos
 13               WHERE idProducto = producto AND
 14                     fechacaducidadProducto > fecha;
 15  BEGIN
 16    cantiActual := cantidad;
 17    OPEN c1;
 18    LOOP
 19      FETCH c1 INTO cant;
 20      IF c1%notfound THEN
 21       cant := 9999;
 22      ELSE
 23       IF cant < cantidad THEN
 24         INSERT INTO copias (nombre,fecha) VALUES ('HOLA','ADIOS');
 25         cantiActual := cantiActual - cant;
 26       END IF;
 27      END IF;
 28    END LOOP;
 29    COMMIT;
 30    CLOSE c1;
 31  END;
 32  /

Procedure created.
Ahora compila el procedimiento, habian varios errores de ";" y similares, pero tengo muchas dudas de que funcione, el LOOP lo veo infinito :)

Saludos
  #3 (permalink)  
Antiguo 11/01/2008, 12:29
 
Fecha de Ingreso: mayo-2005
Mensajes: 294
Antigüedad: 19 años, 6 meses
Puntos: 0
Re: No veo el error en el procedimiento

Uf muchísimas gracias, ojala me funcione me daria la vida!!!
De todods modos por que lo ves infinito???
Se supone que el loop hace que se recorran todas las filas que me devuelve el select no??
La verdad es que no tengo mucha idea de esto...
Voy a probarlo ahora mismo y ya te digo.
Gracias:)
  #4 (permalink)  
Antiguo 11/01/2008, 12:42
 
Fecha de Ingreso: mayo-2005
Mensajes: 294
Antigüedad: 19 años, 6 meses
Puntos: 0
Re: No veo el error en el procedimiento

Me compila perfectamente muchas gracias!
  #5 (permalink)  
Antiguo 11/01/2008, 14:10
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 5 meses
Puntos: 43
Re: No veo el error en el procedimiento

Matanga tiene toda la razón del mundo, si el procedure no casca antes por la inserción , segmentos de rollback , etc etc, te estará rulando por tiempo indefinido, mira :
-- Abres el cursor
-- Abres el loop
-- Haces el fetch, insertas, etc etc
-- Cierras el loop
-- Cierras el cursor

¿ No te falta nada ?, efectivamente, te falta un EXIT WHEN.

Si a Matanga no le importa, modifico el pl-sql que ha puesto y te lo hago mas facil :


SQL> CREATE OR REPLACE PROCEDURE completaEstadisticos
2 (
3 identAlmacen IN varchar2,
4 producto IN varchar2,
5 cantidad IN varchar2,
6 fecha IN Date
7 )
8 AS
9 cant number;
10 cantiActual number;
11 cursor c1 IS SELECT cantidad
12 FROM pedidosEstadisticos
13 WHERE idProducto = producto AND
14 fechacaducidadProducto > fecha;
15 BEGIN
16 cantiActual := cantidad;
17 FOR REG IN C1 LOOP
18 -- LOOP
19 CANT := REG.CANTIDAD;
20 -- IF c1%notfound THEN
21 -- cant := 9999;
22 -- ELSE
23 IF cant < cantidad THEN
24 INSERT INTO copias (nombre,fecha) VALUES ('HOLA','ADIOS');
25 cantiActual := cantiActual - cant;
26 END IF;
27 -- END IF;
28 END LOOP;
29 COMMIT;
30 -- CLOSE c1;
31 END;
32 /

Lo de la linea 17 hace que mientras el cursor te recupere datos, te ejecutará lo que hay entre el LOOP y el END LOOP y en el momento en que ya no haya mas registros para que te los devuelva el cursor, automaticamente te sale del loop y te hace un CLOSE del cursor.
  #6 (permalink)  
Antiguo 11/01/2008, 16:08
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Re: No veo el error en el procedimiento

Hola,

Cita:
Si a Matanga no le importa, modifico el pl-sql que ha puesto..
Todo lo contrario, mientras mas personas posteen mejor, mas informacion habra en los threads :)

Saludos
  #7 (permalink)  
Antiguo 12/01/2008, 12:52
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 5 meses
Puntos: 43
Re: No veo el error en el procedimiento

Eres un Crack, Matanga.

Ojala hubiera en este foro mas personas como tu.

Un saludo
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 18:07.