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 :

[PL/SQL][Oracle 8i] Variable de nom dynamique


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut [PL/SQL][Oracle 8i] Variable de nom dynamique
    Bonjour.

    Voici mon souci.

    J'ai un tableau contenant les noms des colonnes d'une table, ordonnés comme il faut. J'ai également un curseur sur la table.
    A partir de ce curseur, je dois concaténer les valeurs des colonnes de la table (ligne par ligne).

    Voici le squelette de la procédure:

    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
    PROCEDURE maprocedure IS
    
     CURSOR cur_matable IS
      SELECT * FROM matable;
    
     rec_matable matable%ROWTYPE;
    
     CURSOR cur_montableau IS
      SELECT nom_colonne
       FROM matableref
      WHERE nom_table = matable
       ORDER BY ordre_colonne;
    
     TYPE T_REC_tableau IS RECORD (
      nom_colonne ....
      long_colonne ...
      typ_colonne...
    
     TYPE TYP_TABLEAU IS TABLE OF T_REC_tableau INDEX BY BINARY_INTEGER ;
     tab_montableau TYP_TABLEAU;
    
    Begin
    
    -- remplissage de tab_montableau à partir de cur_montableau: OK
    
    OPEN cur_matable ;
      LOOP
       FETCH cur_matable INTO rec_matable ;
       EXIT WHEN cur_matable %NOTFOUND;
    
       ls_ligne := '';
       -- on crée la ligne en concaténant les valeurs des colonnes dans le bon ordre
       FOR i IN 1..longueur_montableau
       LOOP
        ls_ligne := ls_ligne || rec_matable.tab_montableau(i).nom_colonne;
       END LOOP;
    
     END LOOP;
    END;
    mon pb est ici: rec_matable.tab_montableau(i).nom_colonne

    je voudrais que tab_montableau(i).nom_colonne donne le nom de la colonne, qui ensuite, me donne la valeur de cette colonne à travers le curseur rec_matable.

    en gros, le principe des pointeurs de pointeurs, ou $$nomvariable=$mavariable=mavaleur en php

    comment contourner cela?

    merci

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Au cas où vous auriez plus simple, je vous explique le but de la procédure.

    Mon but est d'écrire dans un fichier les lignes d'une table ligne par ligne, avec les colonnes concaténées (et formatées) dans un ordre précis

    Cet ordre, je vais le récupérer dans une table de réfrence (qui contient les noms des tables, des colonnes et un ordre associé), et je renseigne tab_montableau.

    Ensuite, je parcoure la table et concatène les colonnes selon l'ordre de tab_montableau.

    Vu qu'il y a une trentaine de tables à extraire, je souhaite quelquechose de dynamique.
    Si je n'ai pas le choix, je mettrai tout en dur dans chaque procédure et zapperai la table de référence mais je préfère éviter.

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    J'avais trouvé une première solution mais le problème est le même.
    Le nom de la table est dynamique:

    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
    PROCEDURE CONCAT(nom_table IN VARCHAR2) IS
     ma_requete VARCHAR2(500);
     
     TYPE TYP_REF_CUR IS REF CURSOR ;
     mon_curseur TYP_REF_CUR ;
     
     mon_record nom_table%ROWTYPE;
      
    Begin
     ma_requete := 'SELECT ....... FROM ma_table';
     
     Open mon_curseur For ma_requete;
     LOOP
      FETCH mon_curseur INTO mon_record;
    
    .....
    Si 'ma_requete' était remplacé implicitement par sa valeur et que la déclaration du record fonctionnait, tout irait bien...

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    beaucoup de visites, pas beaucoup de réponses...
    serait-ce insurmontable?

  5. #5
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Tu es en quelle version d'oracle ? C'est peut-être pour cela que tu n'as pas de réponses :
    http://www.developpez.net/forums/showthread.php?t=30569

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    j'ai rajouté 8i

  7. #7
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Si j'ai compris ce que tu souhaites faire tu peux faire un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    id_cur := dbms_sql.open_cursor;
    dbms_sql.parse (id_cur, v_requete, dbms_sql.native);
    for i = 1 to nb_colonnes_table loop
       dbms_sql.define_column (id_cur, i, v_val_col, n);
    end loop;
    v_nblig := dbms_sql.execute (id_cur);
    v_nblig := dbms_sql.fetch_rows (id_cur);
    for i = 1 to nb_colonnes_table loop
        dbms_sql.column_value (id_cur_mov, 1, v_val_col);
        v_lig := v_lig || v_val_col;
    end loop;
    - v_val_col doit être déclaré en varchar2(n)
    - n est la longueur maxi de tes colonnes (si tu ne souhaites pas prendre de risque, mets 4000)
    - nb_colonnes_table est le nombre de colonnes dans ta table
    - dans ta variable v_requete, tu dois indiquer les colonnes dans l'ordre souhaité.

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

Discussions similaires

  1. Variable aux noms dynamiques
    Par thib3113 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 27/01/2014, 20h44
  2. Variable au nom "dynamique"
    Par cheverny dans le forum C#
    Réponses: 5
    Dernier message: 13/03/2009, 14h15
  3. créer une variable au nom dynamique?
    Par gwena54 dans le forum ASP
    Réponses: 1
    Dernier message: 22/07/2008, 11h51
  4. variable a nom dynamique
    Par yvesall dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/08/2007, 01h10
  5. [ProC][SQL] Utiliser une variable comme nom de curseur
    Par adiGuba dans le forum Interfaces de programmation
    Réponses: 1
    Dernier message: 06/12/2006, 11h55

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