> Tech > Accès base de données à  partir de CL avec SQL CLI

Accès base de données à  partir de CL avec SQL CLI

Tech - Par Renaud ROSSET - Publié le 24 juin 2010
email

Récemment, alors que j’expérimentais quelques-unes des nouvelles fonctions CL de la V5R3, j’ai fait une découverte intéressante : il est possible d’utiliser les API SQL CLI à partir d’ILE CL en V5R3 ! Avec ces API, vous pouvez utiliser SQL pour lire des fichiers dans vos programmes ILE CL avec

Accès base de données à  partir de CL avec SQL CLI

très peu de restrictions, et aussi faire des mises à jour, ajouter de nouveaux enregistrements, et autres.

En V5R3, IBM a ajouté le qualificateur *BYVAL à l’instruction CALLPRC. Vous pouvez ainsi appeler beaucoup d’API que vous ne pouviez pas appeler par d’autres méthodes, y compris les API SQL CLI. Avec ces API, il faut d’abord créer un environnement dans lequel exécuter les instructions SQL. Pour cela, appelez l’API SQLAllo cEnv() (figure 2). Cet appel d’API alloue quelques structures de données utilisées en interne par le gestionnaire de base de données du système d’exploitation. Il renvoie un nombre que j’ai stocké dans la variable &ENV et qu’il peut utiliser pour localiser ces structures de données.

Ensuite, vous devez connecter l’environnement à une source de données. Pour cela, créez un handle de connexion (c’est un autre nombre que le système d’exploitation peut utiliser pour accéder aux structures de données internes), définissez les options nécessaires à la connexion et connectez- vous à la source de données. Dans la figure 3, j’établis un handle de connexion qui est configuré sans commitment control et je me connecte à la source de données du système local.

Après chacun de ces appels d’API, examinez la valeur de la variable &RC, qui est l’une des suivantes : 0 = l’appel d’API a réussi 1 = l’appel d’API a réussi, mais un message d’avertissement a été émis 100 = pas de données trouvées, ou fin du jeu de résultats atteinte -1 = une erreur s’est produite et l’appel d’API a échoué -2 = vous avez passé un handle non valide Une fois connectés, vous pourrez exécuter des instructions SQL.

L’exemple de la figure 4 demande la description et le prix d’un article à partir d’un fichier appelé ITMMAST. Pour pouvoir exécuter l’instruction, vous devez allouer un handle d’instruction (figure 5). Ensuite, comme le montre la figure 6, l’instruction peut être exécutée. Au lieu d’utiliser SQLExecDirect(), vous pouvez aussi d’abord préparer l’instruction puis l’exécuter avec des appels d’API séparés (figure 7).

L’avantage est ici de pouvoir exécuter l’instruction plus d’une fois, ce qui est impossible avec SQLExecDirect(). Rappel : Vous devriez utiliser soit SQLExecDirect() soit SQLPrepare() et SQLExecute(). Il est inutile de faire les deux. Pour extraire les résultats, vous devez spécifier des variables dans lesquelles SQL chargera chaque colonne. Pour cela, je « lie » certaines des variables de mon programme aux colonnes du fichier (figure 8). Une fois les variables liées aux colonnes, chaque fois que j’extrais un enregistrement de cette instruction SQL, il charge les colonnes dans les variables spécifiées.

SQL connaît déjà la taille du champ (ou « colonne ») dans le fichier ; par conséquent, je n’ai pas à donner cette information. Mais il ne connaît pas la taille de la variable dans mon programme, aussi dois-je l’indiquer. Si le type ou la taille des données ne correspondent pas, le système essaie de faire la conversion. Quand vous spécifiez la taille d’une variable *DEC, donnez le nombre total de digits dans le champ et le nombre de positions décimales. A cet effet, multipliez la longueur du champ par 256 et ajoutez le nombre de positions décimales au résultat. Dans la figure 8, le champ &PRICE a sept chiffres de long avec deux décimales, donc j’ai spécifié comme longueur 7*256 +2.

Dans la figure 9, un appel adressé à l’API SQLFetch() extrait un enregistrement du jeu de résultats. Les données provenant de l’enregistrement sont placées dans les variables &DESC et &PRICE. Ici, je m’attends à n’extraire qu’un enregistrement du jeu de résultats. Après tout, j’ai spécifié un numéro d’article particulier. En revanche, si j’avais écrit une requête chargée de renvoyer de nombreux enregistrements, j’aurais pu coder SQLFetch() dans une boucle, puis tester &RC pour déterminer quand j’aurais épuisé les enregistrements (figure 10).

Quand j’en ai fini avec mon instruction SQL, j’ordonne au système de la « libérer » afin que la mémoire qu’elle utilisait soit mise à disposition des autres programmes. Dans le même esprit, je peux me déconnecter de la source de données et libérer le handle de connexion et le handle d’environnement (figure 11). Vous pouvez télécharger l’exemple de code de cet article sur www.itpro.fr Club Abonnés
– Scott Klement

Téléchargez cette ressource

Guide inmac wstore pour l’équipement IT de l’entreprise

Guide inmac wstore pour l’équipement IT de l’entreprise

Découvrez toutes nos actualités à travers des interviews, avis, conseils d'experts, témoignages clients, ainsi que les dernières tendances et solutions IT autour de nos 4 univers produits : Poste de travail, Affichage et Collaboration, Impression et Infrastructure.

Tech - Par Renaud ROSSET - Publié le 24 juin 2010