+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Nouveau Membre du Club
    Inscrit en
    juin 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : juin 2005
    Messages : 70
    Points : 30
    Points
    30

    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 régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    septembre 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : septembre 2010
    Messages : 87
    Points : 95
    Points
    95

    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
    Nouveau Membre du Club
    Inscrit en
    juin 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : juin 2005
    Messages : 70
    Points : 30
    Points
    30

    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 :
    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 habitué
    Homme Profil pro
    Ingénieur d'étude Mainframe
    Inscrit en
    septembre 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    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 : 114
    Points
    114

    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 régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    septembre 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : septembre 2010
    Messages : 87
    Points : 95
    Points
    95

    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 régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    septembre 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : septembre 2010
    Messages : 87
    Points : 95
    Points
    95

    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 habitué
    Homme Profil pro
    Ingénieur d'étude Mainframe
    Inscrit en
    septembre 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    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 : 114
    Points
    114

    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 :
    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
    Nouveau Membre du Club
    Inscrit en
    juin 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : juin 2005
    Messages : 70
    Points : 30
    Points
    30

    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é Sénior
    Homme Profil pro
    Inscrit en
    mai 2002
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : mai 2002
    Messages : 3 117
    Points : 5 157
    Points
    5 157

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •