Déclaration des variables et connexion à la base de données
Afin de pouvoir exécuter des ordres SQL sur la base Oracle, il faut dans un premier temps se connecter à la base de données. Pour cela on réutilise le programme Cobol de connexion à Oracle créé précédemment.
La déclaration des variables SQLCA est toujours nécessaire lorsqu’un programme utilise des fonctions SQL. Il faut donc commencer par l’inclure en WORKING.
EXEC SQL INCLUDE SQLCA END-EXEC. |
Dans cet exemple, la connexion à Oracle est réalisée par un programme séparé, on va donc utiliser une zone d’échange avec le sous-programme qui réalise cette opération pour vérifier que la connexion a bien été établie. Dans le cas où la valeur renvoyée par le programme de connexion est à 1 la connexion n’est pas établie. Il faut alors traiter l’erreur dans le programme appelant.
01 R-CONNECT. 05 R-CONNECT-STATUT PICTURE X. |
On appelle maintenant le sous-programme de connexion après avoir initialisé le témoin à 0.
MOVE "0" TO R-CONNECT-STATUT. CALL "CONNECT" USING R-CONNECT. * LES STATUT EST A 1 AU RETOUR DU PROGRAMME DE CONNEXION : ERREUR * EXECUTION DE LA FONCTION DE TRAITEMENT D’ERREUR IF R-CONNECT-STATUT = "1" THEN GO TO P9-ERR. |
Exemple de table dans Oracle
Dans cet exemple nous allors travailler sur une table CLIENT qui contient le nom, prénom et agglomération des clients d’une entreprise.
NUMERO | NOMFAM | PRENOM | AGGLOM |
---|---|---|---|
60 | MARTIN | Francis | Bordeaux |
81 | HERGEON | Isabelle | Lille |
123 | BAGA | Rutha | Marseille |
152 | FOUAD | Victor | Aix-en-Provence |
Lecture d’une seule ligne SELECT
Lorsque la requête renvoie une seule ligne, les données peuvent être lues par un ordre SELECT placé directement dans le programme. Toutes les variables utilisées à l’intérieur d’une requête SQL sont à déclarer dans une section SQL. Pour reconnaitre facilement ces variables, on utilise un préfixe O- ce n’est pas une obligation mais la relecture du programme est simplifiée. Les variables servant à la condition de sélection sont à initialiser avant d’exécuter l’ordre. Le résultat de la requête est placé dans les variables indiqués dans la zone INTO.
EXEC SQL BEGIN DECLARE SECTION END-EXEC. 01 O-NOMFAM PICTURE X(30). 01 O-PRENOM PICTURE X(30). 01 O-AGGLOM PICTURE X(30). 01 O-NUMERO PICTURE S9(5). EXEC SQL END DECLARE SECTION END-EXEC. |
Les variables déclarées de cette manière peuvent être utilisées de la même façon que les autres variables. Leur particularité est qu’elles peuvent être utilisées dans des ordres SQL à l’intérieur de la PROCEDURE DIVISION. La requête suivante va lire le nom, prénom et agglomération du client 123. Le résultat est affiché à l’écran.
span style="color: #000066;"> * RECHERCHE DU CLIENT AYANT LE NUMÉRO 123 MOVE 123 TO O-NUMERO. EXEC SQL SELECT NOMFAM, PRENOM, AGGLOM INTO :O-NOMFAM, :O-PRENOM, :O-AGGLOM FROM CLIENT WHERE NUMERO = :O-NUMERO END-EXEC. * SI LA LIGNE N’A PAS ÉTÉ TROUVÉE * EN MODE ANSI LE SQLCODE = 100, EN MODE ORACLE SQLCODE = 1403 IF SQLCODE = 100 DISPLAY "IL N’Y A PAS DE CLIENT AVEC CE NUMÉRO : " O-NUMERO GO TO P2-LECT-FIN. * ERREUR TECHNIQUE : DÉBRANCHEMENT IF SQLCODE NOT = ZERO GO TO ERR-ORA. * PAS D’ERREUR : ON AFFICHE LE RÉSULTAT DISPLAY "LE NUMÉRO " O-NUMERO " CORRESPOND A " O-NOMFAM " " O-PRENOM " RÉSIDANT A " O-AGGLOM. P2-LECT-FIN. |
Les variables O-NOMFAM, O-PRENOM et O-AGGLOM sont à présent alimentées avec le contenu de la table CLIENT. Elles peuvent être utilisées dans la suite du programme. Ce programme va afficher :
LE NUMÉRO 123 CORRESPOND A BAGA Rutha RÉSIDANT A Marseille
Lecture de plusieurs lignes avec FETCH sur curseur
On reprend l’exemple précédent mais cette fois on souhaite lire toutes les lignes de la table CLIENT. Dans ce cas, l’utilisation d’un curseur est nécessaire afin de boucler sur toutes les lignes renvoyées par la requête. La façon d’utiliser un curseur est différente d’une lecture directe.
La cinématique de mise en place dans le programme COBOL est la suivante :
OPEN : OUVERTURE DU CURSEUR
BOUCLE TANT QU’IL RESTE DES RÉSULTATS
–> FETCH
–> TRAITEMENT DE LA LIGNE LUE
FIN BOUCLE
CLOSE : FERMETURE DU CURSEUR
Déclaration du curseur
La déclaration du curseur est faite en WORKING au début du programme.
EXEC SQL DECLARE LECT-CLIENT CURSOR FOR SELECT NOMFAM, PRENOM, AGGLOM FROM CLIENT ORDER BY NOMFAM, PRENOM END-EXEC. |
Une différence avec la première méthode : la partie INTO de la requête servant à stocker le résultat n’est plus présente. L’alimentation avec les valeurs de la ligne en cours de lecture sera réalisée au moment de la lecture d’une nouvelle ligne lors du FETCH.
Ouverture du curseur
L’ouverture du curseur est à réaliser une fois avant son utilisation. Un fois que le curseur est ouvert on pourra commencer la lecture.
EXEC SQL OPEN LECT-CLIENT END-EXEC. * ERREUR D’OUVERTURE DU CURSEUR IF SQLCODE NOT = ZERO GO TO ORA-ERR. * PAS D’ERREUR ON POURSUIT LE PROGRAMME … |
Le code Oracle est contenu dans la variable SQLCODE qui doit être testé avant de commencer le FETCH. En cas d’erreur d’ouverture du curseur, le FETCH sur le résultat ne fonctionnera pas.
Lecture des lignes résultat
Le curseur LECT-CLIENT est ouvert, les lignes résultat peuvent être lues une par une grâce à l’opérateur FETCH. Lorsque toutes les lignes ont été lues, la valeur du SQLCODE passe à 100 ou 1403 suivant le mode de compilation. Cette valeur va nous permettre de sortir de la boucle de lecture.
ORA-FETCH-CLIENT. EXEC SQL FETCH LECT-CLIENT INTO :O-NOMFAM, :O-PRENOM, :O-AGGLOM END-EXEC. * LECTURE TERMINÉE : TOUTES LES LIGNES ONT ÉTÉ LUES * EN MODE ANSI LE SQLCODE = 100, EN MODE ORACLE SQLCODE = 1403 IF SQLCODE = 100 GO TO ORA-FETCH-CLIENT-FIN. * ERREUR TECHNIQUE : EXÉCUTION DE LE FONCTION D’ERREUR IF SQLCODE NOT = ZERO GO TO ERR-ORA. * PAS D’ERREUR : ON AFFICHE LA LIGNE DISPLAY "NOUVEAU CLIENT : " O-NOMFAM "" O-PRENOM "RÉSIDANT A " O-AGGLOM. * LECTURE D’UNE NOUVELLE LIGNE GO TO ORA-FETCH-CLIENT. ORA-FETCH-CLIENT-FIN. |
Ce programme lit une nouvelle occurrence de la table CLIENT tant que le code retour SQLCODE n’est pas égal à 100. Lorsque la lecture est terminée, on débranche sur l’étiquette de fin de lecture et on poursuit la suite du programme.
NOUVEAU CLIENT : BAGA Rutha RÉSIDANT A Marseille NOUVEAU CLIENT : FOUAD Victor RÉSIDANT A Aix-en-Provence NOUVEAU CLIENT : HERGEON Isabelle RÉSIDANT A Lille NOUVEAU CLIENT : MARTIN Francis RÉSIDANT A Bordeaux
Fermeture du curseur
Une fois que la lecture de toutes les résultats de la requête est terminée, il ne faut pas oublier de fermer le curseur pour libérer la ressource et pourvoir le réutiliser à un autre moment. La commande CLOSE permet de fermer le curseur.
EXEC SQL CLOSE LECT-CLIENT END-EXEC. * ERREUR DE FERMETURE DU CURSEUR IF SQLCODE NOT = ZERO GO TO ORA-ERR. * PAS D’ERREUR ON POURSUIT … |
Là encore, on vérifie bien que la commande CLOSE s’est déroulée sans erreur.