J'ai regardé la doc de Salim, voici comment il a créé sa proc de test, il fait juste un sleep donc juste tourner le temps.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Create or replace procedure Progress_Bar
As
   rindex pls_integer := -1;
   slno   pls_integer;
Begin
  -----------------------------------------------------
  --  procedure that does nothing else than waiting  --
  --  to illustrate the ProgressBar Forms sample     --
  -----------------------------------------------------
   dbms_application_info.set_session_longops(
     RINDEX      => rindex
    ,SLNO        => slno
    ,OP_NAME     => 'PROGRESS_BAR'
    ,SOFAR       => 0
    ,TOTALWORK   => 100
   );
   --  simulating the task progress  --
   For i IN 1..100 loop
     DBMS_LOCK.SLEEP(.3);
     dbms_application_info.set_session_longops(
       RINDEX      => rindex
      ,SLNO        => slno
      ,OP_NAME     => 'PROGRESS_BAR'
      ,SOFAR       => i
      ,TOTALWORK   => 100
     );
   End loop;
End;
ensuite il fait dans un déclencheur ce code qui grâce à un item qui s'affiche en fonction de la valeur 'sofar' par rapport au totalwork, ceci dans la table v$session_longops pour le job creé.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
Moi je souhaite savoir comment vous pouvez faire pour une procédure stockée dans la base, et comment vous aurez géré exactement les valeurs de 'sofar' et t'otalwork' . Si vous savez, est ce que vous pouvez me donner juste un petit exemple qui fait un update ou insert.. juste pour que je vois comment faire.

Merci encore.