Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

47
Christine Bonnet SOURCES : « Samples » d’Oracle, « Oracle 8 » R. Chap PRO*C – C ++

Transcript of Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

Page 1: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

Christine Bonnet SOURCES :  « Samples » d’Oracle, « Oracle 8 » R. Chapuis

PRO*C – C++PRO*C – C++

Page 2: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis 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).

Page 3: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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

Page 4: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 5: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 6: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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.

Page 7: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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

Page 8: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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.

Page 9: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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

Page 10: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 11: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 12: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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 »);

Page 13: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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);

Page 14: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 15: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 16: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 17: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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.

Page 18: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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*/

Page 19: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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.

Page 20: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 21: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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 ….

Page 22: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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

Page 23: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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.

Page 24: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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

Page 25: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – 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;

Page 26: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 27: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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.

Page 28: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 29: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 30: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 31: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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) ;

Page 32: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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.

Page 33: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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);

}

Page 34: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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.

Page 35: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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 »];

Page 36: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 37: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 38: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 39: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 40: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 41: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 42: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 43: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 44: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

I-44 Christine Bonnet

Page 45: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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

Page 46: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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;

Page 47: Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++

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(){…..}