Bonjour,

J'ai un bloc de données DORE qui est référencé à une table.

La clause WHERE du bloc DORE est construite dynamiquement et me ramène de 0 à n enregistrements (QUERY 1).

Je peux à partir des enregistrements que me ramène la clause WHERE faire une nouvelle recherche qui me ramène un enregistrement (QUERY 2)

J'ai un bouton qui me permet d'appeler une nouvelle FORM en lui passant des données sur l'enregistrement (ENREG) sur lequel je suis positionné.

Avant d'appeler le form je sauvegarde la clef qui est un numérode de dossier (:dore.dore_dossierrecouvrement)

Lorsque je revient de l'appel de ma FORM, je fait :

- un Execute_query qui représente le QUERY 1
- j'appelle la procédure repositionnement.

Comment optimiser l'unité de programme décrit ci-dessous afin que je puisse me positionner sur l'enregistrement du QUERY 2?

C'est rapide si l'enregistrement (ENREG) est vers le début, mais extrêmement lent si l'enregistrement (ENREG) est vers la fin.

--------------------------------------------
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
 
PROCEDURE REPOSITIONNEMENT IS
 
  v2_premier    VARCHAR2(2000);
  v2_dernier    VARCHAR2(2000);
  v2_type_enreg VARCHAR2(2000);
 
  dt_deb        DATE;
  dt_fin        DATE;
 
BEGIN
  --Se repositionner
  dt_deb := SYSDATE;
  --message('nb_dossier=' || :parameter.nb_dossier || 'HEURE=' || TO_CHAR(SYSDATE,'HH24:MI:SS'));   
  --message('nb_dossier=' || :parameter.nb_dossier || 'HEURE=' || TO_CHAR(SYSDATE,'HH24:MI:SS'));
  IF :parameter.nb_dossier IS NOT NULL THEN 
    FIRST_RECORD;
    v2_premier := :SYSTEM.CURSOR_RECORD;
 
    LAST_RECORD;
    v2_dernier := :SYSTEM.CURSOR_RECORD;
 
    --message('v2_dernier=' || v2_dernier || ' -v2_premier=' || v2_premier || 'HEURE=' || TO_CHAR(SYSDATE,'HH24:MI:SS'));
    --message('v2_dernier=' || v2_dernier || ' -v2_premier=' || v2_premier || 'HEURE=' || TO_CHAR(SYSDATE,'HH24:MI:SS'));
    IF v2_dernier <> v2_premier THEN
      v2_type_enreg := 'n enreg-';
      FIRST_RECORD;
      LOOP
 
        IF :dore.dore_dossierrecouvrement = :parameter.nb_dossier THEN
          --message('trouve=' || :parameter.nb_dossier || 'HEURE=' || TO_CHAR(SYSDATE,'HH24:MI:SS'));
          --message('trouve=' || :parameter.nb_dossier || 'HEURE=' || TO_CHAR(SYSDATE,'HH24:MI:SS'));
          :parameter.v2_system_cursor_record := :SYSTEM.CURSOR_RECORD;
          EXIT;
        END IF;
 
        IF :system.last_record = 'TRUE' THEN
          EXIT;
        END IF;
 
        NEXT_RECORD;
 
      END LOOP;
    ELSE
      v2_type_enreg := '1 enreg -';  	
    END IF;
 
    IF :parameter.v2_system_cursor_record IS NOT NULL THEN
      GO_RECORD(:parameter.v2_system_cursor_record);
      :parameter.v2_system_cursor_record := NULL;
      :parameter.nb_dossier              := NULL;
    END IF;
  END IF;
 
  dt_fin := SYSDATE;
 
  message(v2_type_enreg || 'Temps=' || TO_CHAR(dt_deb, 'HH24:MI:SS') ||'-' || TO_CHAR(dt_fin, 'HH24:MI:SS'));
  message(v2_type_enreg || 'Temps=' || TO_CHAR(dt_deb, 'HH24:MI:SS') ||'-' || TO_CHAR(dt_fin, 'HH24:MI:SS'));
 
END;
--------------------------------------------

Merci pour votre aide.