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 :

Analyse d'une requête pour préparer sa structure de sortie


Sujet :

Oracle

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 185
    Points : 167
    Points
    167
    Par défaut Analyse d'une requête pour préparer sa structure de sortie
    Bonjour,
    Dans le cadre d'une maintenance en VB 6.0, j'aimerais traiter dynamiquement les requêtes pour en récupérer la structure de réponse avant son exécution.

    Grace à d'excellentes questions ci-dessous présentées, j'ai pu faire la base de ce qui m'interesse, à savoir parser une requête SQL pour en retirer des informations nécessaires à la construction de sa structure de résultat avec PL/SQL et Oracle 9i pour un site et 11g pour l'autre.

    Je m'explique par un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Ta.Toto, Tata, Titi FROM Ta INNER JOIN Ti ON Ta.Toto = Ti.Toto WHERE Tata = 'blablabla'
    Je veux récupérer dans mon projet VB que Ta.Toto est un numérique de longueur maximum m, dont le nom est Toto et si le NULL est autorisé. Idem pour Tata et Titi qui peuvent être des date, des varchar etc...

    La partie PL/SQL fait exactement ce que je cherche mais j'aimerais le récupérer dans mon projet VB 6.0 pour traiter certaines informations de structure avant d'exécuter la requête.

    Si vous avez des idées, je prend...

    Merci d'avance de vous penchez sur mon cas

    Liens :
    http://www.developpez.net/forums/d10118/bases-donnees/oracle/sql/pl-sql-parseur-requete/

    http://www.developpez.net/forums/d12...alyse-syntaxe/

    http://docs.oracle.com/cd/E11882_01/timesten.112/e21645/d_sql.htm#TTPLP058 cherchez Example 7: Describe columns

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous trouverez les informations nécessaires dans le catalogue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from user_tab_columns;

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 185
    Points : 167
    Points
    167
    Par défaut
    Merci pour la modif du code, j'avais oublié de le faire, et ta réponse mais...

    Je connais effectivement cette table/vue dans oracle permettant d'avoir une info concernant un champ d'une table, le problème, ou en tout cas ce que je cherche à faire, c'est que je ne connais pas la requête qui va être donnée, du coup je ne puis utiliser directement cette méthode. L'avantage d'utiliser dbms_sql donné dans les lien, c'est qu'on retrouve ces informations en donnant directement la requête que l'on souhaite exécuter...

    Donc la question reste ouverte...

  4. #4
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    DBMS_SQL.DESCRIBE_COLUMNS devrait pouvoir renvoyer ces infos.
    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 185
    Points : 167
    Points
    167
    Par défaut
    Une idée m'est venue ce matin, je me suis dit qu'en utilisant une fonction qui me retournerait une table me permettrait de récupérer ces information dans mon programme VB.

    Ca donne ça, dites-moi ce que vous en pensez...

    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
    -- Create the types to support the table function.
    DROP TYPE T_SQL_Parser;
    DROP TYPE T_Row_Parser;
     
    CREATE TYPE T_Row_Parser IS OBJECT (
      col_type		NUMBER,
      col_maxlen		NUMBER,
      col_name		VARCHAR2(32767),
      col_name_len		NUMBER,
      col_schema_name	VARCHAR2(32),
      col_schema_name_len	NUMBER,
      col_charsetid		NUMBER,
      col_charsetform	NUMBER,
      col_precision		NUMBER,
      col_scale		NUMBER,
      col_null_ok		NUMBER,
      col_type_name		VARCHAR2(32767),
      col_type_name_len	NUMBER);
    /
     
    CREATE TYPE T_SQL_Parser IS TABLE OF T_Row_Parser;
    /
     
    -- Build the table function itself.
    CREATE OR REPLACE FUNCTION Parse_SQL (SQLQuery VARCHAR2)
    	RETURN T_SQL_Parser
    AS
    	lcur_SQL		NUMBER;
    	lnbr_Result		NUMBER;
    	lnbr_FalseIs0ThenTrue	NUMBER;
    	lnbr_ColumnCount	NUMBER;
    	lrec_tab3		DBMS_SQL.DESC_TAB3;
    	lnbr_ColumnNbr		NUMBER;
    	ltab_SQLParser		T_SQL_Parser := T_SQL_Parser();
    BEGIN
    	lcur_SQL := DBMS_SQL.OPEN_CURSOR;
     
    	DBMS_SQL.PARSE(lcur_SQL, SQLQuery, DBMS_SQL.NATIVE);
     
    	lnbr_Result := DBMS_SQL.EXECUTE(lcur_SQL);
     
    	DBMS_SQL.DESCRIBE_COLUMNS3(lcur_SQL, lnbr_ColumnCount, lrec_tab3);
     
    	lnbr_ColumnNbr := lrec_tab3.first;
     
    	IF (lnbr_ColumnNbr IS NOT NULL) THEN
    		LOOP
    			IF (lrec_tab3(lnbr_ColumnNbr).col_null_ok) THEN
    				lnbr_FalseIs0ThenTrue := 1;
    			ELSE
    				lnbr_FalseIs0ThenTrue := 0;
    			END IF;
     
    			ltab_SQLParser.extend;
    			ltab_SQLParser(ltab_SQLParser.last) := T_Row_Parser(lrec_tab3(lnbr_ColumnNbr).col_type,
    									    lrec_tab3(lnbr_ColumnNbr).col_max_len,
    									    lrec_tab3(lnbr_ColumnNbr).col_name,
    									    lrec_tab3(lnbr_ColumnNbr).col_name_len,
    									    lrec_tab3(lnbr_ColumnNbr).col_schema_name,
    									    lrec_tab3(lnbr_ColumnNbr).col_schema_name_len,
    									    lrec_tab3(lnbr_ColumnNbr).col_charsetid,
    									    lrec_tab3(lnbr_ColumnNbr).col_charsetform,
    									    lrec_tab3(lnbr_ColumnNbr).col_precision,
    									    lrec_tab3(lnbr_ColumnNbr).col_scale,
    									    lnbr_FalseIs0ThenTrue,
    									    lrec_tab3(lnbr_ColumnNbr).col_type_name,
    									    lrec_tab3(lnbr_ColumnNbr).col_type_name_len);
     
    			lnbr_ColumnNbr := lrec_tab3.next(lnbr_ColumnNbr);
     
    			EXIT WHEN (lnbr_ColumnNbr IS NULL);
    		END LOOP;
    	END IF;
     
    	DBMS_SQL.CLOSE_CURSOR(lcur_SQL);
     
    	RETURN ltab_SQLParser;
    END;
    /
     
    -- Test it.
    SELECT *
      FROM TABLE(Parse_SQL('SELECT Champ1, Champ2, Champ3 
    			  FROM Table1 T1 INNER JOIN Table2 T2 ON T1.Champ1 = T2.Champ1'));

  6. #6
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Je n'ai pas analysé ton code mais l'idée est soit d'écrire une procédure/fonction qui se base sur DBMS_SQL.Describe_Columns qui peut être appelée depuis VB (exit le record du PL/SQL) soit d'investiguer coté VB comment exécuter du Sql dynamique méthode 4.

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 185
    Points : 167
    Points
    167
    Par défaut
    C'est exactement ce que j'ai fait, en tout ce que j'ai l'impression d'avoir fait... Une fonction basée sur DBMS_SQL.DESCRIBE_COLUMNS3...

    Qu'entends-tu par Sql dynamique méthode 4, je sais ce qu'est est un Sql dynamique avec l'instruction EXECUTE IMMEDIATE, mais le méthode 4, je ne vois pas... Pourrais-tu m'éclairer STP

    Merci

  8. #8
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Méthode 4 signifie l’habilité d’un programme d’accepter, interpréter, exécuter et afficher le résultat des requêtes SQL ad-hoc sans connaitre leur structure au moment de la compilation du programme (exemple sqlplus écrit en C ou SqlDevelopper écrit en Java).

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 185
    Points : 167
    Points
    167
    Par défaut
    OK, je comprend ce qu'est la méthode 4.

    Par contre, j'ai du accélérer le pas et du coup j'ai arrêté de plancher sur ce sujet vu que j'ai une méthode donnant satisfaction.

    Merci à vous pour ces conseils.

Discussions similaires

  1. requête pour connaître la structure d'une table
    Par laurentSc dans le forum Langage SQL
    Réponses: 1
    Dernier message: 17/06/2008, 11h22
  2. modifier une requête pour mysql 4.0.18
    Par lina01 dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/11/2006, 11h38
  3. EDBEngineError sur une requête pour MySQL
    Par Slyteck dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/08/2006, 14h17
  4. Une requête pour éditer plusieurs lignes.
    Par Anduriel dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/05/2006, 20h24
  5. Une requête pour un débutant...
    Par Viper7 dans le forum Access
    Réponses: 3
    Dernier message: 11/04/2006, 21h46

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