christine bonnet sources : « samples » doracle, « oracle 8 » r. chapuis pro*c – c ++
TRANSCRIPT
Christine Bonnet SOURCES : « Samples » d’Oracle, « Oracle 8 » R. Chapuis
PRO*C – C++PRO*C – C++
I-2 Christine Bonnet
PRO*CPRO*C
Incorporation d’ordres SQL dans un Incorporation d’ordres SQL dans un programme écrit en langage Cprogramme écrit en langage C
Ordres SQL intégrésOrdres SQL intégrés
Une phase de pré-compilation prend en Une phase de pré-compilation prend en charge la transformation des ordres SQL charge la transformation des ordres SQL en appel OCI (Oracle Call Interface).en appel OCI (Oracle Call Interface).
Incorporation d’ordres SQL dans un Incorporation d’ordres SQL dans un programme écrit en langage Cprogramme écrit en langage C
Ordres SQL intégrésOrdres SQL intégrés
Une phase de pré-compilation prend en Une phase de pré-compilation prend en charge la transformation des ordres SQL charge la transformation des ordres SQL en appel OCI (Oracle Call Interface).en appel OCI (Oracle Call Interface).
I-3 Christine Bonnet
ORDRES SQL INTÉGRÉSORDRES SQL INTÉGRÉS
ALTER SESSIONALTERCOMMENTCOMMITANALYSEAUDITCREATEDELETEDROPEXPLAIN PLANGRANT
INSERTLOCK TABLENOAUDITRENAME REVOKEROLLBACKSAVEPOINTSELECTSET ROLESET TRANSACTIONTRUNCATEUPDATE
CLOSECONNECTDESCRIBEEXECUTEFETCHOPENPREPARE
Ordres interactifsOrdres interactifs Ordres non interactifsOrdres non interactifs
I-4 Christine Bonnet
• Ordres SQL statiques : complètement définis dans le Ordres SQL statiques : complètement définis dans le programme source;programme source;
• Ordres SQL statiques : complètement définis dans le Ordres SQL statiques : complètement définis dans le programme source;programme source;
EXEC SQL ordre-SQL ; EXEC SQL ordre-SQL ;
ORDRES SQL INTÉGRÉSORDRES SQL INTÉGRÉS
Intégration :Intégration :
Exemple :Exemple :
EXEC SQL SELECT dname INTO :dname
FROM DEPT
WHERE deptno = :deptno;
EXEC SQL SELECT dname INTO :dname
FROM DEPT
WHERE deptno = :deptno;
I-5 Christine Bonnet
ORDRES SQL INTÉGRÉSORDRES SQL INTÉGRÉS
• Bloc PL/SQL : traité par le pré-compilateur comme Bloc PL/SQL : traité par le pré-compilateur comme
un simple ordre SQL.un simple ordre SQL.
EXEC SQL EXECUTE
[DECLARE]
BEGIN
…
[EXCEPTION]
END; /* fin du bloc PL SQL */
END EXEC;
• Bloc PL/SQL : traité par le pré-compilateur comme Bloc PL/SQL : traité par le pré-compilateur comme
un simple ordre SQL.un simple ordre SQL.
EXEC SQL EXECUTE
[DECLARE]
BEGIN
…
[EXCEPTION]
END; /* fin du bloc PL SQL */
END EXEC;
I-6 Christine Bonnet
ORDRES SQL INTÉGRÉSORDRES SQL INTÉGRÉS
• Ordres SQL dynamiques : construits lors deOrdres SQL dynamiques : construits lors de
l’exécution du programme.l’exécution du programme.
• Ordres SQL dynamiques : construits lors deOrdres SQL dynamiques : construits lors de
l’exécution du programme.l’exécution du programme.
Utilités :Utilités :
Le texte de l’ordre SQL n’est pas connu lors de la rédaction du programme;
le nombre de variables hôtes est variable;
le type des données est variable.
Le texte de l’ordre SQL n’est pas connu lors de la rédaction du programme;
le nombre de variables hôtes est variable;
le type des données est variable.
I-7 Christine Bonnet
Processus de développementProcessus de développement
SOURCEPré-compilation
PRO*CSOURCEmodifiée
Compilateur
OBJETBibliothèque sous-programmes
Bibliothèque sous-programmes
Éditeur de liens
EXÉCUTABLE
Chaque ordre SQL est remplacé par un appel à un
sous-programme de la librairie Oracle
Chaque ordre SQL est remplacé par un appel à un
sous-programme de la librairie Oracle
I-8 Christine Bonnet
VARIABLES HÔTESVARIABLES HÔTES
Variables de type scalaire ou tableau, déclarées dans le
programme hôte.
variables paramètres des ordres SQL;
zone de réception des données (clause INTO);
variables indicatrices associées à une requête
ou une opération de mise à jour.
Variables de type scalaire ou tableau, déclarées dans le
programme hôte.
variables paramètres des ordres SQL;
zone de réception des données (clause INTO);
variables indicatrices associées à une requête
ou une opération de mise à jour.
I-9 Christine Bonnet
VARIABLES HÔTESVARIABLES HÔTES
TYPE SIMPLETYPE SIMPLE
EXEC SQL BEGIN DECLARE SECTION;…
EXEC SQL END DECLARE SECTION;
EXEC SQL BEGIN DECLARE SECTION;…
EXEC SQL END DECLARE SECTION;
1. Déclaration1. Déclaration
I-10 Christine Bonnet
VARIABLES HÔTESVARIABLES HÔTES
Exemple :Exemple :
EXEC SQL BEGIN DECLARE SECTION;
int empno;
int deptno;
VARCHAR dname[15];
VARCHAR uid[80]; /* username */
VARCHAR pwd[20] /* password */
EXEC SQL END DECLARE SECTION;
EXEC SQL BEGIN DECLARE SECTION;
int empno;
int deptno;
VARCHAR dname[15];
VARCHAR uid[80]; /* username */
VARCHAR pwd[20] /* password */
EXEC SQL END DECLARE SECTION;
I-11 Christine Bonnet
VARIABLES HÔTESVARIABLES HÔTES
TYPE VARCHAR : VARCHAR nom_variable[longueur];TYPE VARCHAR : VARCHAR nom_variable[longueur];
Pseudo-type permettant de définir des variables de communication pour manipuler des chaînes de caractèresde longueur variable.
Déclaration équivalente à la structure C :
struct {
unsigned short int len;
unsigned char arr[longueur];
} nom_variable;
Pseudo-type permettant de définir des variables de communication pour manipuler des chaînes de caractèresde longueur variable.
Déclaration équivalente à la structure C :
struct {
unsigned short int len;
unsigned char arr[longueur];
} nom_variable;
I-12 Christine Bonnet
VARIABLES HÔTESVARIABLES HÔTES
TYPE VARCHAR :TYPE VARCHAR :
Utilisation d’une variable de type VARCHAR :
nom_variable.arr
Utilisation d’une variable de type VARCHAR :
nom_variable.arr
Exemple :Exemple :
strcpy((char *) iud.arr, « SCOTT »);
strcpy((char *) pwd.arr, « TIGER »);
strcpy((char *) iud.arr, « SCOTT »);
strcpy((char *) pwd.arr, « TIGER »);
I-13 Christine Bonnet
2. Utilisation dans un ordre SQL :
nom_variable précédé de « : »
2. Utilisation dans un ordre SQL :
nom_variable précédé de « : »
VARIABLES HÔTESVARIABLES HÔTES
Exemples :Exemples :
EXEC SQL INSERT INTO EMP(empno,deptno)VALUES (:empno,:deptno);
EXEC SQL INSERT INTO EMP(empno,deptno)VALUES (:empno,:deptno);
I-14 Christine Bonnet
VARIABLES (HÔTES) INDICATRICESVARIABLES (HÔTES) INDICATRICES
Déclarées dans la section déclaration;
Utilisées :
dans une clause INTO d’un ordre SELECT,
précédées de « : » - immédiatement après la variable hôte recevant la valeur renvoyée par l’ordre SELECT
Déclarées dans la section déclaration;
Utilisées :
dans une clause INTO d’un ordre SELECT,
précédées de « : » - immédiatement après la variable hôte recevant la valeur renvoyée par l’ordre SELECT
Exemple :Exemple :EXEC SQL SELECT nom, sal, commINTO :pilote_nom, :pilote_sal, :pilote_comm :ind_commFROM PILOTEWHERE nopilot = :pilote_num;IF (ind_comm == -1) pilote_sal = pilote_sal*1.05;
EXEC SQL SELECT nom, sal, commINTO :pilote_nom, :pilote_sal, :pilote_comm :ind_commFROM PILOTEWHERE nopilot = :pilote_num;IF (ind_comm == -1) pilote_sal = pilote_sal*1.05;
I-15 Christine Bonnet
- après le mot-clé INDICATOR - après le mot-clé INDICATOR
Exemple :Exemple : EXEC SQL BEGIN DECLARE SECTION; struct{ VARCHAR emp_nom[20];
float salaire;
float commission;} emprec;struct
{ short ind_emp_nom;
short ind_sal;
short ind_comm;
} ind_emprec;
int emp_num;EXEC SQL END DECLARE SECTION;
EXEC SQL BEGIN DECLARE SECTION; struct{ VARCHAR emp_nom[20];
float salaire;
float commission;} emprec;struct
{ short ind_emp_nom;
short ind_sal;
short ind_comm;
} ind_emprec;
int emp_num;EXEC SQL END DECLARE SECTION;
I-16 Christine Bonnet
Exemple suite :Exemple suite :
EXEC SQL SELECT ename,sal,commINTO :emprec INDICATOR :ind_emprecFROM EMPWHERE empno = :emp_num;
EXEC SQL SELECT ename,sal,commINTO :emprec INDICATOR :ind_emprecFROM EMPWHERE empno = :emp_num;
I-17 Christine Bonnet
VARIABLES INDICATRICES : CONTRÔLE DES TRANSFERTSVARIABLES INDICATRICES :
CONTRÔLE DES TRANSFERTSVariables indicatrices associées à une recherche : Variables indicatrices associées à une recherche :
Valeur : Valeur :
0 : valeur renvoyée non nulle, stockée dans la variable hôte associée;
-1 : aucune valeur renvoyée, variable hôte non modifiée;
>0 : valeur renvoyée tronquée pour être transférer dans la variable hôte.
0 : valeur renvoyée non nulle, stockée dans la variable hôte associée;
-1 : aucune valeur renvoyée, variable hôte non modifiée;
>0 : valeur renvoyée tronquée pour être transférer dans la variable hôte.
I-18 Christine Bonnet
VARIABLES INDICATRICES : CONTRÔLE DES TRANSFERTSVARIABLES INDICATRICES :
CONTRÔLE DES TRANSFERTSVariables indicatrices associées à une opération de
mise à jour :
Variables indicatrices associées à une opération de mise à jour :
Attribution d’une valeur nulle à une colonne, par exécution
d’un ordre INSERT ou UPDATE, en associant une variableindicatrice de valeur –1.
Attribution d’une valeur nulle à une colonne, par exécution
d’un ordre INSERT ou UPDATE, en associant une variableindicatrice de valeur –1.
Exemple :Exemple :
icomm = -1;EXEC SQL INSERT INTO pilote(nopilot, nom, sal, comm)VALUES (:no, :nom, :salaire, :commission :icomm);/* permet de ne pas enregistrer de valeur pour la colonne comm*/
icomm = -1;EXEC SQL INSERT INTO pilote(nopilot, nom, sal, comm)VALUES (:no, :nom, :salaire, :commission :icomm);/* permet de ne pas enregistrer de valeur pour la colonne comm*/
I-19 Christine Bonnet
VARIABLES HÔTESVARIABLES HÔTES
TYPE TABLEAUTYPE TABLEAU
Variable de réception d’une requête SQL
Traitement des requêtes SELECT … INTO … renvoyant
plusieurs lignes (à la condition que le tableau soit de
taille suffisante pour recevoir toutes les lignes) – au lieu
d’un ordre FETCH;
Technique permettant également de distribuer plusieurs
lignes à chaque exécution d’un ordre FETCH.
Variable de réception d’une requête SQL
Traitement des requêtes SELECT … INTO … renvoyant
plusieurs lignes (à la condition que le tableau soit de
taille suffisante pour recevoir toutes les lignes) – au lieu
d’un ordre FETCH;
Technique permettant également de distribuer plusieurs
lignes à chaque exécution d’un ordre FETCH.
I-20 Christine Bonnet
VARIABLES HÔTES (type tableau)VARIABLES HÔTES (type tableau)
EXEC SQL BEGIN DECLARE SECTION;int numéro[50];
float montant[50]; EXEC SQL END DECLARE SECTION;
EXEC SQL BEGIN DECLARE SECTION;int numéro[50];
float montant[50]; EXEC SQL END DECLARE SECTION;
1. Déclaration1. Déclaration
2. Utilisation2. Utilisation
/* ensemble des pilotes ayant salaire > 10000 */
EXEC SQL SELECT nopilot,sal FROM pilote
INTO :numéro, :montant WHERE sal > 10000;
/* ensemble des pilotes ayant salaire > 10000 */
EXEC SQL SELECT nopilot,sal FROM pilote
INTO :numéro, :montant WHERE sal > 10000;
I-21 Christine Bonnet
/* insertion de plusieurs tuples par un seul ordre INSERT */
EXEC SQL INSERT INTO tablex
VALUES (:numéro, :montant);
/* mise à jour de la colonne sal pour les pilotes référencés
dans le tableau */
EXEC SQL UPDATE pilote
SET sal = :montant
WHERE nopilote = :numéro;
/* Limitation du nombre de lignes à utiliser dans un tableau*/
n=5;
EXEC SQL FOR :n
UPDATE pilote SET ….
/* insertion de plusieurs tuples par un seul ordre INSERT */
EXEC SQL INSERT INTO tablex
VALUES (:numéro, :montant);
/* mise à jour de la colonne sal pour les pilotes référencés
dans le tableau */
EXEC SQL UPDATE pilote
SET sal = :montant
WHERE nopilote = :numéro;
/* Limitation du nombre de lignes à utiliser dans un tableau*/
n=5;
EXEC SQL FOR :n
UPDATE pilote SET ….
I-22 Christine Bonnet
ZONE DE COMMUNICATIONZONE DE COMMUNICATION
INCLURE EN DÉBUT DE PROGRAMME HÔTE L’ORDRE :INCLURE EN DÉBUT DE PROGRAMME HÔTE L’ORDRE :
EXEC SQL INCLUDE SQLCA.H;
OU#include <sqlca.h>
EXEC SQL INCLUDE SQLCA.H;
OU#include <sqlca.h>
En fin d’un ordre SQL, la zone SQLCA contient un certain
nombre de comptes-rendus et de codes d’erreur éventuels,
tels que :
En fin d’un ordre SQL, la zone SQLCA contient un certain
nombre de comptes-rendus et de codes d’erreur éventuels,
tels que :
• SQLCODE : donne le statut de l’ordre SQL 0 exécution normale
>0 warning <0 erreur fatale
• SQLCODE : donne le statut de l’ordre SQL 0 exécution normale
>0 warning <0 erreur fatale
I-23 Christine Bonnet
ZONE DE COMMUNICATIONZONE DE COMMUNICATION• SQLERRM : donne des informations complémentaires
en cas d’erreur ou d’avertissement. Deux champs :
- SQLERRML : largeur du texte stocké dans le champ suivant;
- SQLERRMC : texte du message d’erreur;
• SQLERRD (tableau de 6 éléments) SQLERRD(5) : position de l’erreur dans le texte de l’ordre SQL;
• SQLWARN (tableau de 8 éléments) SQLWARN(5) : positionné si l’ordre exécuté est un ordre UPDATE ou DELETE inconditionnel.
• SQLERRM : donne des informations complémentaires en cas d’erreur ou d’avertissement.
Deux champs :
- SQLERRML : largeur du texte stocké dans le champ suivant;
- SQLERRMC : texte du message d’erreur;
• SQLERRD (tableau de 6 éléments) SQLERRD(5) : position de l’erreur dans le texte de l’ordre SQL;
• SQLWARN (tableau de 8 éléments) SQLWARN(5) : positionné si l’ordre exécuté est un ordre UPDATE ou DELETE inconditionnel.
I-24 Christine Bonnet
CONNEXIONCONNEXION
CONNEXION A UNE SEULE BASE :CONNEXION A UNE SEULE BASE :
EXEC SQL CONNECT :nom_utilisateur
IDENTIFIED BY :mot_passe;
EXEC SQL CONNECT :nom_utilisateur
IDENTIFIED BY :mot_passe;
OUOU
EXEC SQL CONNECT :connexion;EXEC SQL CONNECT :connexion;
Nom_utilisateur, mot_passe, connexion : variable de type
CHAR ou VARCHAR
Nom_utilisateur, mot_passe, connexion : variable de type
CHAR ou VARCHAR
1er ORDRE SQL INTÉGRÉ EXÉCUTÉ DU PROGRAMME C1er ORDRE SQL INTÉGRÉ EXÉCUTÉ DU PROGRAMME C
I-25 Christine Bonnet
CONNEXIONS MULTIPLES (bases locales ou distantes) :CONNEXIONS MULTIPLES (bases locales ou distantes) :
EXEC SQL CONNECT :nom_utilisateur IDENTIFIED BY :mot_passe
AT nom_base USING :chaîne_de_connexion;
EXEC SQL CONNECT :nom_utilisateur IDENTIFIED BY :mot_passe
AT nom_base USING :chaîne_de_connexion;
Nom_base : nom local associé à la base,Chaîne_de_connexion : protocole, adresse de la machine distante et nom de la base.
Nom_base : nom local associé à la base,Chaîne_de_connexion : protocole, adresse de la machine distante et nom de la base.
Exemples :Exemples :
1. /* VARCHAR ch_connexion[20] */ strcpy(ch_connexion, «grXX/grXX@INFO8i»);
ch_connexion.len=strlen(ch_connexion.arr); EXEC SQL CONNECT :ch_connexion;
2. char * uid = « grXX/grXX » EXEC SQL CONNECT :uid;
1. /* VARCHAR ch_connexion[20] */ strcpy(ch_connexion, «grXX/grXX@INFO8i»);
ch_connexion.len=strlen(ch_connexion.arr); EXEC SQL CONNECT :ch_connexion;
2. char * uid = « grXX/grXX » EXEC SQL CONNECT :uid;
I-26 Christine Bonnet
CONNEXIONS MULTIPLES (bases locales ou distantes) :CONNEXIONS MULTIPLES (bases locales ou distantes) :
Exemple :Exemple :
EXEC SQL AT nom_base Ordre_SQL:EXEC SQL AT nom_base Ordre_SQL:
Plusieurs bases accessibles dans un même programme
Spécifier la base visée pour chaque ordre SQL
Plusieurs bases accessibles dans un même programme
Spécifier la base visée pour chaque ordre SQL
EXEC SQL AT base-vol SELECT * FROM avion;EXEC SQL AT base-vol SELECT * FROM avion;
I-27 Christine Bonnet
ACCÈS À LA BASEACCÈS À LA BASE
Requêtes ne ramenant qu’une seule ligne :Requêtes ne ramenant qu’une seule ligne :
EXEC SQL SELECT … INTO :nom_var_hôte, …, ;EXEC SQL SELECT … INTO :nom_var_hôte, …, ;
Requêtes ramenant plusieurs lignes :Requêtes ramenant plusieurs lignes :
1. Utilisation de variables hôtes de type tableau;
2. Utilisation de curseurs.
1. Utilisation de variables hôtes de type tableau;
2. Utilisation de curseurs.
I-28 Christine Bonnet
CURSEURCURSEURDéclaration :Déclaration :
EXEC SQL DECLARE nom_curseur CURSOR
FOR ordre-sql;
EXEC SQL DECLARE nom_curseur CURSOR
FOR ordre-sql;
Ouverture :Ouverture :
Distribution des lignes :Distribution des lignes :
Fermeture :Fermeture :
EXEC SQL OPEN nom_curseur;EXEC SQL OPEN nom_curseur;
EXEC SQL FETCH nom_curseur INTO liste variables hôtes;EXEC SQL FETCH nom_curseur INTO liste variables hôtes;
EXEC SQL CLOSE nom_curseur;EXEC SQL CLOSE nom_curseur;
I-29 Christine Bonnet
CURSEURCURSEUR
Exemple :Exemple :
EXEC SQL DECLARE C1 CURSOR FOR
SELECT empno, ename, sal FROM EMP;
EXEC SQL OPEN C1;
EXEC SQL WHENEVER NOT FOUND DO break;
for ( ; ; )
{ EXEC SQL FETCH C1 INTO :emp_rec;
…
}
EXEC SQL CLOSE C1;
EXEC SQL DECLARE C1 CURSOR FOR
SELECT empno, ename, sal FROM EMP;
EXEC SQL OPEN C1;
EXEC SQL WHENEVER NOT FOUND DO break;
for ( ; ; )
{ EXEC SQL FETCH C1 INTO :emp_rec;
…
}
EXEC SQL CLOSE C1;
I-30 Christine Bonnet
TRAITEMENT DES ERREURSTRAITEMENT DES ERREURS
Utilisation :
des informations de la zone SQLCA
de l’instruction WHENEVER;
Utilisation :
des informations de la zone SQLCA
de l’instruction WHENEVER;
I-31 Christine Bonnet
EXEC SQL WHENEVER <événement> <action>EXEC SQL WHENEVER <événement> <action>
Événement :Événement :
SQLERROR : détection de la présence d’une erreur
(SQLCODE < 0) ;SQLWARNING : détection de la présence d’une anomalie indiquée dans une des zones
SQLWARN(2) à SQLWARN(8) ;NOT FOUND : détection de la fin de distribution de lignes pour une instruction FETCH
(SQLCODE = +1403) ;
SQLERROR : détection de la présence d’une erreur
(SQLCODE < 0) ;SQLWARNING : détection de la présence d’une anomalie indiquée dans une des zones
SQLWARN(2) à SQLWARN(8) ;NOT FOUND : détection de la fin de distribution de lignes pour une instruction FETCH
(SQLCODE = +1403) ;
I-32 Christine Bonnet
EXEC SQL WHENEVER <événement> <action>EXEC SQL WHENEVER <événement> <action>
Action :Action :
STOP : arrêt de l’exécution du programme; si une
transaction est en cours, elle est annulée ;
CONTINUE : l’exécution du programme continue en
séquence; permet de neutraliser l’effet
de WHENEVER ;
GO TO : branchement à l’étiquette spécifiée ;
DO nom_procédure : le programme transfert le contrôle
à une procédure.
STOP : arrêt de l’exécution du programme; si une
transaction est en cours, elle est annulée ;
CONTINUE : l’exécution du programme continue en
séquence; permet de neutraliser l’effet
de WHENEVER ;
GO TO : branchement à l’étiquette spécifiée ;
DO nom_procédure : le programme transfert le contrôle
à une procédure.
I-33 Christine Bonnet
EXEC SQL WHENEVER <événement> <action>EXEC SQL WHENEVER <événement> <action>
Portée de l’instruction :Portée de l’instruction :
L’action spécifiée par l’instruction est active dès l’exécution
de l’ordre et le reste jusqu’à la fin du programme ou jusqu’à
l’exécution d’un ordre WHENEVER portant sur la même
condition.
L’action spécifiée par l’instruction est active dès l’exécution
de l’ordre et le reste jusqu’à la fin du programme ou jusqu’à
l’exécution d’un ordre WHENEVER portant sur la même
condition.
Exemple :Exemple :
EXEC SQL WHENEVER SQLERROR DO sqlerro();
…
void sqlerro() {
EXEC SQL WHENEVER SQLERROR CONTINUE;printf(« \n%.70s\n »,sqlca.sqlerrm.sqlerrmc);EXEC SQL ROLLBACK RELEASE;exit(1);
}
EXEC SQL WHENEVER SQLERROR DO sqlerro();
…
void sqlerro() {
EXEC SQL WHENEVER SQLERROR CONTINUE;printf(« \n%.70s\n »,sqlca.sqlerrm.sqlerrmc);EXEC SQL ROLLBACK RELEASE;exit(1);
}
I-34 Christine Bonnet
GESTION DES TRANSACTIONSGESTION DES TRANSACTIONS
• Validation • Validation
EXEC SQL COMMIT WORK [RELEASE];EXEC SQL COMMIT WORK [RELEASE];
• Annulation • Annulation
EXEC SQL ROLLBACK WORK [RELEASE];EXEC SQL ROLLBACK WORK [RELEASE];
• Gestion des transactions avec points de reprise • Gestion des transactions avec points de reprise
EXEC SQL ROLLBACK TO SAVEPOINT nom; EXEC SQL ROLLBACK TO SAVEPOINT nom; EXEC SQL SAVEPOINT nom;EXEC SQL SAVEPOINT nom;
RELEASE : permet de libérer les ressources (verrous, curseurs, …) et de déconnecter l’utilisateur.RELEASE : permet de libérer les ressources (verrous, curseurs, …) et de déconnecter l’utilisateur.
I-35 Christine Bonnet
ORDRES SQL DYNAMIQUESORDRES SQL DYNAMIQUES
Ordres SQL construits lors de l’exécution du Ordres SQL construits lors de l’exécution du
programme.programme.
Ordres SQL construits lors de l’exécution du Ordres SQL construits lors de l’exécution du
programme.programme.
ORDRE SQL autre que SELECT, sans variable
hôte de paramétrage :
ORDRE SQL autre que SELECT, sans variable
hôte de paramétrage :
EXEC SQL EXECUTE IMMEDIATE [:var_hôte | « chaîne »];EXEC SQL EXECUTE IMMEDIATE [:var_hôte | « chaîne »];
I-36 Christine Bonnet
Exemple :Exemple :
EXEC SQL EXECUTE IMMEDIATE « CREATE TABLE
dyn1 (col1 VARCHAR2(4)) »;
…
strcpy ((char *) ordre1dyn, « INSERT INTO dyn1 VALUES
(‘TEST’) »);
EXEC SQL EXECUTE IMMEDIATE :ordre1dyn ;
strcpy(ordre2dyn, «COMMIT »);
EXEC SQL EXECUTE IMMEDIATE :ordre2dyn;
EXEC SQL EXECUTE IMMEDIATE « CREATE TABLE
dyn1 (col1 VARCHAR2(4)) »;
…
strcpy ((char *) ordre1dyn, « INSERT INTO dyn1 VALUES
(‘TEST’) »);
EXEC SQL EXECUTE IMMEDIATE :ordre1dyn ;
strcpy(ordre2dyn, «COMMIT »);
EXEC SQL EXECUTE IMMEDIATE :ordre2dyn;
I-37 Christine Bonnet
ORDRE SQL autre que SELECT, avec variable
hôte de paramétrage :
ORDRE SQL autre que SELECT, avec variable
hôte de paramétrage :
Le type et le nombre de variables hôtes sont connus à l’avance.Le type et le nombre de variables hôtes sont connus à l’avance.
1. Préparation :1. Préparation :
EXEC SQL PREPARE nom_ordre
FROM [:var_hôte | « chaîne »];
EXEC SQL PREPARE nom_ordre
FROM [:var_hôte | « chaîne »];
Attribution d’un nom d’ordre à l’ordre SQL et compilation (nom_ordre non déclaré).
Attribution d’un nom d’ordre à l’ordre SQL et compilation (nom_ordre non déclaré).
2. Exécution :2. Exécution :
EXECUTE nom_ordre USING liste de valeurs;EXECUTE nom_ordre USING liste de valeurs;
I-38 Christine Bonnet
Exemple :Exemple :EXEC SQL BEGIN DECLARE SECTION;
int empno = 1234;
int deptno1=10;
int deptno2=20;
VARCHAR ordredyn [80];
EXEC SQL END DECLARE SECTION;
strcpy ((char *) ordredyn.arr, « INSERT INTO EMP
(EMPNO,DEPTNO) VALUES (:v1, :v2) »);
/* Préparation de S */
EXEC SQL PREPARE S FROM :ordredyn;
/* Exécution de S */
EXEC SQL EXECUTE S USING :empno, :deptno1;
EXEC SQL BEGIN DECLARE SECTION;
int empno = 1234;
int deptno1=10;
int deptno2=20;
VARCHAR ordredyn [80];
EXEC SQL END DECLARE SECTION;
strcpy ((char *) ordredyn.arr, « INSERT INTO EMP
(EMPNO,DEPTNO) VALUES (:v1, :v2) »);
/* Préparation de S */
EXEC SQL PREPARE S FROM :ordredyn;
/* Exécution de S */
EXEC SQL EXECUTE S USING :empno, :deptno1;
I-39 Christine Bonnet
Exemple suite :Exemple suite :
empno ++;
/* Ré - exécution de S */
EXEC SQL EXECUTE S USING :empno, :deptno2;
strcpy ((char *) ordredyn.arr, « DELETE FROM EMP
WHERE DEPTNO= :v1 OR DEPTNO= :v2»);
/* Re - préparation de S */
EXEC SQL PREPARE S FROM :ordredyn;
/* Exécution de S */
EXEC SQL EXECUTE S USING :deptno1, :deptno2;
empno ++;
/* Ré - exécution de S */
EXEC SQL EXECUTE S USING :empno, :deptno2;
strcpy ((char *) ordredyn.arr, « DELETE FROM EMP
WHERE DEPTNO= :v1 OR DEPTNO= :v2»);
/* Re - préparation de S */
EXEC SQL PREPARE S FROM :ordredyn;
/* Exécution de S */
EXEC SQL EXECUTE S USING :deptno1, :deptno2;
I-40 Christine Bonnet
ORDRE SQL SELECT, avec ou sans variable hôte de paramétrage :
ORDRE SQL SELECT, avec ou sans variable hôte de paramétrage :
Les attributs projetés et les conditions de sélection sont
connus à l’avance.
Les attributs projetés et les conditions de sélection sont
connus à l’avance.
1. Préparation :1. Préparation :
EXEC SQL PREPARE nom_ordre
FROM [:var_hôte | « chaîne »];
EXEC SQL PREPARE nom_ordre
FROM [:var_hôte | « chaîne »];
Attribution d’un nom d’ordre à l’ordre SQL et compilation (nom_ordre non déclaré).
Attribution d’un nom d’ordre à l’ordre SQL et compilation (nom_ordre non déclaré).
2. Déclaration d’un curseur associé :2. Déclaration d’un curseur associé :
EXEC SQL DECLARE nom_curseur
CURSOR FOR nom_ordre;
EXEC SQL DECLARE nom_curseur
CURSOR FOR nom_ordre;
I-41 Christine Bonnet
3. Ouverture du curseur :3. Ouverture du curseur :
EXEC SQL OPEN nom_curseur [USING liste
variables paramètres];
EXEC SQL OPEN nom_curseur [USING liste
variables paramètres];
4. Distribution des lignes :4. Distribution des lignes :
EXEC SQL FETCH nom_curseur INTO liste_var_hôtes;EXEC SQL FETCH nom_curseur INTO liste_var_hôtes;
5. Fermeture du curseur :5. Fermeture du curseur :
EXEC SQL CLOSE nom_curseur;EXEC SQL CLOSE nom_curseur;
I-42 Christine Bonnet
Exemple :Exemple :
……
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR ename [10];
VARCHAR ordredyn [80];
int deptno = 10.
EXEC SQL END DECLARE SECTION;
…
strcpy ((char *) ordredyn.arr, «SELECT ename FROM
EMP WHERE DEPTNO = :v1 »);
/* Préparation */
EXEC SQL PREPARE S FROM :ordredyn;
/* Déclaration d’un curseur associé */
EXEC SQL DECLARE C CURSOR FOR S;
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR ename [10];
VARCHAR ordredyn [80];
int deptno = 10.
EXEC SQL END DECLARE SECTION;
…
strcpy ((char *) ordredyn.arr, «SELECT ename FROM
EMP WHERE DEPTNO = :v1 »);
/* Préparation */
EXEC SQL PREPARE S FROM :ordredyn;
/* Déclaration d’un curseur associé */
EXEC SQL DECLARE C CURSOR FOR S;
I-43 Christine Bonnet
Exemple suite:Exemple suite:
……
/* Ouverture du curseur */
EXEC SQL OPEN C USING :deptno;
/* Distribution des lignes */
EXEC SQL WHENEVER NOT FOUND DO break;
for ( ; ; )
{ EXEC SQL FETCH C INTO :ename;
ename.arr[ename.len]=‘\0’;
puts((char *) ename.arr);
}
/* Fermeture du curseur */
EXEC SQL CLOSE C;
/* Ouverture du curseur */
EXEC SQL OPEN C USING :deptno;
/* Distribution des lignes */
EXEC SQL WHENEVER NOT FOUND DO break;
for ( ; ; )
{ EXEC SQL FETCH C INTO :ename;
ename.arr[ename.len]=‘\0’;
puts((char *) ename.arr);
}
/* Fermeture du curseur */
EXEC SQL CLOSE C;
I-44 Christine Bonnet
I-45 Christine Bonnet
ORDRES SQL ENTIÈREMENT DYNAMIQUES
ORDRES SQL ENTIÈREMENT DYNAMIQUES
La liste d’attributs (ou liste de sélection) à projeter et/ou
les critères de sélection sont inconnus au moment de la
rédaction du programme.
La liste d’attributs (ou liste de sélection) à projeter et/ou
les critères de sélection sont inconnus au moment de la
rédaction du programme.
Utilisation d’une zone de communication dynamique SQLDA
(SQL Description Area) pour définir au moment de l’exécution :
les éléments de la liste de sélection ;
les critères de sélection.
Utilisation d’une zone de communication dynamique SQLDA
(SQL Description Area) pour définir au moment de l’exécution :
les éléments de la liste de sélection ;
les critères de sélection.
Exemple : sample10.pcExemple : sample10.pc
I-46 Christine Bonnet
RÉSUMÉRÉSUMÉ
/* include */#include …./* déclaration de constantes */#define …/ déclaration des variables hôtes */EXEC SQL BEGIN DECLARE SECTION;VARCHAR ch_connexion[20];…EXEC SQL END DECLARE SECTION;/* déclaration de procédures, fonctions, fonctions de gestiondes erreurs */void sql_error();…/* Zone de communication */EXEC SQL INCLUDE SQLCA.H;
/* include */#include …./* déclaration de constantes */#define …/ déclaration des variables hôtes */EXEC SQL BEGIN DECLARE SECTION;VARCHAR ch_connexion[20];…EXEC SQL END DECLARE SECTION;/* déclaration de procédures, fonctions, fonctions de gestiondes erreurs */void sql_error();…/* Zone de communication */EXEC SQL INCLUDE SQLCA.H;
I-47 Christine Bonnet
RÉSUMÉ suiteRÉSUMÉ suitemain()…EXEC SQL WHENEVER SQLERROR DO sql_error();..EXEC SQL CONNECT :ch_connexion;… /* autres ordres SQL intégrés */…/* déconnexion de la base */EXEC SQL COMMIT WORK RELEASE;exit(0);}void sql_error(){…..}
main()…EXEC SQL WHENEVER SQLERROR DO sql_error();..EXEC SQL CONNECT :ch_connexion;… /* autres ordres SQL intégrés */…/* déconnexion de la base */EXEC SQL COMMIT WORK RELEASE;exit(0);}void sql_error(){…..}