Bonjour,

Je dois coder un bout de code PL/SQL qui me chagrine un peu, alors voilà :

J'ai un fichier de proprietés dont la forme est la suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
cle1=valeur1
cle2=valeur2
...
Pour le lire, j'utilise le bout de code suivant :
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
 
create or replace
PROCEDURE P
( MYDIR IN VARCHAR2
, FIC IN VARCHAR2
) AS
monFichier UTL_FILE.FILE_TYPE;
buf VARCHAR2(4000);
 
TYPE ASSO IS RECORD (blc_zon_id varchar2(128), lib_value varchar2(128));
TYPE ASSO_TAB IS TABLE OF ASSO;
 
my_asso asso;
my_asso_tab asso_tab := asso_tab();
i integer := 1;
 
p1 varchar2(128);
p2 varchar2(128);
 
BEGIN
  monFichier := utl_file.fopen(MYDIR,FIC,'r');
  -- interrogation du fichier et construction d'une liste
  loop
    begin
      utl_file.get_line(monfichier, buf);
    exception
      when no_data_found then exit;
    end;
    -- Premier découpage
    if (buf is not null) then
      IF (instr(buf,'=') = 0) THEN
        my_asso.blc_zon_id:=substr(buf,instr(buf,'=')+1);
        my_asso.lib_value:=null;
      ELSE
        my_asso.blc_zon_id:=substr(buf,0,instr(buf,'=')-1);
        my_asso.lib_value:=substr(buf,instr(buf,'=')+1);
      END IF;
      my_asso_tab.extend;
      my_asso_tab(i):= my_asso;
      i:=i+1;
    end if;
  end loop;
  utl_file.fclose(monfichier);  
 
  -- Affichage
  for i in 1..my_asso_tab.count loop
    dbms_output.put_line(rpad('cle='|| my_asso_tab(i).blc_zon_id, 40, ' ') ||
                         rpad('valeur='||  my_asso_tab(i).lib_value,40,' '));
  end loop;
END P;
La construction de ma collection de records (paires clé valeur) fonctionne.
Maintenant je voudrai dépasser cela, en trouvant un moyen rapide de sélectionner les valeurs qui correspondent à la clé recherchée.

Si quelqu'un a quelque chose de plus efficace qu'une itération de ce type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
  for i in 1..my_asso_tab.count loop
    if (my_asso_tab(i).blc_zon_id='B2Z19') THEN
      dbms_output.put_line('trouvé!!! => valeur='||my_asso_tab(i).lib_value);
    end if;
  end loop;
Merci

PS : je ne peux pas changer le format du fichier d'entrée ... c'est comme ca !
PPS : Si l'itération est la méthode la plus simple et surtout la plus efficace ... merci de me confirmer

Laurent