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

Slides:



Advertisements
Présentations similaires
Premier programme en C :
Advertisements

PL/SQL : Le Langage PL/SQL est une extension du SQL, qui offre
SQL - Subtilités.
Vues.
51 Les technologies XML Cours 6 : XML et les architectures N-tiers – Tier Métier Janvier Version 1.0 -
C.
PHP mySQL Extension php_mysql. Connexion à une base de données Établir une connexion mysql_connect(string server, string username, string password) –permet.
TP 3-4 BD21.
Programmation dapplication INT. 2 Bases de Données Plan du document Contexteslide 1 Programmer avec une BDslide 2 Client-Serveur SQL et architecture 3.
Programme Introduction aux BD et aux SGBD Le modèle relationnel
Année universitaire Système dinformation Le SQL (Structured Query Language) langage dinterrogation dune base de données.
LE LANGAGE SQL : LDD La création de tables L’ordre CREATE CREATE TABLE nom_de_table (Nom_colonne Type_colonne, Nom_colonne Type_colonne,
L’utilisation des bases de données
Connexion en mode application. Bases de données - Yann Loyer2 Connexion en mode application Pour tout type dutilisateurs : –passif, actif, gérant Permettre.
Initiation aux bases de données et à la programmation événementielle
T ECHNOLOGIES O RACLE Manipulation des données © sebvita.com.
Copyright Oracle Corporation, Tous droits réservés. 9 Écriture de Sous- Interrogations Synchronisées.
JDBC ou comment manipuler une base de données en Java ?
L’utilisation des bases de données
F Copyright © Oracle Corporation, Tous droits réservés. Créer des programmes avec Procedure Builder.
1 LE LANGAGE DE REQUETES SQL Origines et Evolutions SQL1 86: la base SQL1 89: l'intégrité.
EPID-CPI-ISAIP Philippe Bancquart - mise à jour 24/02/ page 1 Procédures stockées CPI-SQLServer.
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
1 Développement des Applications des Bases de Données Chapitre 6.
MySQL Création des sites dynamiques
PL/SQL Noreddine GHERABI 1.
Les transactions.
OPTIMISATION DE BASE DE DONNEES ORACLE
Procédures Stockées Schedule: Timing Topic 60 minutes Lecture
L’essentiel du langage C
Structures des données
Introduction.
 CREATE TABLE  DROP TABLE  ALTER TABLE  INSERT  UPDATE  DELETE  SELECT interrogation 2 Instruction de mise à jour structure.
Présenté par COMTE Jeremy et DE LAZZARI Thomas Sommaire b Présentation générale b Include b Notion de variables b MySQL.
Les Pointeurs et les Tableaux Statiques et Tableaux Dynamiques
Le Langage de BLOC PL/SQL
JDBC L'API JDBC est utilisée pour utilisée pour intéragir avec une base de données.
Les Composants de l’architecture Oracle
Chapitre 6.2 Les curseurs Cours SGBD 3A Mme hkimi Jihène
Créer des packages.
Copyright  Oracle Corporation, All rights reserved. 19 Gestion des Privilèges.
Manipulation des Données
DEFINITION DES DONNEES : schéma conceptuel. Schéma conceptuel instructiondescription CREATE TABLEcréation d'une relation ALTER TABLEmodification de la.
Les Contraintes.
SQL : Langage de Manipulation des données
21/04/2015© Robert Godin. Tous droits réservés.1 6Gestion des contraintes d’intégrité en SQL n Contrainte d'intégrité statique – respectée pour chacun.
Cours SQL.
Quinio1 Bases de données : modèlisation et SGBD Séance 3 B Quinio.
Introduction  Langage propre à Oracle basé sur ADA  Offre une extension procédurale à SQL  PL/SQL permet d’utiliser un sous-ensemble du langage SQL.
Révision du langage PL/SQL
Création et Gestion de Tables
3 Copyright © Oracle Corporation, Tous droits réservés. Créer des fonctions.
02/06/2015© Robert Godin. Tous droits réservés.1 5 Interface entre SQL et un programme n SQL incomplet n Défaut d'impédance (impedance mismatch) – modèle.
 L’information est conservée sous forme de tables  Contient: ◦ Un nom ◦ Une clé primaire ◦ Une liste de colonnes ◦ Les informations/données (sous forme.
Interface Java – Oracle : JDBC. I-2 JDBC (Java DataBase Connectivity) : interface API (Application Programming Interface) qui permet d’exécuter des ordres.
Les bases de données Séance 8 Jointures.
Le Langage de Manipulation de Données LMD. 2 Les ordres SQL de manipulation INSERT –Insertion (ajout) de ligne(s) dans une table –Utiliser SQL*LOAD pour.
MANIPULATION DES DONNEES : mise à jour des n-uplets.
Types de données composites
Le langage SQL.
Séance /10/2004 SGBD - Approches & Principes.
Cours n°2 Implémentation et exploitation
Organisation de la mémoire pour le langage minimal Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Introduction au langage PL/SQL
Les exceptions Une exception est un identificateur PL/SQL détecté pendant la phase d’exécution. Comment est-elle déclenchée ? À la suite d’une erreur.
Les vues, indexes, séquences.  Qu’est ce qu’une vue 1. Une vue est une vision partielle ou particulière des données d'une ou plusieurs tables de la base.
Le Langage de Manipulation de Données LMD Module 6.
1 Les bases de données Séance 5 -- Le Langage de Définition de Données ou la manœuvre de la structure de la base -- Le Langage de Manœuvre de Données.
Transcription de la présentation:

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

I-2 Christine Bonnet PRO*C Incorporation dordres SQL dans un programme écrit en langage C Ordres SQL intégrés Ordres SQL intégrés Une phase de pré-compilation prend en charge la transformation des ordres SQL en appel OCI (Oracle Call Interface). Incorporation dordres SQL dans un programme écrit en langage C Ordres SQL intégrés Ordres SQL intégrés Une phase de pré-compilation prend en charge la transformation des ordres SQL en appel OCI (Oracle Call Interface).

I-3 Christine Bonnet ORDRES SQL INTÉGRÉS ALTER SESSION ALTER COMMENT COMMIT ANALYSE AUDIT CREATE DELETE DROP EXPLAIN PLAN GRANT INSERT LOCK TABLE NOAUDIT RENAME REVOKE ROLLBACK SAVEPOINT SELECT SET ROLE SET TRANSACTION TRUNCATE UPDATE CLOSE CONNECT DESCRIBE EXECUTE FETCH OPEN PREPARE Ordres interactifs Ordres 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ÉS Intégration : 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É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ÉS Ordres SQL dynamiques : construits lors de Ordres SQL dynamiques : construits lors de lexécution du programme. lexécution du programme. Ordres SQL dynamiques : construits lors de Ordres SQL dynamiques : construits lors de lexécution du programme. lexécution du programme. Utilités : Le texte de lordre SQL nest 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 lordre SQL nest 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éveloppement SOURCE Pré-compilation PRO*C SOURCE modifiée Compilateur OBJET Bibliothè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

I-8 Christine Bonnet VARIABLES 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ÔTES TYPE SIMPLE EXEC SQL BEGIN DECLARE SECTION; … EXEC SQL END DECLARE SECTION; EXEC SQL BEGIN DECLARE SECTION; … EXEC SQL END DECLARE SECTION; 1.Déclaration

I-10 Christine Bonnet VARIABLES HÔTES 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ÔTES TYPE VARCHAR : VARCHAR nom_variable[longueur]; Pseudo-type permettant de définir des variables de communication pour manipuler des chaînes de caractères de 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ères de 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ÔTES TYPE VARCHAR : Utilisation dune variable de type VARCHAR : nom_variable.arr Utilisation dune variable de type VARCHAR : nom_variable.arr 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ÔTES 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) INDICATRICES Déclarées dans la section déclaration; Utilisées : dans une clause INTO dun ordre SELECT, précédées de « : » - immédiatement après la variable hôte recevant la valeur renvoyée par lordre SELECT Déclarées dans la section déclaration; Utilisées : dans une clause INTO dun ordre SELECT, précédées de « : » - immédiatement après la variable hôte recevant la valeur renvoyée par lordre SELECT Exemple : EXEC SQL SELECT nom, sal, comm INTO :pilote_nom, :pilote_sal, :pilote_comm :ind_comm FROM PILOTE WHERE nopilot = :pilote_num; IF (ind_comm == -1) pilote_sal = pilote_sal*1.05; EXEC SQL SELECT nom, sal, comm INTO :pilote_nom, :pilote_sal, :pilote_comm :ind_comm FROM PILOTE WHERE nopilot = :pilote_num; IF (ind_comm == -1) pilote_sal = pilote_sal*1.05;

I-15 Christine Bonnet - après le mot-clé INDICATOR 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 : EXEC SQL SELECT ename,sal,comm INTO :emprec INDICATOR :ind_emprec FROM EMP WHERE empno = :emp_num; EXEC SQL SELECT ename,sal,comm INTO :emprec INDICATOR :ind_emprec FROM EMP WHERE empno = :emp_num;

I-17 Christine Bonnet VARIABLES INDICATRICES : CONTRÔLE DES TRANSFERTS Variables indicatrices associées à une recherche : 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 TRANSFERTS Variables indicatrices associées à une opération de mise à jour : Variables indicatrices associées à une opération de mise à jour : Attribution dune valeur nulle à une colonne, par exécution dun ordre INSERT ou UPDATE, en associant une variable indicatrice de valeur –1. Attribution dune valeur nulle à une colonne, par exécution dun ordre INSERT ou UPDATE, en associant une variable indicatrice de valeur –1. 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ÔTES TYPE TABLEAU Variable de réception dune 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 dun ordre FETCH; Technique permettant également de distribuer plusieurs lignes à chaque exécution dun ordre FETCH. Variable de réception dune 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 dun ordre FETCH; Technique permettant également de distribuer plusieurs lignes à chaque exécution dun ordre FETCH.

I-20 Christine Bonnet 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éclaration 2.Utilisation /* ensemble des pilotes ayant salaire > */ EXEC SQL SELECT nopilot,sal FROM pilote INTO :numéro, :montant WHERE sal > 10000; /* ensemble des pilotes ayant salaire > */ 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 COMMUNICATION INCLURE EN DÉBUT DE PROGRAMME HÔTE LORDRE : EXEC SQL INCLUDE SQLCA.H; OU #include EXEC SQL INCLUDE SQLCA.H; OU #include En fin dun ordre SQL, la zone SQLCA contient un certain nombre de comptes-rendus et de codes derreur éventuels, tels que : En fin dun ordre SQL, la zone SQLCA contient un certain nombre de comptes-rendus et de codes derreur éventuels, tels que : SQLCODE : donne le statut de lordre SQL 0 exécution normale >0warning <0 erreur fatale SQLCODE : donne le statut de lordre SQL 0 exécution normale >0warning <0 erreur fatale

I-23 Christine Bonnet ZONE DE COMMUNICATION SQLERRM : donne des informations complémentaires en cas derreur ou davertissement. Deux champs : - SQLERRML : largeur du texte stocké dans le champ suivant; - SQLERRMC : texte du message derreur; SQLERRD (tableau de 6 éléments) SQLERRD(5) : position de lerreur dans le texte de lordre SQL; SQLWARN (tableau de 8 éléments) SQLWARN(5) : positionné si lordre exécuté est un ordre UPDATE ou DELETE inconditionnel. SQLERRM : donne des informations complémentaires en cas derreur ou davertissement. Deux champs : - SQLERRML : largeur du texte stocké dans le champ suivant; - SQLERRMC : texte du message derreur; SQLERRD (tableau de 6 éléments) SQLERRD(5) : position de lerreur dans le texte de lordre SQL; SQLWARN (tableau de 8 éléments) SQLWARN(5) : positionné si lordre exécuté est un ordre UPDATE ou DELETE inconditionnel.

I-24 Christine Bonnet CONNEXION CONNEXION A UNE SEULE BASE : EXEC SQL CONNECT :nom_utilisateur IDENTIFIED BY :mot_passe; EXEC SQL CONNECT :nom_utilisateur IDENTIFIED BY :mot_passe; OU 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 1 er ORDRE SQL INTÉGRÉ EXÉCUTÉ DU PROGRAMME C

I-25 Christine Bonnet 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 : 1./* VARCHAR ch_connexion[20] */ strcpy(ch_connexion, 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, 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) : Exemple : 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;

I-27 Christine Bonnet ACCÈS À LA BASE Requêtes ne ramenant quune seule ligne : EXEC SQL SELECT … INTO :nom_var_hôte, …, ; 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 CURSEUR Déclaration : EXEC SQL DECLARE nom_curseur CURSOR FOR ordre-sql; EXEC SQL DECLARE nom_curseur CURSOR FOR ordre-sql; Ouverture : Distribution des lignes : Fermeture : 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;

I-29 Christine Bonnet CURSEUR 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 ERREURS Utilisation : des informations de la zone SQLCA de linstruction WHENEVER; Utilisation : des informations de la zone SQLCA de linstruction WHENEVER;

I-31 Christine Bonnet EXEC SQL WHENEVER Événement : SQLERROR : détection de la présence dune erreur (SQLCODE < 0) ; SQLWARNING : détection de la présence dune 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 dune erreur (SQLCODE < 0) ; SQLWARNING : détection de la présence dune 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 Action : STOP : arrêt de lexécution du programme; si une transaction est en cours, elle est annulée ; CONTINUE : lexécution du programme continue en séquence; permet de neutraliser leffet 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 lexécution du programme; si une transaction est en cours, elle est annulée ; CONTINUE : lexécution du programme continue en séquence; permet de neutraliser leffet 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 Portée de linstruction : Laction spécifiée par linstruction est active dès lexécution de lordre et le reste jusquà la fin du programme ou jusquà lexécution dun ordre WHENEVER portant sur la même condition. Laction spécifiée par linstruction est active dès lexécution de lordre et le reste jusquà la fin du programme ou jusquà lexécution dun ordre WHENEVER portant sur la même condition. 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 TRANSACTIONS Validation EXEC SQL COMMIT WORK [RELEASE]; Annulation EXEC SQL ROLLBACK WORK [RELEASE]; Gestion des transactions avec points de reprise EXEC SQL ROLLBACK TO SAVEPOINT nom; EXEC SQL SAVEPOINT nom; RELEASE : permet de libérer les ressources (verrous, curseurs, …) et de déconnecter lutilisateur. RELEASE : permet de libérer les ressources (verrous, curseurs, …) et de déconnecter lutilisateur.

I-35 Christine Bonnet ORDRES SQL DYNAMIQUES Ordres SQL construits lors de lexé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 »];

