Comment optimiser cet unité de programme
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. 8O
--------------------------------------------
Code:
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. :)