Précédent   Forum du club des développeurs et IT Pro > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/11/2012, 12h17   #1
Arrnno
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 70
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 70
Points : 28
Points : 28
Envoyer un message via MSN à Arrnno
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
Arrnno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 07h35   #2
pwrdwnsys
Membre régulier
 
Homme Thomas
Architecte technique
Inscription : septembre 2010
Messages : 64
Détails du profil
Informations personnelles :
Nom : Homme Thomas
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Architecte technique

Informations forums :
Inscription : septembre 2010
Messages : 64
Points : 72
Points : 72
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).
pwrdwnsys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 16h48   #3
Arrnno
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 70
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 70
Points : 28
Points : 28
Envoyer un message via MSN à Arrnno
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....
....
Arrnno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2012, 22h29   #4
Skylyn
Membre habitué
 
Homme Julien Guiffroy
Ingénieur d'étude Mainframe
Inscription : septembre 2012
Messages : 61
Détails du profil
Informations personnelles :
Nom : Homme Julien Guiffroy
Âge : 27
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 : 113
Points : 113
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
Skylyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 08h16   #5
pwrdwnsys
Membre régulier
 
Homme Thomas
Architecte technique
Inscription : septembre 2010
Messages : 64
Détails du profil
Informations personnelles :
Nom : Homme Thomas
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Architecte technique

Informations forums :
Inscription : septembre 2010
Messages : 64
Points : 72
Points : 72
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...
pwrdwnsys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 08h22   #6
pwrdwnsys
Membre régulier
 
Homme Thomas
Architecte technique
Inscription : septembre 2010
Messages : 64
Détails du profil
Informations personnelles :
Nom : Homme Thomas
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Architecte technique

Informations forums :
Inscription : septembre 2010
Messages : 64
Points : 72
Points : 72
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.
pwrdwnsys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 21h31   #7
Skylyn
Membre habitué
 
Homme Julien Guiffroy
Ingénieur d'étude Mainframe
Inscription : septembre 2012
Messages : 61
Détails du profil
Informations personnelles :
Nom : Homme Julien Guiffroy
Âge : 27
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 : 113
Points : 113
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
Skylyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2012, 12h31   #8
Arrnno
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 70
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 70
Points : 28
Points : 28
Envoyer un message via MSN à Arrnno
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
Arrnno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2012, 14h06   #9
punkoff
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 2 158
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 2 158
Points : 3 491
Points : 3 491
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
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h42.


 
 
 
 
Partenaires

Hébergement Web