I-36 Christine Bonnet 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 à lavance. Le type et le nombre de variables hôtes sont connus à lavance. 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 dun nom dordre à lordre SQL et compilation (nom_ordre non déclaré). Attribution dun nom dordre à lordre SQL et compilation (nom_ordre non déclaré). 2.Exécution : EXECUTE nom_ordre USING liste de valeurs;

I-38 Christine Bonnet 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 : 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 à lavance. Les attributs projetés et les conditions de sélection sont connus à lavance. 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 dun nom dordre à lordre SQL et compilation (nom_ordre non déclaré). Attribution dun nom dordre à lordre SQL et compilation (nom_ordre non déclaré). 2.Déclaration dun curseur associé : EXEC SQL DECLARE nom_curseur CURSOR FOR nom_ordre;

I-41 Christine Bonnet 3.Ouverture du curseur : EXEC SQL OPEN nom_curseur [USING liste variables paramètres]; 4.Distribution des lignes : EXEC SQL FETCH nom_curseur INTO liste_var_hôtes; 5.Fermeture du curseur : EXEC SQL CLOSE nom_curseur;

I-42 Christine Bonnet 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 dun 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 dun curseur associé */ EXEC SQL DECLARE C CURSOR FOR S;

I-43 Christine Bonnet 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 La liste dattributs (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 dattributs (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 dune zone de communication dynamique SQLDA (SQL Description Area) pour définir au moment de lexécution : les éléments de la liste de sélection ; les critères de sélection. Utilisation dune zone de communication dynamique SQLDA (SQL Description Area) pour définir au moment de lexécution : les éléments de la liste de sélection ; les critères de sélection. Exemple : sample10.pc

I-46 Christine Bonnet 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 gestion des 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 gestion des erreurs */ void sql_error(); … /* Zone de communication */ EXEC SQL INCLUDE SQLCA.H;

I-47 Christine Bonnet RÉSUMÉ suite 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() {….. } 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() {….. }