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

Oracle Discussion :

Retrouver une valeur grace à un Column_name


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Par défaut Retrouver une valeur grace à un Column_name
    Pour mieux expliquer, j'ai 2 curseurs dans mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CURSOR cr_renouv IS
        SELECT *
        FROM artg_renouv_tar
        ORDER BY id_num_renouv_tar;
      rw_renouv cr_renouv%ROWTYPE;
     
      CURSOR cr_z IS
        SELECT column_name
        FROM user_tab_columns 
        WHERE table_name ='ARTG_RENOUV_TAR'
        AND column_name LIKE 'Z%'
        ORDER BY column_name;
      rw_z cr_z%ROWTYPE;
    dans la table artg_renouv_tar, les colonnes vont actuellement de Z1 à Z19, mais le système peut etre modifier, ce qui explique le second curseur. J'aimerais donc pouvoir récupérer la valeur Z voulue en utilisant les column_name trouver sans passer par des montagnes de IF..END IF ou des CASE, j'ai déjà essayer avec des executes immédiates mais j'obtiens rien (peut être que je l'utilise mal).

    Please, Help !!

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 22
    Par défaut
    Bonjour,

    Vous connaissez le type mais ne connaissez pas le nombre des colonnes.

    Une méthode 4 du SQL dynamique peut etre appliquée quand le nombre (ou le type) des colonnes n'est pas connu avant la compilation.

    Une réalisation varie fort par la langue d'une application cliente. Une réalisation de PL/SQL suit.

    Préparons une table
    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
     
    connect TEST_SCHEMA/TEST_SCHEMA@OR11203
     
    create table TEST_DYN_SQL
    (   ID number primary key,
        Z1 number,
        Z2 number
        )
    /
     
    Table créée.
     
    test_schema@OR11203> insert into TEST_DYN_SQL(ID, Z1, Z2) values (1,11,21);
    1 ligne créée.
     
    test_schema@OR11203> insert into TEST_DYN_SQL(ID, Z1, Z2) values (2,12,22);
    1 ligne créée.
     
    test_schema@OR11203> insert into TEST_DYN_SQL(ID, Z1, Z2) values (3,13,23);
     
    test_schema@OR11203> commit;
    Validation effectuée.
    Un script:
    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
    69
    70
     
    set serveroutput on
    declare
        V_QUERY constant varchar2(32000) := 'select T.* from TEST_DYN_SQL T where T.ID <= :ID ';
        A_ID_IN integer := 2;
     
        --Supposons les colonnes sont de le type NUMBER
        type V_ARR_TYPE is table of number index by pls_integer;
        V_COL_ARR   V_ARR_TYPE;
     
        V_CURSOR_NUM integer;
        V_DESC_TAB dbms_sql.desc_tab;
        V_NUMBER_OF_COL integer := 0;
        V_IGNORE integer;
        V_CURRENT_COL integer := 0;
        V_ROWS_FETCHED integer;
    begin
       V_CURSOR_NUM := dbms_sql.open_cursor;
       dbms_sql.parse(V_CURSOR_NUM, V_QUERY, dbms_sql.native);
     
       --Obtenons des noms des colonnes
       dbms_sql.describe_columns(V_CURSOR_NUM, V_NUMBER_OF_COL, V_DESC_TAB);
       --Un element de la collection reçu est un record et contient le nom, le type, la longuer et les autres attributs d'une colonne.
       V_CURRENT_COL := V_DESC_TAB.first;
       --Choisissons les colonnes nécessaires
       if(V_CURRENT_COL is not null) then
           loop
               if V_DESC_TAB(V_CURRENT_COL).col_name like 'Z%' then
                   --Préparons un variable pur recevoir le valeur de la colonne 
                   V_COL_ARR(V_CURRENT_COL) := null;
                   dbms_sql.define_column(V_CURSOR_NUM, V_CURRENT_COL, V_COL_ARR(V_CURRENT_COL)); 
     
                   --Utilisons le nom de la colonne d'une façon ou d'outre
                   dbms_output.put( V_DESC_TAB(V_CURRENT_COL).col_name || ' ');
               end if;
               V_CURRENT_COL := V_DESC_TAB.next(V_CURRENT_COL);
               exit when (V_CURRENT_COL is null);
           end loop;
           dbms_output.new_line;
       end if;
     
       --Remplissons le prédicat:
       dbms_sql.bind_variable(V_CURSOR_NUM, ':ID', A_ID_IN); 
     
       V_IGNORE := dbms_sql.execute(V_CURSOR_NUM);
     
       --Obtenons des linges de la réponse 
       loop
           V_ROWS_FETCHED := dbms_sql.fetch_rows(V_CURSOR_NUM);
           exit when V_ROWS_FETCHED = 0;
     
           V_CURRENT_COL := V_COL_ARR.first;
           if(V_CURRENT_COL is not null) then
               loop
                   --Obtenons le valeur de la colonne:
                   dbms_sql.column_value(V_CURSOR_NUM, V_CURRENT_COL, V_COL_ARR(V_CURRENT_COL));
     
                   --Utilisons le valeur de la colonne
                   dbms_output.put(V_COL_ARR(V_CURRENT_COL) || ' ');
     
                   V_CURRENT_COL := V_COL_ARR.next(V_CURRENT_COL);
                   exit when (V_CURRENT_COL is null);
               end loop;
               dbms_output.new_line;
           end if;
       end loop;
     
       dbms_sql.close_cursor(V_CURSOR_NUM);
    end;
    /
    Un résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Z1 Z2
    11 21
    12 22
     
    Procédure PL/SQL terminée avec succès.
    Supposons une application a modifié le nombre du colonnes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    alter table TEST_DYN_SQL
    add (Z3 number);
     
    Table modifiée.
     
    update TEST_DYN_SQL 
    set Z3 = 30 + ID;
     
    3 ligne(s) mise(s) à jour.
     
    commit;
    Validation effectuée.
    Effectuons le script de nouveau. Le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Z1 Z2 Z3
    11 21 31
    12 22 32
    Procédure PL/SQL terminée avec succès.
    Le script a survécu à la modification de la table.

Discussions similaires

  1. Retrouver une valeur dans une ligne
    Par patrick55 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/04/2008, 09h01
  2. [Tableaux] retrouver une valeur dans un tableau
    Par tininou dans le forum Langage
    Réponses: 3
    Dernier message: 26/01/2007, 22h04
  3. Retrouver une valeur ds la base de registre
    Par remi77 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 31/05/2006, 14h22
  4. Retrouver une valeur dans un champ en VBA
    Par friiitz dans le forum Access
    Réponses: 6
    Dernier message: 11/05/2006, 15h02
  5. [vb.net][dataset] Select : retrouver une valeur
    Par arnolem dans le forum Windows Forms
    Réponses: 8
    Dernier message: 10/01/2006, 17h26

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