TABLE DES MATIÈRES
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.
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.
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.
SQLCODE | |||
---|---|---|---|
< 0 | = 0 | > 0 | 100 |
Erreur | OK | Overflow | Fin 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.