IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Interrogation de collections en PL/SQL


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de laurentleturgez
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 88
    Par défaut Interrogation de collections en PL/SQL
    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

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Si la clé est de type alphanumérique, vous pouvez utiliser une table PL/SQL indexée par un varchar

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Type ma_collection Is Table of ... INDEX BY VARCHAR2(100);

  3. #3
    Membre éprouvé Avatar de laurentleturgez
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 88
    Par défaut
    Salut,

    Ma clé est effectivement un Varchar2, sauf que cette clé est le premier enregistrement de mon RECORD (champ blc_zon_id):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TYPE ASSO IS RECORD (blc_zon_id varchar2(128), lib_value varchar2(128));
    TYPE ASSO_TAB IS TABLE OF ASSO;
    Comment puis je faire dans ce cas pour y accéder avec une liste associative ?

    Merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    C'est un fichier proche du format .INI que tu as là.
    "Dans le temps", j'avais utilisé un package oracle tout fait pour aller lire dans un fichier .ini
    C'est juste un piste...

  5. #5
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    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
    Declare
    TYPE ASSO IS RECORD (blc_zon_id varchar2(128), lib_value varchar2(128));
    TYPE ASSO_TAB IS TABLE OF ASSO;
    r asso ;
    t asso_tab;
    Begin
      r.blc_zon := 'label1' ;
      r.lib_balue := 'l1' ;
      t(r.blc_zon) := r ;
      r.blc_zon := 'label2' ;
      r.lib_balue := 'l2' ;
      t(r.blc_zon) := r ;
       ...
       -- recherche rec label 1 --
       r := t('label1') ;
    End;

  6. #6
    Membre éprouvé Avatar de laurentleturgez
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 88
    Par défaut
    Merci beaucoup François ... ca fonctionne et ca dépote !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Interrogations sur le fonctionnement du SQL
    Par Zircoun dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/04/2012, 13h33
  2. Réponses: 6
    Dernier message: 29/07/2010, 12h41
  3. Initialisation des collections en PL/SQL
    Par Idsaw dans le forum PL/SQL
    Réponses: 1
    Dernier message: 19/06/2008, 01h00
  4. Réponses: 3
    Dernier message: 16/01/2007, 17h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo