PRO*C C ++ SOURCES : «Samples» d Oracle, «Oracle 8» R. Chapuis

Documents pareils
Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Le Langage SQL version Oracle

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Bases de données avancées

Bases de Données Avancées PL/SQL

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Gestion des transactions et accès concurrents dans les bases de données relationnelles

Devoir Data WareHouse

SQL Historique

Configurer la supervision pour une base MS SQL Server Viadéis Services

Cours Bases de données 2ème année IUT

Bases de Données relationnelles et leurs systèmes de Gestion

Olivier Mondet

Cours 3. Développement d une application BD. DBA - Maîtrise ASR - Université Evry

CREATION WEB DYNAMIQUE

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Le Langage De Description De Données(LDD)

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Le langage SQL (première partie) c Olivier Caron

TP Contraintes - Triggers

IFT3030 Base de données. Chapitre 2 Architecture d une base de données

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Optimisation SQL. Quelques règles de bases

Java DataBaseConnectivity

1. Base de données SQLite

Création et Gestion des tables

Attaques applicatives

Partie II Cours 3 (suite) : Sécurité de bases de données

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

Bases de données et sites WEB Licence d informatique LI345

Pour les débutants. langage de définition des données

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

Laboratoires de bases de données. Laboratoire n 6. Programmation SQL. par Danièle BAYERS et Louis SWINNEN

Bases de données et sites WEB

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

PROJET 1 : BASE DE DONNÉES REPARTIES

Gestion des utilisateurs et de leurs droits

CHAPITRE 4 POLITIQUES DE CONTRÔLES DES ACCÈS SOUS ORACLE ADMINISTRATION ET TUNING DE BASES DE DONNÉES 10/05/2015 RESPONSABLE DR K.

Notes de cours : bases de données distribuées et repliquées

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Bases de données relationnelles

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Cours Bases de données 2ème année IUT

Présentation du PL/SQL

Les bases de données

Intégrité sémantique dans les bases de données relationnelles

Mysql. Les requêtes préparées Prepared statements

Partie 0 : Gestion des tablespace et des utilisateurs... 3

CATALOGUE FORMATIONS DOMAINE Bases de données

OpenPaaS Le réseau social d'entreprise

TP3 : Creation de tables 1 seance

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Introduction à JDBC. Accès aux bases de données en Java

Les déclencheurs. Version 1.0. Grégory CASANOVA

A QUOI SERVENT LES BASES DE DONNÉES?

LE LANGAGE SQL2 1. INTRODUCTION

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Administration des bases de données

TD : Requêtes SQL (BDR.TD2-1) INSA 3IF

Application BdD et JDBC. Introduction 1/28. I Dans tout les cas, une seule problématique. I Quelques alternatives :

//////////////////////////////////////////////////////////////////// Administration bases de données

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

Le langage procédural PL-PGSQL

Administration des bases de données. Jean-Yves Antoine

Intégrité des données

Résumé S Q L. Auteur: Alexandre PATIN Edition: 22 février alexandre.patin@free.fr URL :

Compétences Business Objects

PHP 5. La base de données MySql. A. Belaïd 1

PHP. PHP et bases de données

Bases de SQL. Hacks 1-6 CHAPITRE UN

LES ACCES ODBC AVEC LE SYSTEME SAS

420-PK6-SL Banques de données Avancées. UTILISATEURS (suite)

BTS/CGO P10 SYSTEME INFORMATION Année

BASES DE DONNEES TP POSTGRESQL

Architecture de la plateforme SBC

Programmation d application Bases de données avec Java

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

Bases de Données Réparties Concepts et Techniques. Matthieu Exbrayat ULP Strasbourg - Décembre 2007

Analyse de sécurité de logiciels système par typage statique

Introduction aux Bases de Données 2004/2005

Support de cours. Introduction à SQL et MySQL. 2003, Sébastien Namèche

Bases de données. Mihaela Mathieu

Introduction au langage C

TUTORIEL D INSTALLATION D ORACLE ET DE SQL DEVELOPPER TUTORIEL D INSTALLATION D ORACLE...1 ET DE SQL DEVELOPPER...1

Langage SQL : créer et interroger une base

Panorama des Bases de Données

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Historisation des données

Pratique et administration des systèmes

Mysql avec EasyPhp. 1 er mars 2006

Plan Général Prévisionnel (1/2) (non contractuel) Internet et Outils L1/IO S2-IO2 Bases de données: Jointures, Transactions

FileMaker 13. Guide de référence SQL

Transcription:

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

PRO*C Incorporation d ordres d SQL dans un programme écrit en langage C 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-2 Christine Bonnet

ORDRES SQL INTÉGRÉS Ordres interactifs Ordres non interactifs 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 I-3 Christine Bonnet

ORDRES SQL INTÉGRÉS Ordres SQL statiques : complètement définis d dans le programme source; Intégration : EXEC SQL ordre-sql ; Exemple : EXEC SQL SELECT dname INTO :dname FROM DEPT WHERE deptno = :deptno; I-4 Christine Bonnet

