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

DB2 Discussion :

AS400 SQL et instruction WITH


Sujet :

DB2

  1. #1
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 70
    Points : 50
    Points
    50
    Par défaut AS400 SQL et instruction WITH
    Bonjour,

    J'ai un sql avec utilisation de l'instruction WITH pour un fichier temporaire.
    Si ce dernier ne contient aucun enregsitrement je souhaite que le reste du sql ne s'exécute pas.
    Une instruction existe-t-elle pour réaliser ceci ?
    Pour le moment j'utilise un select count > 0 du fichier temp dans la clause where du SQL suivant...

    Merci Arnaud

  2. #2
    Membre actif
    Homme Profil pro
    Architecte technique & logiciel IBM i
    Inscrit en
    Septembre 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique & logiciel IBM i
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2010
    Messages : 179
    Points : 275
    Points
    275
    Par défaut
    Ton instruction est "autonome" (dans un requêteur), dans une procédure stockée ou embarquée dans un programme ? Pour les deux dernières solutions, tu dois pouvoir tester le SQLSTATE : 02000 signifie qu'aucun enregistrement n'est lu (cf. doc pour la liste exhaustive des valeurs de SQLSTATE).

  3. #3
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    Oui, mais dans mon cas c'est une suite d'instructions dans un DECLARE alors je ne sais pas si on peut tester le résultat de chaque...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DECLARE X CURSOR WITH RETURN FOR                    
    WITH TEMP_Z AS(                                       
    select NPROPR, DAPLPR FROM  Z p1                    
    WHERE  ...  ),                  
    TEMP_Y AS(                                            
    SELECT                                                     
    NRUPHR,  DRUPHR, NPROHR, AOPEHR, COPEHR, CCTGHR, CTHMHR,   
    NENTHR, APPRHR, QMQCHR, CRCAHR, NBLRHR, QMQCLAL, NBLGRAL   
    FROM Y
    WHERE ...)
    SELECT etc....
    ....

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur d'étude Mainframe
    Inscrit en
    Septembre 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur d'étude Mainframe
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 61
    Points : 124
    Points
    124
    Par défaut
    Citation Envoyé par pwrdwnsys Voir le message
    SQLSTATE : 02000 signifie qu'aucun enregistrement n'est lu
    Vrai! Mais dans un programme, il est plus simple de tester SQLCODE = 100

  5. #5
    Membre actif
    Homme Profil pro
    Architecte technique & logiciel IBM i
    Inscrit en
    Septembre 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique & logiciel IBM i
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2010
    Messages : 179
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par Arrnno Voir le message
    Oui, mais dans mon cas c'est une suite d'instructions dans un DECLARE alors je ne sais pas si on peut tester le résultat de chaque...
    [....]
    Si c'est dans une seule instruction, si à l'ouverture du curseur ta table temporaire ne contient rien, la suite de l'instruction ne durera pas longtemps, et je pense même que le moteur SQL arrêtera tout de suite...

  6. #6
    Membre actif
    Homme Profil pro
    Architecte technique & logiciel IBM i
    Inscrit en
    Septembre 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique & logiciel IBM i
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2010
    Messages : 179
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par Skylyn Voir le message
    Vrai! Mais dans un programme, il est plus simple de tester SQLCODE = 100
    Pourquoi ? un if SQLSTATE < "02000" se code aussi bien qu'un if SQLCODE < "100".

    Il me semble que le SQLSTATE est plus précis, puisque pour un SQLSTATE, tu peux avoir plusieurs SQLCODE.

    d'ailleurs, dans la doc SQL : "SQLSTATE is the preferred standard return code. It provides application programs with return
    codes for common error conditions found among the DB2 products".

    Mais c'est comme tout, une question d'habitude. Les 2 sont valables.

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur d'étude Mainframe
    Inscrit en
    Septembre 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur d'étude Mainframe
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 61
    Points : 124
    Points
    124
    Par défaut
    Oui je suis d'accord ça se code de la même manière :

    que ce soit SQLCODE = 100 ou SQLSTATE = 2000

    L'avantage que je trouve au SQLCODE = 100 c'est juste que si tu "fetches" le curseur, ça veut dire que t'es positionné sur la dernière ligne et si tu as ça sur un SELECT c'est juste qu'aucune ligne n'est renvoyée.

    Comme tu dis, un SQLSTATE peut correspondre à plusieurs SQLCODE.

    C'est un peu embêtant car pour un SQLCODE donné tu as une (ou plusieurs) raison(s) valable(s).

    Par exemple un -551, tu sais tout de suite, sans avoir à comparer le SQLSTATE, que tu n'es pas "granté" sur la table.

    Ou encore un -206 te dira, sans besoin du SQLSTATE, que la colonne n'existe pas dans le "contexte" (vue ou table).

    Et ceci est vrai quelque soit le SQLCODE (-805,...)

    D'ailleurs, c'est plus simple à comparer, je trouve (c'est un avis perso)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    EVALUATE SQLCODE
       WHEN 0
          DISPLAY 'Deroulement Correct'
       WHEN 100
          DISPLAY 'Pas trouvé ou fin curseur'
       WHEN OTHER
          DISPLAY 'Erreur DB2'
    END-EVALUATE

  8. #8
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    Merci pour ces précisions.
    J'en reste donc à mon
    "select count > 0 du fichier temp dans la clause where du SQL suivant"
    Cdlt Arnaud

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    J'ai un gros doute sur la pertinence du count> 0.

    Quelle est la requete actuelle ?

    Au passage une instruction WITH ne crée pas de fichier temporaire, en fait elle ne crée pas de fichier du tout.


    Une meilleur approche serai de faire un explain de votre requête pour voir ce que l'optimiseur SQL fait vraiment

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 19/05/2008, 17h55
  2. as400 sql/QUERY probleme de dates
    Par philswiss dans le forum Requêtes
    Réponses: 1
    Dernier message: 19/07/2007, 06h16
  3. Réponses: 3
    Dernier message: 10/01/2007, 11h22
  4. Question sur instruction With imbriquée
    Par LadyWasky dans le forum Bases de données
    Réponses: 2
    Dernier message: 14/10/2005, 11h26
  5. Problème de requête SQL avec instruction TRANSFORM
    Par Nosper dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/06/2005, 16h15

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