Cobol : Exécuter des requêtes SQL

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.

NUMERONOMFAMPRENOMAGGLOM
60MARTINFrancisBordeaux
81HERGEONIsabelleLille
123BAGARuthaMarseille
152FOUADVictorAix-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.

Laisser un commentaire