|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : décembre 2007 Messages : 14 ![]() |
Bonjour à tous.
Je viens de commencer l'apprentissage de db2 ( et donc de SQL ). Et j'ai un peu de mal avec la notion de curseur. Est ce équivalent a la notion de browsing de fichiers (startbr => open, endbr => close et readnext => fetch ?) merci d'avance pour toute aide/lien/support de cours car je n'ai rien trouvé de satisfaisant sur le net - Holder - |
|
|
00
|
|
|
#2 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 889 ![]() |
Citation:
En fait, les tables sont les opérandes des opérateurs relationnels : Restrict, Project, Join, Union, etc. Les résultats des opérations sont des tables, en fait des ensembles, et avec SQL, on ne les manipule pas au niveau d'un élément (ou ligne, ou enregistrement si vous préférez). Hors SQL, quand vous appareillez séquentiellement des fichiers, vous lisez les enregistrements un par un et vous en comparez les arguments pour savoir quel enregistrement de quel fichier traiter en premier, puis écrire un enregistrement sur un fichier en sortie. Vous développez un programme d’au moins cent ou deux-cents lignes à cet effet. Pour réaliser l’équivalent avec SQL, vous écrivez simplement, quelque chose comme : "Fichier1 Join Fichier2 ON argument" et le résultat de cette opération est l’équivalent de votre fichier en sortie. Au passage, vous avez donc remplacé un paquet de lignes de programmation par une seule ligne. Le problème est que votre programme ne sait que faire du résultat qui est un ensemble, puisqu’il traite seulement au niveau de l'enregistrement, qui est un élément. C’est pour cela qu'a été mis en oeuvre le concept de curseur, pour que vous puissiez considérer le résultat d’un Select ensembliste, quelle que soit la complexité de ce dernier, comme un simple fichier et par Fetch, déplacer un "curseur" sur la ligne suivante de ce résultat et l’exploiter, par exemple afficher ligne par ligne à l’écran de l’utilisateur. En résumé, SQL vous transmet un sac et le curseur vous permet d’y récupérer les cacahuètes une par une. Au passage, le SGBD s’est coltiné l’algorithme de production du sac, ce qui vous fait gagner bien du temps (et croyez-moi, il est plus fort que nous tous dans ce genre d’exercice, outre que, sous le capot, tout va incomparablement plus vite).
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|
|
|
00
|
|
|
#3 |
|
Membre éclairé
![]() Inscription : octobre 2007 Messages : 362 ![]() |
Petit complément d'info.
Pour reprendre l'analogie de fsmrel, l'OPEN CURSOR constitue le paquet de cacahuètes, ce qui veux dire qu'il exécute le SELECT. Le plus gros du travail est donc fait à ce moment, contrairement au STARTBR qui ne fait "que" positionner un pointeur à un certain endroit du fichier. En terme de cinématique de traitement, il peut se passer un temps assez long avant que le SGBD retourne un résultat après l'OPEN du curseur. |
|
|
00
|
|
|
#4 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 889 ![]() |
Citation:
Mais on s’éloigne de la question posée initialement...
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Inscription : décembre 2007 Messages : 14 ![]() |
Milles merci !
Donc si je comprends bien, les jointures de tables et la projection sont faites lors de l' OPEN CURSOR, le FETCH ne réalisant "que" une lecture de ligne de la projection puis un passage a la ligne suivante ( NEXT étant par défaut ) ? ( Si je me trompe de termes, n'hésitez pas à me reprendre |
|
|
00
|
|
|
#6 | |
|
Membre Expert
![]() ![]() François DurandSpécialiste Delivery Mainframe IBM Inscription : octobre 2005 Messages : 1 098 ![]() |
Citation:
Dans certains cas il y a matérialisation de la table résultante et dans d'autres cas non ... |
|
|
|
00
|
|
|
#7 | |||
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 889 ![]() |
Citation:
Considérez la requête ci-dessous (cf. http://www.developpez.net/forums/sho...80&postcount=7) Code :
Dans un 1er temps (à la détection de l’instruction OPEN CURSOR), le système relationnel prend pour opérande la table répondant au doux nom de tblehpa20071030 et récupère les lignes pour lesquelles on vérifie la condition : ehpCodeCategorie = 200.L’opération est une restriction. Appelons W1 la table qui en résulte. Dans un 2e temps, le système effectue la jointure des tables tblehpa20071030 et tblehpa20071030 (en fait il s’agit d’une auto-jointure). La condition de jointure est donnée par : WHERE a.ehpFinessJuridique = b.ehpFinessJuridiqueAppelons W2 la table qui en résulte. Dans un 3e temps, le système procède à l’intersection des tables W1 et W2. Appelons W3 la table qui en résulte. Dans un 4e temps, le système effectue une projection appliquée à la table W3 pour produire une table W4, laquelle a une seule colonne : ehpFiness. C’est notre table résultat. Dès que cette table ultime sera constituée, le 1er Fetch sera déclenché et à partir de là, elle sera évidemment parcourue très vite, alors qu’entre l’ouverture du curseur et ce 1er Fetch, il aura fallu au système le temps d’effectuer les travaux préliminaires énumérés ci-dessus. J’ai décrit les opérations selon un point de vue conceptuel, mais dans la réalité, le système peut évidemment prendre des raccourcis, optimiser, réécrire la requête, son but étant de fournir une table résultat le plus rapidement possible et de la façon la plus économique (W1 ne comportera par exemple que le nombre minimum de colonnes nécessaire, à savoir l’unique colonne ehpFiness). Il se peut aussi que dans la réalité, le système n’ait pas de table résultat à constituer. Considérez en effet la requête : Le système partira bille en tête dans le parcours de T1, sans constitution de tables intermédiaires. Time is money.
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|||
|
|
00
|
|
|
#8 | ||||
|
Invité régulier
![]() Inscription : décembre 2007 Messages : 14 ![]() |
Merci pour ces infos, j'ai parfaitement saisie maintenant
Mis à part un détail: qu'est ce qu'une intersection de tables ? ( je connait l'équi-jointure, les jointures externes UNION ALL, FULL/LEFT/RIGHT OUTNER, les jointures internes ... mais pas l'intersection En fesant un pas dans l'intégration de requetes SQL dans mon source COBOL, j'ai lu qu'il fallait inclure le SQLCA ... Aucun problèmes, il vas me donner les SQLCODE et compagnie, ça, c'est compris ... Code :
Comment le coder? Qu'ajoute-il exactement ? Partons sur un exemple de base simple: Code :
-holder- |
||||
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() ![]() François DurandSpécialiste Delivery Mainframe IBM Inscription : octobre 2005 Messages : 1 098 ![]() |
Citation:
Pour le générer il faut utiliser l'outil fourni par DB2, soit sous ISPF soit en batch. Citation:
1) permettre au pré-compilateur de faire un certain nombre de vérifications élémentaires puisque ce dernier n'accède pas au catalogue et n'a pas la vision des tables traitées dans le programme c'est la partie DECLARE TABLE 2) déclarer les variables hôtes qui sont l'interface aussi bien en lecture qu'en écriture entre les colonnes de la table et le programme lui même. DB2 est très rigoureux sur le type de celles-ci, et, plutôt que les déclarer "à la main" avec de nombreux risques d'erreur, il faut mieux les faire générer par l'outil ad hoc. c'est la partie déclaration des variables (en général pour du COBOL, mais ça marche aussi pour de l'assembleur, du PL/1 ou du C/C++) |
||
|
|
00
|
|
|
#10 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 889 ![]() |
Concernant la programmation, il est temps pour vous d'assimiler les ouvrages de référence.
Pour DCLGEN, voyez le lien http://www-306.ibm.com/software/data...s/v9books.html où vous récupérerez le fichier .PDF : Application Programming & SQL Guide (SC18-9841-01). Voyez notamment le chapitre 8 : "Generating declarations for your tables using DCLGEN". Après cela, vous saurez établir la correspondance entre la structure d'une table au sens SQL et cette structure au sens COBOL. Citation:
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|
|
|
00
|
|
|
#11 | ||||
|
Invité régulier
![]() Inscription : décembre 2007 Messages : 14 ![]() |
Citation:
Citation:
Une autre question qui me vient à l'esprit: vaut-il mieux préparer les ordres SQL en fesant un Code :
PS: Merci pour les liens, je vais potasser cela |
||||
|
|
00
|
|
|
#12 | |||
|
Membre Expert
![]() ![]() François DurandSpécialiste Delivery Mainframe IBM Inscription : octobre 2005 Messages : 1 098 ![]() |
Citation:
Pour faire simple, mais ça demanderait des développements plus longs, le SQL dynamique est plus souple mais (éventuellement) moins performant alors que c'est l'inverse pour le SQL statique (on s'en serait douté ... ). Notamment, le SQL statique détermine le chemin d'accès une fois pour toute (au BIND en fait) alors que le SQL dynamique risque de le refaire à chaque exécution. Par contre, le SQL statique induit une rigidité supplémentaire en introduisant la notion de PLAN et de PACKAGE. Historiquement, le SQL dynamique a eu une réputation d'inefficacité et de lenteur et de nombreux sites l'interdisent dans leurs normes de développement. Maintenant, il faut savoir que de nombreux outils (ERP, ODBC, JDBC (?) etc ) privilégient l'utilisation du SQL dynamique et donc, IBM a fait de nombreuses évolutions au fil des versions de DB2 for z/OS pour en améliorer les performances. |
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com