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 :

[PL/SQL] SQL dynamique + lecture valeur


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Par défaut [PL/SQL] SQL dynamique + lecture valeur
    Bonjour à tous.

    Alors étant débutant en PL/SQL et ayant déjà pas mal utilisé ce forum pour faire mes premier pas..., je viens vers vos pour une question qui ne trouve pas réponse de mon côté.

    J'ai une fonction pl/sql qui doit me retourner une chaine (varchar2 ou clob pour plus de sécurité) qui contient un tableau html. Ce tableau se construit à partir d'une requête dynamique et la fonction que je réalise doit récupérer les type des colonnes pour gérer l'alignement à gauche ou droite selon le type de donnée.

    voici un exmple de tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    COLONNE1 de mon tableau               |             COLONNE2 de mon tableau
    ----------------------------------------------------------------------------
    Commentaire de la colonne1             |              valeur de  la colonne 1
    Commentaire de la colonne2             |              valeur de  la colonne 2
    Commentaire de la colonne3             |              valeur de  la colonne 3
    ...
    Voici le début de ma procédure qui déconne car elle ne me retourne pas ce que je souhaite.
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    (
    s_requete in varchar2, s_nomTable in varchar2
    )
    return clob
    /*'Construit un tableau a partir d''une requete, 
    ||la colonne 1 est celle des libelles, la seconde celle des donnees
    ||    - Parametres :
    ||        s_requete character varying : requete a traiter
    ||        s_listecolonne character varying : liste des colonnes
    ||    - Valeur retournee : 
    ||        tableau html -> tableau
    */
    as
    	s_html clob;
    	s_colonne clob;
    	s_libcol clob;
    	s_typecol number;
    	s_nomcol clob;
    	s_precision varchar2(15);
    	s_scale varchar2(15);
    
    	s_valcol clob;
    	s_valdate date;
    	
    	i integer DEFAULT 0;
    	e_nblig integer DEFAULT 0;
    
      c_typeDate integer :=12;
      c_typeNumber integer :=2;
    
      c           NUMBER;
      d           NUMBER;
      col_cnt     PLS_INTEGER;
      rec_tab     dbms_sql.desc_tab;
      LC$Query    clob := s_requete;
      LN$MaxCol   PLS_INTEGER := 0 ;
    BEGIN
    
       -- récupère le colonne de la requete --
        c := dbms_sql.open_cursor;
    
        dbms_sql.parse(c, LC$Query , dbms_sql.NATIVE);
    
        d := dbms_sql.execute(c);
    
        dbms_sql.describe_columns(c, col_cnt, rec_tab);
    
        LN$MaxCol := rec_tab.last ;
    
        -- si pas de ligne alors on renvoie une chaine vide
        IF LN$MaxCol = 0 THEN
    		    RETURN '';
        END IF;
    	  
      	  -- en tete du tableau
    	  s_html := '<table border="1"><col span="2" width="200">';
    	    
        For i in rec_tab.first .. rec_tab.last Loop
        
          s_nomcol := rec_tab(i).col_name ;      -- nom de la colonne
          s_typecol := rec_tab(i).col_type ;      -- type de la colonne
          s_precision := rec_tab(i).col_precision; -- masque numerique (precision)
          s_scale := rec_tab(i).col_scale; -- masque numerique (scale)
    
          
          -- ecriture de la rubrique dans le code HTML
    		  IF s_typecol = c_typeDate THEN --DATE
    			   -- lecture de la colonne et affectation dans une variable
    			   s_valdate := '20091212'; --ICI JE NE SAIS PAS COMMENT FAIRE !!
    			
    			s_html := s_html || '<tr><td class="libelle">'  || s_libcol || '</td><td class="info">' || to_char(s_valdate) || '</td></tr>';
    			
    		ELSIF s_typecol = c_typeNumber THEN --NUMBER
    			-- lecture de la colonne et affectation dans une variable
    			s_valcol := '12105652';--ICI JE NE SAIS PAS COMMENT FAIRE !!
    			
    			-- recuperation du masque numerique
    --ICI JE NE SAIS PAS COMMENT FAIRE !!
    			
    			s_html := s_html || '<tr><td class="libelle">' || s_libcol || '</td><td class="info" align="right">' || to_number(s_valcol, '999999999999') || '</td></tr>';
    
    		ELSE
    			-- lecture de la colonne et affectation dans une variable
    			s_valcol := 'toto ...';
    
    			IF s_valcol = '""' OR s_valcol = '" "'  OR trim(s_valcol) = '' OR (substr(s_valcol, 1, 1) = '"' AND substr(s_valcol, length(trim(s_valcol)), 1) = '"' AND trim(substr(s_valcol, 2, length(s_valcol) - 2)) = '') THEN
    				s_html := s_html || '<tr><td class="libelle">'  || s_libcol || '</td><td class="info">&nbsp;</td></tr>';
    			ELSIF substr(s_valcol, 1, 1) = '"' AND substr(s_valcol, length(trim(s_valcol)), 1) = '"' THEN
    				s_html := s_html || '<tr><td class="libelle">'  || s_libcol || '</td><td class="info">' || trim(substr(s_valcol, 2, length(s_valcol) - 2)) || '</td></tr>';
    			ELSE
    				s_html := s_html || '<tr><td class="libelle">'  || s_nomcol || '</td><td class="info">' || s_valcol || '</td></tr>';
    			END IF;
    			
    		END IF;
        End loop ;
    
    	s_html := s_html || '</table>';
    
    	RETURN s_html;
    end;
    Je ne sais pas comment récupérer le commentaire d'une colonne
    et je n'arrive pas à récupérer ma valeur de colonne

    merci d'avance de votre aide

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Par défaut
    Je m'auto répond déjà sur un premier point :
    la récupération des commentaires de colonnes

    j'ai créé une fonction dont voici le code

    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
     
     
    CREATE OR REPLACE  FUNCTION 
        "RENVOI_LIBELLE_COLONNE" (nom_table in varchar2,
    nom_col in varchar2)
    return varchar2
    as
    /*'Recherche du libelle d''une colonne de table
    ||  - Parametres : 
    ||      nom_table varchar : nom de la table
    ||      nom_col varchar : nom de la colonne
    ||  - Valeur retournee : 
    ||      renvoi le libelle de la colonne
    */
      lib_col varchar2(35) DEFAULT '';
    BEGIN
      SELECT 
    		comments
    	INTO
    		lib_col
    	FROM 
    		user_col_comments
    	WHERE 
    		table_name = upper(nom_table) AND
    		column_name = upper(nom_col);
     
    		RETURN lib_col; 
    end;
    Si cela peut servir à quelqu'un.

    Il ne me reste plus que l'a récupération de valeur...

  3. #3
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Par défaut
    c'est quoi pour toi la "valeur" d'une colonne?

    sa taille? genre 32 dans varchar2(32) ?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Tu peux récupérer les infos sur les types des colonnes dans user_tab_columns.
    Mais comme le souligne dyvim, ta demande n'est pas très claire.

Discussions similaires

  1. [ACCESS SQL] génération d'une valeur / ligne courante ?
    Par kikidrome dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/11/2005, 13h20
  2. [pb requête sql] Requête dynamique
    Par viny dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 15/09/2005, 12h31
  3. Réponses: 3
    Dernier message: 10/08/2005, 11h11
  4. Réponses: 3
    Dernier message: 24/05/2005, 08h19
  5. [PL/SQL] SQL Dynamique et curseur
    Par Loko dans le forum Oracle
    Réponses: 10
    Dernier message: 23/11/2004, 16h18

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