Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Oracle (http://www.forosdelweb.com/f100/)
-   -   No veo el error en el procedimiento (http://www.forosdelweb.com/f100/no-veo-error-procedimiento-547394/)

CARCAHARAS 11/01/2008 12:01

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!!!

matanga 11/01/2008 12:22

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

CARCAHARAS 11/01/2008 12:29

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...:neurotico
Voy a probarlo ahora mismo y ya te digo.
Gracias:)

CARCAHARAS 11/01/2008 12:42

Re: No veo el error en el procedimiento
 
Me compila perfectamente muchas gracias!

jc3000 11/01/2008 14:10

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.

matanga 11/01/2008 16:08

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

jc3000 12/01/2008 12:52

Re: No veo el error en el procedimiento
 
Eres un Crack, Matanga.

Ojala hubiera en este foro mas personas como tu.

Un saludo


La zona horaria es GMT -6. Ahora son las 05:14.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.