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 :

Récupération d'un nom de champ d'une table pour alimenter un curseur


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Récupération d'un nom de champ d'une table pour alimenter un curseur
    Bonjour à tous,

    Je dois crééer plusieurs rapport expoter en Excell. Jusqu'à la pas de problème pour l'exportation mais j'aimerais pouvoir appeler une fonction en passant en paramètre le nom du champs que je dois extraire afin d'éviter de répéter toujours le même code pour chaque rapport.

    Mon problème vient du fait que je n'arrive pas à joindre le contenu de ma variable au curseur de ma fonction.

    La variable s'appelle v_field. dans laquelle est stocké le nom du champs

    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
    FUNCTION getRapport(schemalocal IN varchar2,  ???v_field )
    RETURN  VARCHAR2 
    IS
        c_data          CURSORTYPE;
        cur_rec         table.frm_steinert%ROWTYPE;
        
                 
    BEGIN
    
      v_curseur := 'SELECT * FROM '|| schemalocal ||'.frm_steinert ORDER BY patientid,dateconsultation';
      OPEN c_data FOR v_curseur;    
      FETCH c_data INTO cur_rec;
    
     WHILE (c_data % FOUND) LOOP
      -- Verifie si le patient est valide
      IF( utils.getValidPatient(schemalocal,cur_rec.patientid) = 'Y') THEN
        IF ( ???v_field IS NOT NULL ) THEN
        
          IF (v_cpt = 1) THEN
          
            v_date_debut := cur_rec.dateconsultation;
            v_date_visite := cur_rec.dateconsultation;
            v_s :=    utils.getpatientcode(schemalocal,cur_rec.patientid) ||tab;
          END IF;
        
          v_date := cur_rec.dateconsultation - v_date_visite;
          IF (v_date_visite = cur_rec.dateconsultation) THEN
              v_s1 :=  v_s1 ||  ???v_field ||tab;
          END IF;
    
      END IF;
      FETCH c_data INTO cur_rec; 
    END LOOP;
    L'appel de la fonction se fait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    v_rapport       VARCHAR2(50) := 'paco2';
    v_final := v_final || utils.getRapport(schemalocal,v_rapport);
    L'endroit ou j'ai mis ???v_field devrait être normalement cur_rec. + le contenu de la variable v_field


    Merci d'avance pour votre aide

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    J'espère que quelqu'un pourra te proposer quelque chose de plus propre ne serait-ce que sur les histoires d'injection... mais au pire, tu peux construire ça dans ton curseur dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        v_curseur := 'SELECT ' || v_field || ' AS COL_TO_TEST,  a.* FROM '|| schemalocal ||'.frm_steinert a ORDER BY patientid,dateconsultation';
    Ensuite, ce champ, tu y fais référence en dur par COL_TO_TEST dans le reste de ton code.

    Note :
    J'ai rajouté le "a" pour qualifier la table... mais tu n'aurais pas ce problème si tu ne faisais pas SELECT *, ce que tout le monde te déconseillera par ailleurs.

    EDIT :
    Regarde comment binder les variables, notamment DBMS_ASSERT pour les noms d'objets dynamiques

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  3. #3
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Je ne vois pas d'autres solution non plus que celle de Pacmann.
    Utiliser un Alias pour ton/tes champs de sortie mais faut-il que ce dernier soit de même format pour toutes les tables interrogeables

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci à Pacmann et à Scriuiw d'avoir pris le temps de me répondre, c'est apprécié. Je met cela en pratique tout se suite

    @+

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

Discussions similaires

  1. récupérer la liste des noms des champs d'une table
    Par la_didise dans le forum Access
    Réponses: 2
    Dernier message: 29/05/2006, 16h55
  2. Modifier nom de champ d'une table Paradox 7
    Par teska dans le forum Bases de données
    Réponses: 3
    Dernier message: 02/11/2004, 13h09
  3. Nom de Champ dans une table pour utiliser For/Next
    Par Mulele dans le forum Access
    Réponses: 6
    Dernier message: 30/10/2004, 13h28
  4. nom des champs d'une table
    Par K-ZimiR dans le forum Requêtes
    Réponses: 6
    Dernier message: 22/04/2004, 14h21
  5. Récupération des noms de champs d'une table
    Par Battomura dans le forum SQL
    Réponses: 2
    Dernier message: 24/03/2003, 10h00

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