ORDRES SQL INTÉGRÉS Bloc PL/SQL : traité par le pré-compilateur comme un simple ordre SQL. EXEC SQL EXECUTE [DECLARE] BEGIN [EXCEPTION] END; /* fin du bloc PL SQL */ END EXEC; I-5 Christine Bonnet

ORDRES SQL INTÉGRÉS Ordres SQL dynamiques : construits lors de l exécution du programme. 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. I-6 Christine Bonnet

Processus de développement SOURCE Pré-compilation PRO*C SOURCE modifiée Chaque ordre SQL est remplacé par un appel à un sous-programme de la la librairie Oracle Compilateur Bibliothèque sous-programmes OBJET Éditeur de liens EXÉCUTABLE I-7 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. I-8 Christine Bonnet

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

TYPE VARCHAR : VARIABLES HÔTES Utilisation d une variable de type VARCHAR : Exemple : nom_variable.arr strcpy((char *) iud.arr, «SCOTT»); strcpy((char *) pwd.arr, «TIGER»); I-12 Christine Bonnet

VARIABLES HÔTES 2. Utilisation dans un ordre SQL : Exemples : nom_variable précédé de «:» EXEC SQL INSERT INTO EMP(empno,deptno) VALUES (:empno,:deptno); I-13 Christine Bonnet

VARIABLES (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 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; I-14 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; I-15 Christine Bonnet

Exemple suite : EXEC SQL SELECT ename,sal,comm INTO :emprec INDICATOR :ind_emprec FROM EMP WHERE empno = :emp_num; I-16 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. I-17 Christine Bonnet

VARIABLES INDICATRICES : CONTRÔLE DES TRANSFERTS 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 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*/ I-18 Christine Bonnet

TYPE TABLEAU VARIABLES HÔTES 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-19 Christine Bonnet

VARIABLES HÔTES (type tableau) 1. Déclaration EXEC SQL BEGIN DECLARE SECTION; int numéro[50]; float montant[50]; EXEC SQL END DECLARE SECTION; 2. Utilisation /* ensemble des pilotes ayant salaire > 10000 */ EXEC SQL SELECT nopilot,sal FROM pilote INTO :numéro, :montant WHERE sal > 10000; I-20 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. I-21 Christine Bonnet

ZONE DE COMMUNICATION INCLURE EN DÉBUT DE PROGRAMME HÔTE L ORDRE : 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 : SQLCODE : donne le statut de l ordre SQL 0 exécution normale >0 warning <0 erreur fatale I-22 Christine Bonnet

ZONE 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. I-23 Christine Bonnet

CONNEXION 1 er ORDRE SQL INTÉGRÉ EXÉCUTÉ DU PROGRAMME C CONNEXION A UNE SEULE BASE : 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 I-24 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; 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, «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-25 Christine Bonnet

CONNEXIONS MULTIPLES (bases locales ou distantes) : Plusieurs bases accessibles dans un même programme Spécifier la base visée pour chaque ordre SQL EXEC SQL AT nom_base Ordre_SQL: Exemple : EXEC SQL AT base-vol SELECT * FROM avion; I-26 Christine Bonnet

ACCÈS À LA BASE Requêtes ne ramenant qu une 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. I-27 Christine Bonnet

Déclaration : CURSEUR EXEC SQL DECLARE nom_curseur CURSOR FOR ordre-sql; Ouverture : EXEC SQL OPEN nom_curseur; Distribution des lignes : EXEC SQL FETCH nom_curseur INTO liste variables hôtes; Fermeture : EXEC SQL CLOSE nom_curseur; I-28 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; I-29 Christine Bonnet

TRAITEMENT DES ERREURS Utilisation : des informations de la zone SQLCA de l instruction WHENEVER; I-30 Christine Bonnet

EXEC SQL WHENEVER <événement> <action> É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) ; I-31 Christine Bonnet

EXEC SQL WHENEVER <événement> <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. I-32 Christine Bonnet

EXEC SQL WHENEVER <événement> <action> 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. 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); } I-33 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 SAVEPOINT nom; EXEC SQL ROLLBACK TO SAVEPOINT nom; RELEASE : permet de libérer les ressources (verrous, curseurs, ) et de déconnecter l utilisateur. I-34 Christine Bonnet

ORDRES SQL DYNAMIQUES Ordres SQL construits lors de l exécution du programme. ORDRE SQL autre que SELECT, sans variable hôte de paramétrage : EXEC SQL EXECUTE IMMEDIATE [:var_hôte «chaîne»]; I-35 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; I-36 Christine Bonnet

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. 1. Préparation : 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é). 2. Exécution : EXECUTE nom_ordre USING liste de valeurs; I-37 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; I-38 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; I-39 Christine Bonnet

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. 1. Préparation : 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é). 2. Déclaration d un curseur associé : EXEC SQL DECLARE nom_curseur CURSOR FOR nom_ordre; I-40 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-41 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 d un curseur associé */ EXEC SQL DECLARE C CURSOR FOR S; I-42 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; I-43 Christine Bonnet

I-44 Christine Bonnet

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. 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.pc I-45 Christine Bonnet

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;

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() {.. } I-47 Christine Bonnet