1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| Declare
v_jobname Varchar2(30) := 'PROGRESS_BAR_JOB' ;
v_jobid Number := 12345 ;
v_percent Number := 0 ;
v_end Exception ;
v_nb Pls_integer ;
v_pass Pls_integer := 0 ;
begin
-- we start the stored procedure through the DBMS_SCHEDULER.CREATE_JOB function --
dbms_scheduler.create_job(
job_name => v_jobname
,job_type => 'stored_procedure'
,job_action => 'Progress_Bar'
,start_date => SYSDATE
,enabled => TRUE
);
-- job's running? --
Loop
Select count(*)
Into v_nb
From USER_SCHEDULER_JOBS
Where JOB_NAME = v_jobname;
v_pass := v_pass + 1 ;
If v_pass > 100 Then
-- le job ne se lance pas --
message('Job not running',acknowledge);
Raise Form_Trigger_Failure ;
End if ;
exit when v_nb > 0 ;
dbms_lock.sleep(.2);
End loop ;
set_item_property('blo_progress.progressbar', width, 0);
v_percent :=0;
-- following the procedure's execution --
Loop
Exit when v_percent >= 100;
Select (sofar / totalwork) * 100
Into v_percent
From v$session_longops
Where opname = 'PROGRESS_BAR' and sofar < totalwork;
:blo_progress.progressbar:= v_percent||'%';
set_item_property('blo_progress.progressbar',width, round( v_percent*2,2));
synchronize;
End loop;
raise v_end ;
Exception
When NO_DATA_FOUND then
set_item_property('blo_progress.progressbar', width, 200);
:blo_progress.progressbar:= '100%';
raise v_end ;
When TOO_MANY_ROWS then
raise v_end ;
When v_end then
DBMS_SCHEDULER.drop_job (job_name => v_jobname,FORCE=> true) ;
When Others then
DBMS_SCHEDULER.drop_job (job_name => v_jobname,FORCE=> true) ;
End; |
Partager