|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() |
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 |
|
|
00
|
|
|
#2 |
|
Membre régulier
![]() Thomas Architecte technique Inscription : septembre 2010 Messages : 64 ![]() |
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).
|
|
|
00
|
|
|
#3 | ||
|
Nouveau Membre du Club
![]() |
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 :
|
||
|
|
00
|
|
|
#4 |
|
Membre habitué
![]() Julien GuiffroyIngénieur d'étude Mainframe Inscription : septembre 2012 Messages : 61 ![]() |
|
|
|
00
|
|
|
#5 |
|
Membre régulier
![]() Thomas Architecte technique Inscription : septembre 2010 Messages : 64 ![]() |
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...
|
|
|
00
|
|
|
#6 | |
|
Membre régulier
![]() Thomas Architecte technique Inscription : septembre 2010 Messages : 64 ![]() |
Citation:
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. |
|
|
|
00
|
|
|
#7 | ||
|
Membre habitué
![]() Julien GuiffroyIngénieur d'étude Mainframe Inscription : septembre 2012 Messages : 61 ![]() |
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 :
|
||
|
|
00
|
|
|
#8 |
|
Nouveau Membre du Club
![]() |
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 |
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 2 158 ![]() |
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 |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com