La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

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

Présentations similaires


Présentation au sujet: "Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++"— Transcription de la présentation:

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

2 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).

3 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

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

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

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

7 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

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

9 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

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

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

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

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

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

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

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

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

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

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

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

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

22 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

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

24 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

44 I-44 Christine Bonnet

45 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

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

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


Télécharger ppt "Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++"

Présentations similaires


Annonces Google