Déclaration de requête SQL en XML

Déclaration de requête SQL en XML - SQL/NoSQL - Programmation

Marsh Posté le 16-11-2006 à 14:54:52    

Salut le forum,
 
Je suis à la recherche d'une dtd ou d'une exemple de fichier XML qui contiendrai non pas le résultat d'une requête SQL mais bel et bien la requête SQL elle même.
 
Le besoin est de pouvoir "stocker" sous la forme de fichier XML un ensemble de requête XML
 
Merci d'avance pour vos réponses

Reply

Marsh Posté le 16-11-2006 à 14:54:52   

Reply

Marsh Posté le 16-11-2006 à 15:03:31    

:heink:
 


<queries>
  <query>select * from truc</query>
  <query>select * from truc</query>
  <query>select * from truc</query>
</queries>


 
:heink:
 
ou à la limite :
 
http://david.manga-torii.com/views/v_attributs.xml
(y'a un lien vers ma dtd dans le fichier)


Message édité par MagicBuzz le 16-11-2006 à 15:03:37
Reply

Marsh Posté le 16-11-2006 à 17:21:47    

Merci mais ce n'est pas aussi simple que cela.
Je cherche une méthodologie déclarative permettant de couvrir la syntaxe compléte d'une requête SQL.
 
Pur exemple un peu simplet
 
<SQL result= “client_1”>
 <SELECT table= “client”>
  <FIELD_NAME>nom</FIELD_NAME >
  <FIELD_NAME>prenom</FIELD_NAME>
  <WHERE>
   <FIELD_NAME >nom</FIELD_NAME >
   <TYPE>EQUAL</TYPE >
   <VALUE>DUPONT</VALUE>
  </WHERE>
 </SELECT>
</SQL>
 
Parser et traduit en  
=> Select nom,prenom from client whete nom="DUPONT"
=> client 1 étant une donnée de récupération (table de hash par exemple)
 
 
si cela existe...


Message édité par paf27 le 16-11-2006 à 17:24:34
Reply

Marsh Posté le 16-11-2006 à 17:46:38    

sauf qu'une requête SQL, c'est un peu plus compliqué que ça à la base.
 
tu pourras toujours tenter de faire un DTD qui permet de modéliser une requête, mais je doute TRES fortement que tu y arrive sans faire une usine à gaz monstrueuse et buggée ;)

Reply

Marsh Posté le 16-11-2006 à 19:51:22    

MagicBuzz a écrit :

sauf qu'une requête SQL, c'est un peu plus compliqué que ça à la base.
 
tu pourras toujours tenter de faire un DTD qui permet de modéliser une requête, mais je doute TRES fortement que tu y arrive sans faire une usine à gaz monstrueuse et buggée ;)


 
L'impossible n'est pas Paf  ;)  
Concrétement, je sais exactement quoi faire si ce n'est cette histoire de dtd que j'aurai aimé déjà +/- normalisé.(Avec un petit outil open source java qui va bien  :D )
Il n'y aura pas que des instructions SQL simple à modéliser (Insert, select, create), pas d'index, de vue, etc...
 
Il ne s'agit pas d'un projet perso mais cela rentre dans un contexte professionnel

Reply

Marsh Posté le 16-11-2006 à 20:29:18    

Et tu sauras interpréter ce genre de requêtes toutes bêtes ?
 


select
(
   select max(tsc.prix)  
   from tsc  
   where tsc.codsoc = pro.codsoc  
   and tsc.achvte = 'A'
   and tsc.codpro = pro.codpro  
   and getdate() between nvl(tsc.datdeb, getdate()) and nvl(tsc.datfin, getdate()
) curprx, pro.codpro, tmpprm.nompro, fou.nomtie
from
(
   select top 1 nompro
   from
   (
      select nompro
      from prm
      where prm.codsoc = pro.codsoc
      and prm.codpro = pro.codpro
      and prm.codlan = fou.codlan
      union all
      select nompro
      from pro p
      where p.codsoc = pro.codsoc
      and p.codpro = pro.codpro
   ) tmp1prm
) tmpprm, tie fou, pro
where pro.codsoc = @codsoc
and pro.codpro = @codpro
and fou.codsoc = pro.codsoc
and fou.typtie = 'FOU'
and fou.sigtie = pro.sigfou


 
Genre, c'est pas bien compliqué, ça te retourne, pour un produit dans une société donné, le prix maximum d'achat, son libellé dans la langue du fournisseur, ou à défaut, le nom non localisé, ainsi que le nom du fournisseur.
 
Moi je vote et je dis que rien que pour ce genre de petites requêtes à deux balles, tu risques d'en chier grave... (et c'est loin d'être compliqué comme requête)


Message édité par MagicBuzz le 16-11-2006 à 20:31:50
Reply

Marsh Posté le 16-11-2006 à 20:52:14    

C'est plus un schéma XSD qu'une DTD qui """permetterait""" de faire ça :/

Reply

Marsh Posté le 16-11-2006 à 20:58:30    

ça tombe bien, mon exemple est un XSD en fait :)
 
