SQL statique Û requêtes connues à la compilation

 

Limites du SQL interactif

·        pas commode pour un user

·        interface très pauvre

 

Apport du lge de pg°

·        résultats d'une requête utilisables dans des variables

·        paramétrage de requête

 

Embedded SQL = SQL intégré ds un lge de pg° classique

 

Lge hôte + SQL

¯

Prépro appelle analyseur SQL et optimiseur SQL

Þ fic.cbl, fic.lis (commentaires)

¯

lge + appels procédures

¯

compilateur

¯

fic.o (module objet)

¯

éditeur de liens et bibliothèques procédures du SGBD

¯

exécutable

 

A l'IUT

 

fic.cpo

¯

Prépro : procob mode=ansi fic.cpo

¯

fic.cob

¯

interpréteur : cob fic.cob

¯

fic.int

¯

Appelle Oracle pour l'interprétation : rtsora fic.int

 

Prépro : ordres SQL exécutables ® appels de procédures

Þ nécessité de délimiter les ordres SQL

 

EXEC SQL

Þ drapeau de début (colonne 12)

 

; Þ drapeau de fin en général

END-EXEC Þ drapeau de fin en COBOL

 

Intructions EXEC SQL

·        déclaratives = directives

·        exécutables : appel au SGBD

 

Correspondance des infos

SQL

COBOL

info d'une colonne

variable hôte

 

Déclarer une var hôte

WS-S

    EXEC SQL BEGIN DECLARE SECTION

    END-EXEC

77 varhôte FORMAT.

    EXEC SQL END DECLARE SECTION

    END-EXEC

 

nom de la variable

SQL

COBOL

:nom-varhote

nom-varhote

 

types

Oracle

COBOL

NUMBER

PIC 9… COMP. (int)

PIC 9… COMP-1 COMP-2 (double)

PIC 9… COMP-3 (décimaux)

CHAR(n)

PIC X(?)

 

Connexion à la base Oracle

EXEC SQL CONNECT :username IDENTIFIED BY :passwd

END-EXEC

 

Déconnexion

EXEC SQL COMMIT RELEASE

END-EXEC

ou

EXEC SQL ROLLBACK RELEASE

END-EXEC

 

RELEASE : libère les ressources

Sinon, pas de libération immédiate et effondrement du système possible

 

Le SELECT renvoie

·        une seule ligne : var hôtes

·        +s lignes : curseur

 

Requête sans curseur

SELECT col1, …, coln

INTO :varhote1, …, :varhoten  -- var en sortie

FROM …

WHERE attr=:varhote      -- var en entrée

Attn : col1, …, coln et varhote1, …, varhoten doivent

être en même nombre

et avoir des types qui se correspondent

 

Attn : il faut gérer les erreurs !!

 

Déclarer un curseur (en lecture)

EXEC SQL DECLARE nom-curseur CURSOR FOR requête

[ FOR UPDATE OF nom-colonne ] 

END-EXEC

Rq : FOR UPDATE OF nom-colonne s'utilise pour la mise à jour

 

Ouvrir un curseur

EXEC SQL OPEN nom-curseur

END-EXEC

Þ évaluation de la requête dont le résultat est pointé par le curseur

Rq : ouvrir et fermer le curseur +s fois permet de lancer +s fois une requête paramétrée

 

Attn : curseur et INTO sont incompatibles !!

 

Fermer le curseur

EXEC SQL CLOSE nom-curseur

END-EXEC

Rq : un COMMIT ou un ROLLBACK ferme tous les curseurs

 

Lire la table pointée par le curseur

EXEC SQL FETCH nom-curseur

INTO :var1[:ind1], :var2[:ind2], …, :varn[:indn]

MOVE SQLCODE TO var-curseur

IF eoc

ELSE

END-IF

END-EXEC

Rq : le curseur peut ne pas contenir de lignes

 

eoc Û end of cursor Û  sqlstate=02000

 

Indicateurs

·        avec ou sans curseur

·        dès qu'un champ peut prendre NULL

 

Déclarer un indicateur

77 indtruc PIC S9 COMP.

 

Évaluer l'indicateur

FETCH nom-curseur INTO :var:indvar

 

Indicateur en sortie

0

la variable est renseignée

-1

la var hôte n'est pas renseignée

>0

2

la valeur est tronquée

 

 

Indicateur en entrée

-1

NULL sera affecté à la colonne

³ 0

la colonne prend la valeur de la variable hôte

 

Mise à jour grâce au curseur

 

Attn : un COMMIT/ROLLBACK ferme le curseur

 

Ligne courante Û ligne qui vient d'être lue par le FETCH

 

Ex : WHERE CURRENT OF nom-curseur désigne la ligne courante

 

Attn : qd on supprime une ligne d'une table, il faut tenir compte des CIR (ordre)

 

2 normes pour la gestion des erreurs

·        SQLCA (89)

·        SQLSTATE (92)

 

Structure SQLCA

·        SQLCODE

·        SQLERRM

o       SQLEERM : longueur msg

o       SQLEEMMC : 70 1er caractères du msg d'erreur

·        SQLERRD

·        SQLWARN

 

EXEC SQL WHENEVER condition action

END-EXEC

condition

·        SQLERROR  Û  SQLCODE <0

·        SQLWARNING  Û  SQLWARN(0) = 'W'

·        NOT FOUND  Û  SQLCODE = 100 (mode=ansi)

action

·        GOTO étiquette

·        CONTINUE  Û  ne rien faire

·        STOP  Û  arrêt du programme Déconseillé !!

Rq : 1 WHENEVER par condition (1 action par condition)

 

Attn : penser à désactiver le traitement d'erreur dans le § d'erreur sinon boucle infinie :

SQLERR.

EXEC SQL WHENEVER SQLERROR CONTINUE

END-EXEC

 

SQLCODE

0

ok

<0

erreur SQL grave : la requête n'a pas pu se faire

>0

warning

100

le SELECT ou le FETCH n'a retourné aucune valeur