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 |