mais ne va pas aussi loin, chuis pas maso

Reply

Marsh Posté le 16-11-2006 à 21:13:40    

MagicBuzz a écrit :

ça tombe bien, mon exemple est un XSD en fait :)
 
mais ne va pas aussi loin, chuis pas maso


 
C'est pas un outil super open source normalisé geek de la mort avec un nom à la tu ma vue version 12.18 dont j'ai nécessairement besoin..
J'ai la chance de savoir quelles seront les requêtes à déclarer, et cela n'ira pas plus loin qu'une double imbrication.
La norme XML est là pour cela. Je poste pas ici pour que l'on me démontre que comme avec sega, il y a toujours plus fort que toi ! A priori bien pensé, n'importe quelle requête SQL doit pouvoir être déclaré sous cette forme.
 

Reply

Marsh Posté le 16-11-2006 à 21:16:24    

Moi non plus, mon truc c'est pas un machin de Geek ope source de la mort, c'est un framework que je suis en train de développer pour le boulot :o

Reply

Marsh Posté le 16-11-2006 à 21:16:24   

Reply

Marsh Posté le 16-11-2006 à 21:20:22    

paf27 a écrit :

La norme XML est là pour cela. Je poste pas ici pour que l'on me démontre que comme avec sega, il y a toujours plus fort que toi ! A priori bien pensé, n'importe quelle requête SQL doit pouvoir être déclaré sous cette forme.


Justement, et t'as qu'a la faire à la freestyle, ne fait même pas de DTD, parse l'XML à la main comme ça... Parfois une DTD ou un XSD sont soit trop overkill, soit trop limité. Rien ne vaut un parsing à la main

Reply

Marsh Posté le 16-11-2006 à 21:56:03    

Sinon, je te laisse faire la XSD, mais à la limite, si je me suis pas planté, ma requête peut être traduite en XML de cette façon :
 


