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

SQL Oracle Discussion :

xml : ne pas générer le bloc si les sous blocs sont vides [10g]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Par défaut xml : ne pas générer le bloc si les sous blocs sont vides
    Bonjour,
    Lors de l'écriture de la requète sql suivante formattée en XML :
    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
    SELECT XMLPARSE(document XMLSERIALIZE(document(
    SELECT XMLELEMENT("ReservedAreaList",
    	(SELECT XMLAgg(
    	   XMLELEMENT("ReservedArea",
    	      XMLELEMENT("ReservedAreaName", NON_CTL_AREA_NAME ),
    	      XMLELEMENT("ActivationPeriodList", 
    	         XMLELEMENT("ActivationPeriod",
    		   (SELECT XMLELEMENT("StartTime", min(TIME_ACT))
    		    FROM ACTLIST a
    		    WHERE a.AIRSPACE_ENV_NAME=c.AIRSPACE_ENV_NAME
    		      and a.NON_CTL_AREA_NAME=gl.NON_CTL_AREA_NAME#N_C_AREA)))))
    	 FROM N_C_AREA c,GRAPHICAL_SURFACE gl
    	 WHERE gl.AIRSPACE_ENV_NAME = c.AIRSPACE_ENV_NAME
    	   and gl.NON_CTL_AREA_NAME#N_C_AREA = c.NON_CTL_AREA_NAME
    	   and c.AIRSPACE_ENV_NAME = '&2'
    	)
    ) from dual
    ))) from dual;
    je Génère :
    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
    <ReservedAreaList>
     <ReservedArea>
      <ReservedAreaName>NORB</ReservedAreaName>
      <ActivationPeriodList>
        <ActivationPeriod>
          <StartTime>1000</StartTime>
        </ActivationPeriod>
      </ActivationPeriodList>
     </ReservedArea>
     <ReservedArea> 
      <ReservedAreaName>SA01</ReservedAreaName>
      <ActivationPeriodList>
        <ActivationPeriod>
          <StartTime/>
        </ActivationPeriod>
      </ActivationPeriodList> 
     </ReservedArea> 
    </ReservedAreaList>
    On voit que pour le deuxième ActivationPeriod il n'y a pas de StartTime, dans ce cas je ne devrais pas avoir ni le bloc StartTime ni le bloc parent ActivationPeriod, je devrais avoir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     <ReservedArea>
      <ReservedAreaName>SA01</ReservedAreaName>
      <ActivationPeriodList/>
     </ReservedArea>
    Quelqu'un aurait t'il une idée sur la reformulation de la requète ?
    Merci de votre aide

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Peut-être avec un CASE :
    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
    SELECT XMLPARSE(document XMLSERIALIZE(document(
    SELECT XMLELEMENT("ReservedAreaList",
        (SELECT XMLAgg(
           XMLELEMENT("ReservedArea",
              XMLELEMENT("ReservedAreaName", NON_CTL_AREA_NAME ),
              XMLELEMENT("ActivationPeriodList", 
              case
                when exists (select null
                               from ACTLIST a
                              WHERE a.AIRSPACE_ENV_NAME = c.AIRSPACE_ENV_NAME
                                and a.NON_CTL_AREA_NAME = gl.NON_CTL_AREA_NAME#N_C_AREA
                                and a.TIME_ACT is not null)
                then XMLELEMENT("ActivationPeriod",
                       (SELECT XMLELEMENT("StartTime", min(TIME_ACT))
                        FROM ACTLIST a
                        WHERE a.AIRSPACE_ENV_NAME=c.AIRSPACE_ENV_NAME
                          AND a.NON_CTL_AREA_NAME=gl.NON_CTL_AREA_NAME#N_C_AREA))
              end)))
         FROM N_C_AREA c,GRAPHICAL_SURFACE gl
         WHERE gl.AIRSPACE_ENV_NAME = c.AIRSPACE_ENV_NAME
           AND gl.NON_CTL_AREA_NAME#N_C_AREA = c.NON_CTL_AREA_NAME
           AND c.AIRSPACE_ENV_NAME = '&2'
        )
    ) FROM dual
    ))) FROM dual;

  3. #3
    Expert confirmé 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
    Par défaut
    Je sens (ou de moins je le souhaite) qu'une autre solution devrait exister.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Oui peut-être bien avec une jointure externe :
    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
    SELECT XMLPARSE(document XMLSERIALIZE(document(
    SELECT XMLELEMENT("ReservedAreaList",
        (SELECT XMLAgg(
           XMLELEMENT("ReservedArea",
              XMLELEMENT("ReservedAreaName", NON_CTL_AREA_NAME ),
              XMLELEMENT("ActivationPeriodList"
                       , nvl2(a.TIME_ACT_MIN
                            , XMLELEMENT("ActivationPeriod", XMLELEMENT("StartTime", a.TIME_ACT_MIN))
                            , null)
                        )))
          FROM N_C_AREA c,GRAPHICAL_SURFACE gl
     LEFT JOIN ( SELECT AIRSPACE_ENV_NAME, NON_CTL_AREA_NAME, min(TIME_ACT) as TIME_ACT_MIN
                   FROM ACTLIST
               GROUP BY AIRSPACE_ENV_NAME, NON_CTL_AREA_NAME) a
            ON a.AIRSPACE_ENV_NAME = c.AIRSPACE_ENV_NAME
           AND a.NON_CTL_AREA_NAME = gl.NON_CTL_AREA_NAME#N_C_AREA
         WHERE gl.AIRSPACE_ENV_NAME = c.AIRSPACE_ENV_NAME
           AND gl.NON_CTL_AREA_NAME#N_C_AREA = c.NON_CTL_AREA_NAME
           AND c.AIRSPACE_ENV_NAME = '&2'
        )
    ) FROM dual
    ))) FROM dual;

  5. #5
    Membre éprouvé Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Par défaut
    Merci de vos suggestions. Mais j'ai du revoir ma requète car le champ StartTime n'est pas un champ simple, il requiert l'utilisation d'une table temporaire. Quoi qu'il en soit avec la réécriture de ma requète mon problème a disparu :
    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
    SELECT XMLPARSE(document XMLSERIALIZE(document(
    SELECT
    XMLELEMENT("ReservedAreaList",
    (SELECT XMLAgg(
       XMLELEMENT("ReservedArea",
          XMLELEMENT("ReservedAreaName", NON_CTL_AREA_NAME ),
          XMLELEMENT("ActivationPeriodList", 
    	 (SELECT XMLAgg(
    	    XMLELEMENT("ActivationPeriod",
    		XMLELEMENT("StartTime",TIME_COURANT),
    		XMLELEMENT("EndTime",TIME_SUIVANT)))
    	  FROM TIME_TMP
    	  WHERE NON_CTL_AREA_NAME = c.NON_CTL_AREA_NAME))))
    FROM N_C_AREA c,GRAPHICAL_SURFACE gl
    WHERE gl.AIRSPACE_ENV_NAME = c.AIRSPACE_ENV_NAME
      AND gl.NON_CTL_AREA_NAME#N_C_AREA = c.NON_CTL_AREA_NAME
      AND c.AIRSPACE_ENV_NAME = 'MAASNEW')
    ) FROM dual
    ))) FROM dual;
    Avec le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    XMLPARSE(DOCUMENTXMLSERIALIZE(DOCUMENT(SELECTXMLELEMENT("RESERVEDAREALIST",(SELE
    --------------------------------------------------------------------------------
    <ReservedAreaList>
      <ReservedArea>
        <ReservedAreaName>NORB</ReservedAreaName>
        <ActivationPeriodList/>
      </ReservedArea>
      <ReservedArea>
        <ReservedAreaName>SA01</ReservedAreaName>
        <ActivationPeriodList/>
      </ReservedArea>
    </ReservedAreaList>

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/09/2011, 17h55
  2. Réponses: 4
    Dernier message: 31/10/2009, 00h29
  3. [XML] Ne pas afficher les balises vides
    Par ludo.guy dans le forum Reports
    Réponses: 0
    Dernier message: 03/10/2007, 13h01
  4. exceptions plsql dans les sous blocs
    Par r83 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 03/04/2007, 00h33
  5. [Applet][XML] Ne pas interpréter les caractères spéciaux
    Par leminipouce dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 28/07/2005, 17h15

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