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 :

Parcour dynamique d'un enregistrement


Sujet :

PL/SQL Oracle

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut Parcour dynamique d'un enregistrement
    Bonjour à tous. J'aimerais savoir s'il est possible de copier des données issues d'un record dans un tableau sans passer par le nom des colonnes. Clairement, j'aimerai pouvoir parcourir un record grâce à un indice numérique et non pas par le nom des colonnes.

    Voici le résultat que j'aimerais avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    --Type de tableau
    TYPE ONE_DIM_ARRAY IS TABLE OF VARCHAR2(127) INDEX BY BINARY_INTEGER;
     
    --Variables
    v_Array ONE_DIM_ARRAY;
    v_Record ma_table%ROWTYPE;
     
    --J'enregistre la ligne de ma table dans le record (ma table ne contient qu'une ligne)
    SELECT * INTO v_Record FROM ma_table;
     
    --Copie du record dans le tableau
    v_Array(1) := v_Record.id;
    v_Array(2) := v_Record.created_on;
    etc...
    Au lieu de faire v_Record.nom_colonne pour récupérer la valeur, existe-t-il un moyen de faire v_Record(1) pour récupérer la valeur (je sais que cette écriture n'existe pas pour les record, c'est pour illustrer ce que j'aimerai faire)

    La base est une 10g2

    Merci de votre aide car pour le moment le problème reste insoluble.

    Djaydine

  2. #2
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Je me pencherai vers le package DBMS_SQL qui, si je me souvient bien, permet de s'affranchir du nom des colonnes.
    La doc Oracle est ici : http://download.oracle.com/docs/cd/B...l.htm#ARPLS058

  3. #3
    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
    DECLARE
      TYPE TR IS TABLE OF la_table%ROWTYPE INDEX BY binary_integer;
      TabR tr;
    BEGIN
      SELECT *
      BULK   collect
      INTO   TabR
      FROM   la_table
      WHERE  ROWNUM<= 1
      ;
      dbms_output.put_line(tabR(1).la_colonne);
    END;

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Par défaut
    Une extension à la question initiale : est-ce qu'il est possible de définir un tableau, non pas à partir de la structure d'une table, mais à partir de variables décrites une à une manuellement ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    Merci xdescamp, je vais regarder de ce côté là.

    SheikYerbouti, merci de ta réponse mais dans ton exemple j'ai quand même besoin de connaitre le nom de la colonne à laquelle je veux accéder.

    dgi77, ce que tu cherches à faire c'est typiquement ce que j'ai écrit dans mon exemple de code sous le commentaire "copie du record dans le tableau". Il suffit que tu remplace v_Record.id par une variable de ton choix.

    Sinon si quelqu'un a une solution clé en main je suis preneur. Il y a si peu d'exemple sur Internet concernant ce problème et ça permettrait pourtant de faire des procédures totalement générique.

    Merci à tous

    Djaydine

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    Pour ceux qui en auraient besoin, xdescamp a donné la bonne piste avec son lien et le package DBMS_SQL. Cliquez sur son lien et regardez l'exemple 8. Dès que j'aurais un exemple plus concret je le mettrai ici.

    Djaydine

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Voilà un exemple largement inspiré par la procédure print_table du Tom Kyte.
    Mais, n'oubliez pas que souvent générique c’est simplement un synonyme pour désastre.

    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
    67
    68
     
    CREATE OR REPLACE Package Pkg_Ultra_Generique AUTHID CURRENT_USER Is
      Type Big_Array_aa Is Table Of Varchar(127) Index By Binary_Integer;
      Procedure Lecture_Genrerique (
        p_query    In  Varchar2,
        p_array    Out Big_Array_aa
      );
    End;
    /
    CREATE OR REPLACE Package Body Pkg_Ultra_Generique Is
      Procedure Lecture_Genrerique (
        p_query    In  Varchar2,
        p_array    Out Big_Array_aa
      ) Is
        l_theCursor     integer default dbms_sql.open_cursor;
        l_columnValue   varchar2(4000);
        l_status        integer;
        l_descTbl       dbms_sql.desc_tab;
        l_colCnt        number;
        l_ind           binary_integer := 0;
      Begin
        execute immediate
        'alter session set 
            nls_date_format=''dd-mon-yyyy hh24:mi:ss'' ';
     
        dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );
        dbms_sql.describe_columns
        ( l_theCursor, l_colCnt, l_descTbl );
     
        for i in 1 .. l_colCnt loop
            dbms_sql.define_column
            (l_theCursor, i, l_columnValue, 4000);
        end loop;
     
        l_status := dbms_sql.execute(l_theCursor);
     
        while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
            for i in 1 .. l_colCnt loop
                dbms_sql.column_value
                ( l_theCursor, i, l_columnValue );
                p_array(l_ind+i) := SubStr(To_Char(l_columnValue),1, 127);
            end loop;
            l_ind := l_ind + l_colCnt;
        end loop;
        execute immediate
            'alter session set nls_date_format=''dd-MON-rr'' ';
    exception
        when others then
          execute immediate
              'alter session set nls_date_format=''dd-MON-rr'' ';
          raise;
      End;
    End;
    /
    declare
      -- Non-scalar parameters require additional processing 
      p_array pkg_ultra_generique.big_array_aa;
    begin
      -- Call the procedure
      pkg_ultra_generique.lecture_genrerique(p_query => 'select employee_id, first_name, last_name from hr.employees',
                                             p_array => p_array);
      For i In 1..p_array.Count() Loop
        Dbms_output.put_line(p_array(i));
      End Loop;                                         
      Dbms_output.put_line('-----------------------');
      Dbms_output.put_line(p_array.Count());
    end;
    /

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    Abosulument d'accord avec toi mnitu, la généricité cause, dans l'immense majorité des cas plus de problèmes qu'elle n'en résout. Cependant, dans mon contexte, avoir ce parcour générique me permet de gagner énormément de temps dans le traitement des mes tables.

    Si j'explique mon contexte peut-être que quelqu'un aura une meilleure solution que la mienne.

    Je dois déscendre en base de données des matrices au format CSV (ça c'est pas le problème). Globalement, ces matrices ont toutes le même format :
    - les 4 premières colonnes de la matrice ne changent jamais
    - les colonnes suivantes, après les 4 premières, sont numérotées de C1 à CN.

    Le problème que j'ai c'est que dans les colonnes C1 à CN, le N est variable. J'aurai une matrice avec des colonnes de C1 à C20, d'autres de C1 à C23, d'autres de C1 à C30, etc...
    Le format de ces matrices ne peut pas être modifié car elles viennent d'un client.

    Jusqu'à présent, j'avais une procédure par nombre de colonne possible (une procédure pour les matrices de C1 à C20, une autre pour C1 à C23, etc.). Grâce à cette procédure générique fournie par mnitu (que je remercie au passage), j'aurai une seule procédure qui pourra traiter toutes les matrices et ce, quelque soit le nombre de colonnes.
    Evidemment, si j'avais eu des matrice avec un nombre de colonnes fixe tout aurait été plus facile.

    En tout cas merci pour la procédure, Et si quelqu'un a une autre solution je suis evidemment preneur.

    Djaydine

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

Discussions similaires

  1. [Débutant] Figures dynamiques et leur enregistrement, possible?
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 2
    Dernier message: 22/07/2010, 19h59
  2. Formulaire dynamique, recuperation d'enregistrement
    Par pooi1 dans le forum VBA Access
    Réponses: 4
    Dernier message: 19/06/2007, 19h16
  3. Parcours dynamique des éléments d'un form
    Par leminipouce dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 02/10/2006, 19h09
  4. Parcours dynamique des champs
    Par cosmos38240 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/11/2005, 14h54
  5. Enregistrement issu d'un curseur dynamique
    Par vanessaf22 dans le forum SQL
    Réponses: 26
    Dernier message: 15/04/2004, 13h26

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