<sql>
  <query>
    <selectClause>
      <fields>
        <field type="subQuery" alias="curprx">
          <query>
            <selectClause>
              <fields>
                <field type="function" name="max">
                  <functionParameters>
                    <field type="field" name="prix" table="tsc"/>
                  </functionParameters>
                </field>
              </fields>
              <tables>
                <table type="table" name="tsc"/>
              </tables>
              <filters>
                <clause opperation="EQUAL">
                  <field type="field" name="codsoc" table="tsc"/>
                  <field type="field" name="codsoc" table="pro"/>
                </clause>
                <opperator type="AND"/>
                <clause opperation="EQUAL">
                  <field type="field" name="achvte" table="tsc"/>
                  <field type="constant" sqlType="varchar" value="A"/>
                </clause>
                <opperator type="AND"/>
                <clause opperation="EQUAL">
                  <field type="field" name="codpro" table="tsc"/>
                  <field type="field" name="codpro" table="pro"/>
                </clause>
                <opperator type="AND"/>
                <clause opperation="BETWEEN">
                  <field type="function" name="getdate"/>
                  <field type="function" name="nvl">
                    <functionParameters>
                      <field type="field" name="datdeb" table="tsc"/>
                      <field type="function" name="getdate"/>
                    </functionParameters>
                  </field>
                  <field type="function" name="nvl">
                    <functionParameters>
                      <field type="field" name="datfin" table="tsc"/>
                      <field type="function" name="getdate"/>
                    </functionParameters>
                  </field>
                </clause>
              </filters>
            </selectClause>
          </query>
        </field>
        <field type="field" name="codpro" table="pro"/>
        <field type="field" name="nompro" table="tmpprm"/>
        <field type="field" name="nomtie" table="fou"/>
      </fields>
      <tables>
        <table type="subQuery" alias="tmpprm">
          <query>
            <selectClause directive="TOP" directiveParameter="1">
              <fields>
                <field type="field" name="nompro"/>
              </fields>
              <tables>
                <table type="subQuery" alias="tmp1prm">
                  <query>
                    <selectClause>
                      <fields>
                        <field type="field" name="nompro"/>
                      </fields>
                    <selectClause>
                    <tables>
                      <table type="table" name="prm"/>
                    </tables>
                    <filters>
                      <clause opperation="EQUAL">
                        <field type="field" name="codsoc" table="prm"/>
                        <field type="field" name="codsoc" table="pro"/>
                      </clause>
                      <opperator type="AND"/>
                      <clause opperation="EQUAL">
                        <field type="field" name="codpro" table="prm"/>
                        <field type="field" name="codpro" table="pro"/>
                      </clause>
                      <opperator type="AND"/>
                      <clause opperation="EQUAL">
                        <field type="field" name="codlan" table="prm"/>
                        <field type="field" name="codlan" table="fou"/>
                      </clause>
                    </filters>
                  </query>
                  <statement type="UNION"/>
                  <query>
                    <selectClause>
                      <fields>
                        <field type="field" name="nompro"/>
                      </fields>
                    <selectClause>
                    <tables>
                      <table type="table" name="pro" alias="p"/>
                    </tables>
                    <filters>
                      <clause opperation="EQUAL">
                        <field type="field" name="codsoc" table="pro"/>
                        <field type="field" name="codsoc" table="p"/>
                      </clause>
                      <opperator type="AND"/>
                      <clause opperation="EQUAL">
                        <field type="field" name="codpro" table="pro"/>
                        <field type="field" name="codpro" table="p"/>
                      </clause>
                    </filters>
                  </query>
                </table>
              </tables>
            </selectClause>
          </query>
        </table>
        <table type="table" name="tie" alias="fou"/>
        <table type="table" name="pro">
      </tables>
      <filters>
        <clause opperation="EQUAL">
          <field type="field" name="codsoc" table="pro"/>
          <field type="variable" name="codsoc"/>
        </clause>
        <opperator type="AND"/>
        <clause opperation="EQUAL">
          <field type="field" name="codpro" table="pro"/>
          <field type="variable" name="codpro"/>
        </clause>
        <opperator type="AND"/>
        <clause opperation="EQUAL">
          <field type="field" name="codsoc" table="fou"/>
          <field type="field" name="codsoc" table="pro"/>
        </clause>
        <opperator type="AND"/>
        <clause opperation="EQUAL">
          <field type="field" name="typtie" table="fou"/>
          <field type="constant" sqlType="varchar" value="FOU"/>
        </clause>
        <opperator type="AND"/>
        <clause opperation="EQUAL">
          <field type="field" name="sigtie" table="fou"/>
          <field type="field" name="sigfou" table="pro"/>
        </clause>
      </filters>
    </selectClause>
  </query>
</sql>


 
A noter que ma sous-requête dans le FROM l'empêche d'être jointe avec les autres tables avec une clause "inner join" classique.
Par contre, avec les "outer join", certaines choses sont impossibles à faire sans l'utilisation de la syntaxe littérale. Rien que pour ça, c'est limite impossible de modéliser ton truc (j'en ai fait que la moitié dans mon exemple)
Je ne parle pas non plus des imbrications d'oppérateurs pour les filtres (gestions de parenthèses), etc.
 
Je te laisse t'amuser ne serait-ce que pour écrire le XSD. Niveau structure, je pense être resté cohérent, et y'a pas de niveau de trop...
 
Franchement, reviens sur Terre : tu peux partir dans un truc bancale qui permet de stocker tes 3 requêtes. Mais si c'est pour faire un prog boîteux, incapable de tirer profit de cet éclatement de la requête (pkoi tu veux passer en XML d'abors ?) et ne pas être capable de gérer tous les cas, autant rester au niveau du fichier texte. Ca marche tout aussi bien :spamafote:

Reply

Marsh Posté le 16-11-2006 à 21:58:28    

T'ain j'ai réussi à perdre 40 minutes de ma soirée sur ce truc juste pour lui démontrer que c'était débile :ouch:
 
Chuis fou moi :o


Message édité par MagicBuzz le 16-11-2006 à 22:35:50
Reply

Marsh Posté le 16-11-2006 à 21:59:41    

Tiens, pis je viens de me rendre compte que j'avais oublié le group by dans ma requête originale. Démerde-toi avec :sleep:

