Oracle - INTERVAL

   
Vista:

INTERVAL

Publicado por KAR (12 intervenciones) el 15/10/2007 18:37:39
Hola!
Necesito que un procedure se ejecute cada determinado tiempo por el momento cada hora y que este deje de ejecutarse cuando se cumpla una condicion.

Estaba yo usando este codigo:

PROCEDURE SP_CICLO (PI_NUMERO in NUMBER,
PI_FORMATO IN VARCHAR2) IS
FINI TIMESTAMP(0):=TO_CHAR(sysdate, 'DD/MM/YYYY HH24:MI:SS');
FFIN TIMESTAMP(0);
BEGIN
EXECUTE IMMEDIATE 'SELECT TO_CHAR(SYSDATE + INTERVAL '''||PI_NUMERO||''' '||PI_FORMATO||', ''DD/MM/YYYY HH24:MI:SS'') FROM DUAL' INTO FFIN;

WHILE (FINI<FFIN) LOOP
FINI:=TO_CHAR(sysdate, 'DD/MM/YYYY HH24:MI:SS');
END LOOP;

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR');
END SP_CICLO;

Pero a veces funcion y aveces no, no entiendo por que,

11:21:04 a.m. SQL> SET SERVEROUTPUT ON
11:21:17 a.m. SQL> EXEC SP_CICLO(1,'MINUTE');

PI_NUMERO:1
PI_FORMATO:MINUTE
FINI:15/10/07 11:17:00
SELECT TO_CHAR(SYSDATE + INTERVAL '1' MINUTE, 'DD/MM/YYYY HH24:MI:SS') FROM DUAL
FFIN:15/10/07 11:18:00

PL/SQL procedure successfully completed

Executed in 59.313 seconds

11:22:20 a.m. SQL> SET SERVEROUTPUT ON
11:22:30 a.m. SQL> EXEC SP_CICLO(1,'MINUTE');

PI_NUMERO:1
PI_FORMATO:MINUTE
FINI:15/10/07 11:18:13
SELECT TO_CHAR(SYSDATE + INTERVAL '1' MINUTE, 'DD/MM/YYYY HH24:MI:SS') FROM DUAL
FFIN:49/47/47 47:46:50

PL/SQL procedure successfully completed

Executed in 0 seconds

11:22:33 a.m. SQL>

Alguien podria darme alguna otra opcion?
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

RE:INTERVAL

Publicado por Rodolfo Reyes (445 intervenciones) el 16/10/2007 17:10:49
Para estar ejecutanto cada cierto tiempo, intenta utilizar el paquete dbms_job, para crear un Job condicionado en la base de datos.
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

RE:INTERVAL

Publicado por Toribio (3 intervenciones) el 12/08/2009 01:50:25
1: DECLARE

2: X NUMBER;

3: BEGIN

4: SYS.DBMS_JOB.SUBMIT

5: (

6: job => X

7: ,what => 'ESQUEMA.PROCEDIMIENTO_PROBANDO_CODIGO;'

8: ,next_date => to_date('11/19/2008 08:49:08','mm/dd/yyyy hh24:mi:ss')

9: ,interval => 'TRUNC(SYSDATE+7)'

10: ,no_parse => FALSE

11: );

12: :JobNumber := to_char(X);

13: END;

Donde
What = El nombre del procedimiento almacenado a ejecutar.
nex_date = la fecha y hora en el cual se debe ejecutar el job por primera vez.
intervalo = si pueden observar en el query, el intervalo es la fecha de la ejecucion mas 7 dias.

Si el intervalo es cada 30 minutor seria

1: interval => SYSDATE+30/1440

Si el intervalo es cada domingo seria

1: interval => NEXT_DAY(TRUNC(SYSDATE), 'SUNDAY')

Si el intervalo es el primero de cada mes seria

1: interval => TRUNC(LAST_DAY(SYSDATE)) + 1

Espero que te sirva
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