Programación de un procedimiento con DBMS_SCHEDULER. PLS-00103: Se encontró con el símbolo "NULO" cuando esperaba uno de los siguientes:;

Aug 21 2020

No puedo programar un trabajo para que se ejecute.

Hice un procedimiento que escribe archivos CSV y funciona cuando lo ejecuto.

Luego intenté hacer un trabajo para programarlo:

BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name => 'AUTOMATE_CSV_EXPORT',
    job_type => 'STORED_PROCEDURE',
    job_action => 'EXPORT_ALL_LYS_FOR_TABLEAU',
    number_of_arguments => 0,
    start_date => '20-AUG-20 2.05.00PM',
    repeat_interval => 'FREQ=WEEKLY; BYDAY=FRI; BYHOUR=23;',
    end_date => NULL,
    enabled => FALSE,
    auto_drop => FALSE,
    comments => 'hello i am a comment');

  DBMS_SCHEDULER.SET_ATTRIBUTE( 
    name => 'AUTOMATE_CSV_EXPORT', 
    attribute => 'logging_level', 
    value => DBMS_SCHEDULER.LOGGING_RUNS);
  
  DBMS_SCHEDULER.enable(
    name => 'AUTOMATE_CSV_EXPORT');
END;
/

No se ejecutó a la hora programada, pero lo hizo cuando lo ejecuté así:

Intenté editar la hora de inicio en el asistente y me da este error:

Lo programé para que se ejecute cada 2 minutos desde hace un tiempo y aún no se ha ejecutado. Definitivamente está habilitado.


Solución de problemas

TLDR: ¡el programador funciona! Lo único que no funciona es que ingrese mi correo electrónico para recibir notificaciones.

  1. ¿Lo estoy ejecutando en el mismo esquema en el que lo creé?

Cambié el trabajo para que se ejecute cada 2 minutos.

^^^ ¿entonces está funcionando? Pero no veo ningún CSV en la carpeta de destino. Cambié la fecha de inicio a NULL como el código a continuación y ¡funcionó! ¡Tengo CSV!

  1. Prueba de un trabajo programado: prueba:
create or replace procedure test_print
is
begin
    dbms_output.put_line('Current date and time is : ' || 
    to_char(sysdate,'DD-MON-YYYY HH:MI:SS AM'));
end;

set serveroutput on;

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
    job_name => 'JOB_TEST',
    job_type => 'STORED_PROCEDURE',
    job_action => 'TEST_PRINT',
    number_of_arguments => 0,
    start_date => NULL,
    repeat_interval => 'FREQ=MINUTELY;INTERVAL=2;',
    end_date => NULL,
    enabled => FALSE,
    auto_drop => FALSE,
    comments => 'Testing job runs');
 
DBMS_SCHEDULER.enable(name => 'JOB_TEST');
END;
/

select job_name,output,status,owner 
from user_scheduler_job_run_details where  job_name='JOB_TEST';

resultados:

Lo que todavía no funciona son las notificaciones por correo electrónico. Cuando eso es lo único que edito, aparece este error:

Respuestas

2 Noname Aug 21 2020 at 10:15

Lo más probable es que esté creando objetos en diferentes esquemas, verifique los trabajos creados y los detalles del trabajo en el esquema actual con estas vistas user_scheduler_jobsyuser_scheduler_job_run_details

Procedimiento sencillo programado para ejecutarse cada 2 minutos

  SQL>create or replace procedure test_print
      2  is
      3  begin
      4  dbms_output.put_line('Current date and time is : ' || to_char(sysdate,'DD-MON-YYYY HH:MI:SS AM'));
      5* end;
    SQL> /
    
    Procedure created.
    
    SQL> exec test_print();
    Current date and time is : 20-08-2020 09:22:59 PM
    
    PL/SQL procedure successfully completed.
    
    
    SQL> BEGIN
      2             DBMS_SCHEDULER.CREATE_JOB (
      3              job_name => 'JOB_TEST',
      4              job_type => 'STORED_PROCEDURE',
      5              job_action => 'TEST_PRINT',
      6              number_of_arguments => 0,
      7              start_date => NULL,
      8              repeat_interval => 'FREQ=MINUTELY;INTERVAL=2;',
      9              end_date => NULL,
     10              enabled => FALSE,
     11              auto_drop => FALSE,
     12              comments => 'Testing job runs');
     13
     14
     15
     16
     17
     18              DBMS_SCHEDULER.enable(
     19               name => 'JOB_TEST');
     20  END;
     21  /
     
  SQL> select job_name,output,status from user_scheduler_job_run_details
       2  where  job_name='JOB_TEST';

JOB_NAME   OUTPUT                                             STATUS
---------- -------------------------------------------------- ---------------
JOB_TEST   Current date and time is :20-08-2020 09:30:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:32:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:34:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:36:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:38:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:40:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:42:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:44:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:46:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:48:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-AUG-2020 09:50:05 PM  SUCCEEDED -- Modified date format in procedure
JOB_TEST   Current date and time is :20-AUG-2020 09:52:05 PM  SUCCEEDED
JOB_TEST   Current date and time is :20-AUG-2020 09:54:05 PM  SUCCEEDED
JOB_TEST   Current date and time is :20-AUG-2020 09:58:05 PM  SUCCEEDED
JOB_TEST   Current date and time is :20-AUG-2020 10:02:05 PM  SUCCEEDED
JOB_TEST   Current date and time is :20-AUG-2020 10:04:05 PM  SUCCEEDED
JOB_TEST   Current date and time is :20-AUG-2020 09:56:05 PM  SUCCEEDED
JOB_TEST   Current date and time is :20-AUG-2020 10:00:05 PM  SUCCEEDED

18 rows selected.


SQL> select job_name,last_start_date,last_run_duration from user_scheduler_jobs
  2  where job_name='JOB_TEST';

JOB_NAME   LAST_START_DATE                                    LAST_RUN_DURATION
---------- -------------------------------------------------- ------------------------------
JOB_TEST   20-AUG-20 10.08.05.070000 PM US/CENTRAL            +000000000 00:00:00.009000

Editar: - La simple observación de que pudo ejecutar el trabajo manualmente pero no desde el programador implica que el trabajo y el procedimiento no están en el mismo esquema.