Reply

Marsh Posté le 16-11-2006 à 22:08:25    

Sinon, j'y pense... Pour avoir une ébauche de DTD "complète", t'as qu'à regarder la doc d'un SGBD... :spamafote:
 


SELECT [ ALL | DISTINCT ]
[ TOP expression [ PERCENT ] [ WITH TIES ] ]  
<select_list>  
<select_list> ::=  
    {  
            *  
      | { table_name | view_name | table_alias }.*  
      | {
          [ { table_name | view_name | table_alias }. ]
               { column_name | $IDENTITY | $ROWGUID }  
          | udt_column_name [ { . | :: } { { property_name | field_name }  
            | method_name ( argument [ ,...n] ) } ]
          | expression
          [ [ AS ] column_alias ]  
         }
      | column_alias = expression  
    } [ ,...n ]  
 
 
[ FROM { <table_source> } [ ,...n ] ]  
<table_source> ::=  
{
        table_or_view_name [ [ AS ] table_alias ] [ <tablesample_clause> ]  
        [ WITH ( < table_hint > [ [ , ]...n ] ) ]  
    | rowset_function [ [ AS ] table_alias ]  
        [ ( bulk_column_alias [ ,...n ] ) ]  
    | user_defined_function [ [ AS ] table_alias ]
    | OPENXML <openxml_clause>  
    | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]  
    | <joined_table>  
    | <pivoted_table>  
    | <unpivoted_table>  
}
<tablesample_clause> ::=  
    TABLESAMPLE [SYSTEM] ( sample_number [ PERCENT | ROWS ] )  
        [ REPEATABLE ( repeat_seed ) ]  
 
<joined_table> ::=  
{
    <table_source> <join_type> <table_source> ON <search_condition>  
    | <table_source> CROSS JOIN <table_source>  
    | left_table_source { CROSS | OUTER } APPLY right_table_source  
    | [ ( ] <joined_table> [ ) ]  
}
<join_type> ::=  
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN
 
<pivoted_table> ::=
        table_source PIVOT <pivot_clause> table_alias
 
<pivot_clause> ::=
        ( aggregate_function ( value_column )  
        FOR pivot_column  
        IN ( <column_list> )  
    )  
 
<unpivoted_table> ::=
        table_source UNPIVOT <unpivot_clause> table_alias
 
<unpivot_clause> ::=
        ( value_column FOR pivot_column IN ( <column_list> ) )  
 
<column_list> ::=
          column_name [ ,...n ]
 
 
 
[ WHERE <search_condition> ]
 
 
 
< search_condition > ::=  
    { [ NOT ] <predicate> | ( <search_condition> ) }  
    [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ]  
[ ,...n ]  
<predicate> ::=  
    { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression  
    | string_expression [ NOT ] LIKE string_expression  
  [ ESCAPE 'escape_character' ]  
    | expression [ NOT ] BETWEEN expression AND expression  
    | expression IS [ NOT ] NULL  
    | CONTAINS  
    ( { column | * } , '< contains_search_condition >' )  
    | FREETEXT ( { column | * } , 'freetext_string' )  
    | expression [ NOT ] IN ( subquery | expression [ ,...n ] )  
    | expression { = | < > | ! = | > | > = | ! > | < | < = | ! < }  
  { ALL | SOME | ANY} ( subquery )  
    | EXISTS ( subquery )     }  


 
Là, t'as un truc MEGA basic. T'as même pas de ORDER BY, de GROUP BY, de HAVING, de WITH, de INTO, etc.
 
Have fun


Message édité par MagicBuzz le 16-11-2006 à 22:10:28
Reply

Marsh Posté le 16-11-2006 à 22:25:48    

MagicBuzz, si tu passes dans la région, j'te paye une bière [:dawak]

Reply

Marsh Posté le 16-11-2006 à 22:35:12    

Une seule ? Bon, OK pour un formidable, sinon rien :o
 
T'habites où ? :D


Message édité par MagicBuzz le 16-11-2006 à 22:35:23
Reply

Marsh Posté le 16-11-2006 à 22:36:29    

Pas loin de strasbourg

Reply

Marsh Posté le 16-11-2006 à 22:46:25    

En plus y doit y avoir de la bonne bière :bounce:

Reply

Marsh Posté le 17-11-2006 à 09:12:22    

Ca a l'air pas mal tout ça, je vais dépioter à tête reposé
 
Merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed