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

Problema con procedimiento

Estas en el tema de Problema con procedimiento en el foro de Oracle en Foros del Web. Buenas, estoy realizando el siguiente procedimiento: create or replace PROCEDURE calculo_tiempo(p_mes date) is v_id number; v_id_fin number; v_fecha_inicio date; v_segundos_inicio number; v_segundos_fin number; v_metodo varchar2(40); ...
  #1 (permalink)  
Antiguo 30/04/2012, 09:52
 
Fecha de Ingreso: marzo-2012
Mensajes: 6
Antigüedad: 12 años, 8 meses
Puntos: 0
Problema con procedimiento

Buenas, estoy realizando el siguiente procedimiento:

create or replace
PROCEDURE calculo_tiempo(p_mes date)
is
v_id number;
v_id_fin number;
v_fecha_inicio date;
v_segundos_inicio number;
v_segundos_fin number;
v_metodo varchar2(40);
v_lin2 number;
v_tot number;
v_eof BOOLEAN DEFAULT false;
CURSOR c_log is
SELECT id_log,fecha_inicio,hora_inicio,metodo FROM prb_lectura_log WHERE inicio_fin='begin' and fecha_inicio=p_mes;

BEGIN
V_tot:=0;
DBMS_OUTPUT.PUT_LINE('mensaje');
OPEN c_log;
LOOP
FETCH c_log into v_id,v_fecha_inicio,v_segundos_inicio,v_metodo;
IF v_eof THEN
CLOSE c_log;
EXIT;
END IF;

v_id_fin:=0;
DBMS_OUTPUT.PUT_LINE('MENSAJE');
Select id_log,hora_inicio INTO v_id_fin,v_segundos_fin FROM prb_lectura_log
WHERE id_log>v_id and fecha_inicio=v_fecha_inicio and metodo=v_metodo and inicio_fin='end';
DBMS_OUTPUT.PUT_LINE(v_id_fin);
if v_id_fin<>0 then
DBMS_OUTPUT.PUT_LINE('Mensaje dentro del IF');
update prb_lectura_log set segundos_empleados=(v_segundos_fin-v_segundos_inicio) where id_log=v_id;
DBMS_OUTPUT.PUT_LINE(v_segundos_fin);
DBMS_OUTPUT.PUT_LINE(v_segundos_inicio);
commit;
end if;
END LOOP;
exception
WHEN NO_DATA_FOUND THEN v_eof :=true;
END calculo_tiempo;

Lo ejecuto con la siguiente sentencia:

execute calculo_tiempo(to_date('14/03/2012','DD/MM/YYYY'));

y me muestra el mensaje:

bloque anónimo terminado
mensaje
MENSAJE

Pero no me muestra el resto de mensajes que hay por debajo...Alguno sabeis a que se puede deber? los campos estan bien descritos y la tabla tiene datos suficientes.
Gracias!!
  #2 (permalink)  
Antiguo 30/04/2012, 17:46
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Respuesta: Problema con procedimiento

Código:
...
Select id_log,hora_inicio INTO v_id_fin,v_segundos_fin 
FROM prb_lectura_log 
WHERE id_log>v_id and 
 fecha_inicio=v_fecha_inicio and 
 metodo=v_metodo and 
 inicio_fin='end';
...
Lo más probable es que esta consulta no devuelva registros, lo que produce un salto del código hacia el bloque EXCEPTION y después finaliza el proceso, puedes confirmar el problema haciendo un count, por ejemplo:

Código:
...
Select count(*) INTO v_cantidad 
FROM prb_lectura_log 
WHERE id_log>v_id and 
 fecha_inicio=v_fecha_inicio and 
 metodo=v_metodo and 
 inicio_fin='end';
dbms_output.put_line( to_char(v_cantidad) );
...
Además de esto, sería recomendado que tengas una gestión de excepciones más precisa, por ejemplo:

Código:
begin
.....
 loop
   begin
   ......
   exception --gestión de errores específicos del cursor
    when no_data_found then
     exit;
   end;
 end loop;
....
exception --gestión de errores generales del procedimiento
 when others then
   dbms_output.put_line(sqlerrm);
end;
Saludos
  #3 (permalink)  
Antiguo 04/05/2012, 06:40
 
Fecha de Ingreso: marzo-2012
Mensajes: 6
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Problema con procedimiento

Gracias por tu respuesta!!la verdad que me ha sido muy util porque me ha puesto en la senda de la solucion. Mi problema era que en la select una de las condiciones era: inicio_fin='begin' y nunca encontraba nada puesto que en la base de datos estaba en mayusculas...:S donde tendria la cabeza...Gracias!!
Un saludo.

Etiquetas: procedimiento, select, sentencia, tabla, campos
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 08:20.