TABLE DES MATIÈRES

  1. La syntaxe
  2. Les variables
  3. Les connexions (déconnexion)
  4. Les curseurs
  5. Les valeurs nulles (NULL)

La syntaxe

 EXEC SQL 
  [NSTRUCTION-SQL-COBOL]
 END-EXEC.

 

N.B.: la commande END-EXEC remplace le point-virgule ';' des instructions SQL.
Donc écrire "EXEC SQL SELECT * FROM TBLTABLE; END-EXEC." en COBOL reviendrait à écrire "SELECT * FROM TBLTABLE;;" en sql et planterait à l'éxécution.

Les variables

Déclaré à la fin de la WORKING-STORAGE SECTION (avant la REPORT SECTION).
Les variables sont déclarés à l'intérieure de deux COMMANDE SQL.
BEGIN DECLARE SECTION et END DECLARE SECTION.

     EXEC SQL BEGIN DECLARE SECTION END-EXEC. 
 01 VARIABLE_COBOL      PIC X(3).
     EXEC SQL END DECLARE SECTION END-EXEC.
 

Accès aux variables cobol (même au paragraphe) dans un instruction SQL:
le nom de la variable précédée par un deux-point (:).

 EXEC SQL 
   INSERT INTO TBLCLIENT (NOM, PRENOM) VALUES (:NOM_COBOL, :PRENOM_COBOL)
 END-EXEC.

Tous les "number" de sql sont signés. Leur "picture" en COBOL prenne donc un S.

Pour plus de compatibilité, toutes les variables devront être déclarées 01.

Il existe des variables privées à l'environnement SQL.

* état de sql (voir les connexions)
 01 SQLSTATE     	PIC X(5).

* message envoyé par sql
 01 SQLMSG       	PIC X([1 à 254]).
* code?
 01 SQLCODE             PIC S9(9)  COMP-5.
 

Les connexions (déconnexion)

Dans la PROCEDURE DIVISION.

 EXEC SQL 
   CONNECT TO DEFAULT
 END-EXEC.

Vérification si la connexion est établie avec la variable SQLSTATE

  SQLSTATE = "00000" OR SQLSTATE = "IM006" 
 EXEC SQL 
   [instruction sql] 
 END-EXEC.
 EXEC SQL 
   DISCONNECT TO DEFAULT
 END-EXEC.

Les curseurs

Dans la PROCEDURE DIVISION.

Déclaré avant la connexion à la base de données

 EXEC SQL 
   DECLARE ["nom_curseur"] CURSOR FOR ["select|update|delete"]
 END-EXEC.

Ouverture (après la connexion)

 EXEC SQL 

 	OPEN ["nom_curseur"]
 END-EXEC.
 EXEC SQL 
       FETCH ["nom_curseur"]
             INTO {["nom_variable_cobol"], ...}
 END-EXEC.
FETCH RETOURNE UN NOMBRE DANS SQLCODE SELON LE RETOUR:
SQLCODE
< 0= 0> 0 100
ErreurOK OverflowFin du fichier (EOF)

Fermeture (avant la déconnexion)

 EXEC SQL 
 	CLOSE ["nom_curseur"]
 END-EXEC.

Les valeurs nulles (NULL)

Déclaration de l'indicateur (DECLARE SECTION)

   01 VARIABLE_IND    PIC S9(4) COMP.
 

Si une variable est considérée nulle, mettre l'indicateur à -1 sinon mettre l'indicateur à 0.

 IF VARIABLE = SPACES
     MOVE -1 TO VARIABLE_IND
 ELSE

     MOVE ZEROES TO VARIABLE_IND.
 

Utiliser l'indicateur dans une insertion

 EXEC SQL 
 	INSERT INTO TBLTABLE (CHAMP1)
            VALUES (:VARIABLE INDICATOR :VARIABLE_IND)
 END-EXEC.

OU Utiliser dans un Fetch (Attention on indique pas de INDICATOR ici!)

 EXEC SQL 
 	FETCH CURSEUR1 INTO (:VARIABLE :VARIABLE_IND)
 END-EXEC.

* DEMANDER À L'USAGER UNE INSTRUCTION SQL...
- EXEMPLE 
declare
01 stmvar picx(254)

initialisation
es declare cur1 cursor for stmidt [mot réservé] ee

[pour accepter l'instruction]
accept stmvar from console [mot réservé]

es prepare stmidt from :stmvar ee

Structure de programme

IDENTIFICATION DIVISION
ENVIRONMENT DIVISION
DATA DIVISION
  FD SD
WORKING STORAGE SECTION
 77
 01

EXEC SQL
 BEGIN DECLARE SECTION
END-EXEC.

 01 pNOM (PARAMETRE QUI SONT PASSÉES AUX INSTRUCTION SQL)
 01 SQLSTATE   X(5).
 01 SQLMESSAGE X(254).
 01 SQLCODE    X().

EXEC SQL
 END DECLARE SECTION
END-EXEC.

REPORT SECTION
 RD ____ DESCRIPTION DU RAPPORT.

PROCEDURE DIVISION
100-DÉBUT
 02 OUVRIR LA BASE________/-> EST LA DU CONNECTION (SI ERREUR GO TO FIN)

 EXEC SQL
  DECLARATION DES CURSEURS  
 END-EXEC.

 EXEC SQL
  WHENEVER SQLERROR GO TO 999-ERROR (DISPLAY SQLSTATE, SQLMESSAGE)
 END-EXEC.

200-MAIN
 READ JOB AT END MOVE "O" TO INDIC-FINFICHIER.
 PERFORM UNTIL NOT FINFICHIER
   EXEC SQL 
    INSERT
   END-EXEC.
  READ..
 END-PERFORM.
 EXEC SQL COMMIT END-EXEC.

 LIRE FM  (boucle lecture) + COMMIT
 (MOVE JOBCOD[1,3] TO pJOBCOD.
 LIRE TRANSAC (boucle lecture) + COMMIT
 LIRE CURSEUR (boucle lecture) + DYNAMIQUE

FERMER
 DISCONNECT
 FIN.

FIN
 CLOSE DES FICHIERS.
 STOP RUN.

999-ERROR
DISPLAY SQLSTATE, SQLMESSAGE
 EXEC SQL ROLLBACK END-EXEC.
 GO TO FERMER

- DELETE [FROM] <TABLE> + commit
- DROP TABLE <TABLE> (AU DÉBUT DU .SQL)
- INSERT INTO <TABLE> (DN1, DN2)
  VALUES (:pVAR1, :VAR2, :pVAR3)
- UPDATE <TABLE> SET <COL1> = <EXPRESSION> WHERE <PREDICAT>

                    (<COL2> = <EXPRESSION> WHERE <PREDICAT>)
  [WHERE EXISTS (PREDICAT).

- à la fin des créations des tables
- GRANT ALL ON <TABLE> TO OLLARRIVE.