________ _______ ________ ________ __ ________
| | | \ | | | | | | | |
| __ | | __ | | __ | | _____| | | | _____|
| | | | | |__| _| | |__| | | | | | | |___
| |__| | | __ \ | __ | | |_____ | |_____ | ___|_
| | | | | | | | | | | | | | | |
|________| |__| |__| |__| |__| |________| |________| |________|
COUR DE BASE DE DONNEES AVEC ORACLE
bd.txt 12/09/2005
maregeneration
Le SQL est un langage de requêtes descriptif, standard pour toutes les bases de données qui suivent le modèle relationnel. Ce langage permet toutes les opérations sur les données dans tous les cas d'utilisation de la base. Avec Oracle, on peut associer au SQL un langage procédural, le PL/SQL, qui ajoute de nombreuses possibilités dans la manipulation des données.
Il existe 4 types de fichiers de données:
L'organisation des données sont:
Une base de données relationnelle est une collection de données mises en relation dans des tables logiques; une table étant un ensemble de lignes et de colonnes. Le SGBDR (Système de Gestion de Bases de Données Relationnelles, RDBMS en anglais) gère indépendamment le niveau logique, et le niveau physique, ce qui procure une simplicité dans la gestion des données. Le concept de la SGBDR est un langage assertionnel basé sur des ensembles.
a) Domaine: C'est un ensemble de valeurs caractérisé par un nom. Le nombre d'éléments d'un domaine est le Cardinal.
b) Produit cartésien: P = D1 x D2 x ... x Dn (D Domaine)
Codes Taux Codes Taux Codes = {1,2,3} ----- x ----- = ---------- Taux = {0,8} 1 0 1 0 2 8 1 8 P = Codes x Taux 3 2 0 = {(1,0),(1,8),(2,0),(2,8),(3,0),(3,8)} 2 8 3 0 3 8
c) Relation: C'est un sous-ensemble du produit cartésien caractérisé par un nom. Le nom d'une colonne de la relation est un attribut, et le degré est le nombre d'attributs.
TVA CODE VALEUR ex: pour associer un seul taux par code: ------------------ 1 0 2 8
Principales règles de la SGBDR
a) Union: Rx = R1 U R2; CLIENTS = CLIOUEST U CLICENTRE
CLIOUEST______________ CLICENTRE_____________ CLIENTS_______________ NOCLI NOM ADRESSE NOCLI NOM ADRESSE NOCLI NOM ADRESSE _____________________ _____________________ _____________________ 15 Dupont Nantes 20 Labiche Paris 15 Dupont Nantes 35 Dubois Nantes 138 Dubois Tours 35 Dubois Nantes 152 Laroche Le Mans 152 Laroche Le Mans 152 Laroche Le Mans 20 Labiche Paris concatenation 138 Dubois Tours
b) Intersection: Rx = R1 (U à l'enver) R2; CLICOM = CLIOUEST U CLICENTRE
_____________________________ CLICOM NOCLI NOM ADRESSE _____________________________ lignes communes 152 Laroche Le Mans
c) Différence: Rx = R1 - R2; CLIOS = CLIO - CLIC
____________________________ CLIOS NOCLI NOM ADRESSE ____________________________ on enlève les doublons 15 Dupont Nantes 35 Dubois Nantes
d) Restriction: Rx = phi(condition) R1; CLI44= phi (ADRESSE="Nantes")CLIOUEST
____________________________ CLI44 NOCLI NOM ADRESSE [NON] [(] attribut opérateur valeur [)] ____________________________ [{ET/OU}condition] 15 Dupont Nantes 35 Dubois Nantes opérateurs: =, <>, >, <, >=, <=
e) projection: Rx = Pi R(A1, A2,.. An); CLICDE1 = Pi COMMANDES(NOCLI)
_____________________________ ______________ _____________________ COMMANDES NOCDE NOCLI ETATCDE CLICDE1 NOCLI CLICDE2 NOCLI ETATCDE _____________________________ ______________ _____________________ 1210 15 SO 15 15 SO 1230 35 SO 35 35 SO 1301 15 EC 20 15 EC 1280 20 LI 20 LI 1150 15 SO CLICDE2= Pi COMMANDES( 35 EC 1250 35 EC NOCLI, ETATCDE)
f) produit cartésien: Rx = S1 x S2; INVENTAIRE = DEPOT x ART2
__________________ _____________________________________ DEPOTS CODE NOM INVENTAIRE CODE NOM REFART DESIG __________________ _____________________________________ NW Nantes NW Nantes AB Tapis SE Nice NW Nantes CD Hifi P1 Paris I SE Nice AB Tapis _________________ SE Nice CD Hifi ART2 REFART DESIG P1 Paris I AB Tapis _________________ P1 Paris I CD Hifi AB Tapis CD Hifi
g) jointures: Rx = S1 JOIN (condition) S2
_________________ _________________________________ CDEEC NOCDE NOCLI LIGNESCDE NOCDE2 NOLIG REFART QTE _________________ _________________________________ 1301 15 1210 1 AB10 3 1250 35 1210 2 CD50 4 1230 1 AB10 1 LIGCDEEC = CDEEC JOIN (CDEEC.NOCDE = 1301 1 AB03 3 LIGNESCDE.NOCDE2)LIGNESCDE 1301 2 AB22 1 ____________________________________________ 1250 1 CD50 5 LIGCDEEC NOCDE NOCLI NOCDE2 NOLIG REFART QTE 1280 1 AB10 15 ____________________________________________ 1150 1 AB03 7 1301 15 1301 1 AB03 3 1150 2 AB22 5 1301 15 1301 2 AB22 1 1150 3 AA00 1 1250 35 1250 1 CD50 5
h) projection avec calcul: Rx = Pi R(A1, A2,.. N1='')
____________________________________ _____________________________________ LIGCDE NOCDE NOLIG REFART QTE PRIXHT LIGCDEVALO NOCDE NOLIG REFART VALOLIG ____________________________________ _____________________________________ 1301 1 AB03 3 150.00 1301 1 AB03 450.00 1301 2 AB22 1 1250.10 1301 2 AB22 1250.10 1250 1 CD50 5 735.40 1250 1 CD50 3677.00
LIGCDEVALO = Pi LIGCDE(NOCDE,NOLIG,REFART,VALOLIG=QTE*PRIXHT)
i) calcul d'agrégats
COUNT(*) nb lignes NBCLI = Pi LIGCDEVALO(N=COUNT(*)) COUNT(attribut) nb valeurs CDEVALO = Pi LIGCDEVALO(NOCDE,TOT=SUM(VALOLIG)) SUM(attribut) somme ________ _____________________ AVG(attribut) moyenne NBCLI N CDEVALO NOCDE TOT MAX(attribut) maximum ________ _____________________ MIN(attribut) minimum 6 1301 1700.10 1250 3677.00
Il faut écrire le résultat à atteindre, trouver les attributs et les relations necessaires. trouver les calculs élémentaire, les calculs d'agregat. Creer une vue en classifiant les attributs.
CLIENTS(NOCLI,NOMCLI,ADR) COMMANDES(NOCDE,NOCLI,DATE,ETATCDE) ARTICLES(REFART,DES,PRIXHT) LIGNESCDE(NOCDE,NOLIG,REFART,QTE)
RESULTAT(NOCDE,DATE,NOMCLI,ADR,REFART,DES,PRIHT,QTE,MTHT,TOTHT)
Le SQL (Structured Query Language) permet la manipulation des bases de données relationnelles. Il est aux normes ANSI, ISO, et FIPS. La plupart des éditeurs de SGBDR, intègrent le SQL. Les données, requêtes et applications sont donc assez facilement portables d'une base à l'autre. Le SQL peut être utilisé à tous les niveaux (administration, développement)...
Une table est un ensemble de lignes et de colonnes.
Types
Les contraintes peuvent être nommés afin d'être plus facilement manipulées ultérieurement. La convention de nommage est Table_Colonne_TypeDeContrainte
mnémonique TypeDeContrainte :
Pour effectuer des opération SQL, il faut se placer dans l'interpreteur de commandes SQL.
'chaine'; '15-JAN-94'; -123.459; -1.26e+6; + - / * (); 'Monsieur' || nom; " != <> < <= > >=; IN (a,b,c); BETWEEN a and b; LIKE 'j_ur%'; NOT AND OR;
ABS(n) valeur absolue de n CEIL(n) premier entier supérieur ou égal à n COS(n) cosinus de n COSH(n) cosinus hyperbolique de n EXP(n) e puissance n (e=2.71828183...) FLOOR(n) premier entier inférieur ou égal à n LN(n) logarithme népérien de n LOG(n1,n2) logarithme de n2 base n1 MOD(n1,n2) reste de n1/n2 POWER(n1,n2) n1 exposant n2 ROUND(n1[,n2]) n1 arrondi à n2 positions décimales SIGN(n) -1 si n < 0; 0 si n = 0; +1 si n > 0 SIN(n) sinus de n SINH(n) sinus hyperbolique de n SQRT(n) racine carrée de n TAN(n) tangente de n TANH(n) tangente hyperbolique de n TO_CHAR(n) conversion numérique en chaîne TRUNC(n1[,n2]) n1 tronqué à n2 positions décimales
ASCII(s) code ASCII du premier caractère de s CHR(n) caractère ASCII du code n CONCAT(s1,s2) concaténation de s1 et s2 INITCAP(s) premières lettres des mots en majuscule INSTR(s1,s2[,n1,n2]) position de la n2ieme occurrence s2 dans s1 à partir de n1 INSTRB INSTR avec n1 et n2 en octets LENGTH(s) nombre de caractères de s LENGTH(s) nombre d'octets de s LOWER(s) renvoie s en minuscules LPAD(s1,n[,s2]) renvoie s1 sur une longueur n complété à gauche par s2 ' ' LTRIM(s1[,s2]) renvoie s1 avec suppression à gauche de tous les s2 ' ' NLS_INITCAP(s,'') INITCAP avec code pays NLS_LOWER(s,'') LOWER avec code pays NLSSORT(s) code du caractère s dans la table NLS NLS_UPPER(s,'') UPPER avec code pays REPLACE(s1,s2,s3) remplace dans s1 tous les s2 par s3 (s3 nul ou pas) RPAD(s1,n[,s2]) renvoie s1 sur une longueur n complété à droite avec s2 RTRIM(s1[,s2]) renvoie s1 avec suppression à droite de tous les s2 ' ' SOUNDEX(s) représentation phonétique de s SUBSTR(s,n1[,n2]) renvoie la chaîne de n2 caractères de s à partir de n1 SUBSTRB(s,n1[,n2]) SUBSTR avec n1 et n2 en octets TO_NUMBER(s) conversion d'une chaîne en numérique TRANSLATE(s1,s2,s3) remplace dans s1 tous les s2 par s3 (s3 non nul) TRIM(s1 FROM s2) tous s1 en tête et en fin de chaîne sont supprimé de s2 en spécifiant LEADING,TRAILING,BOTH: TRIM(BOTH s1 FROM s2) UPPER(s) renvoie s en majuscules
ADD_MONTHS(d,n) date d plus n mois LAST_DAY(d) date du dernier jour du mois de d MONTHS_BETWEEN(d1,d2) différence entre les deux dates NEW_TIME(d,z1,z2) la date d de la zone z1 est convertie en zone z2 NEXT_DAY(d,j) date du prochain jour j à partir de d ROUND(d,format) arrondit la date au début suivant le format SYSDATE date système TRUNC(d,format) tronque la date au début suivant le format TO_CHAR(d,format) conversion d'une date en chaîne TO_DATE(s,format) conversion d'une chaîne en date D DD DDD jour de la semaine, dans le mois, dans l'année DAY DY nom du jour sur 9 caractères, nom abrégé HH HH12 HH24 heure du jour de 1 à 12, de 0 à 23 MI SS SSSS minute, secondes, secondes depuis minuit WW IW W numéro de la semaine dans l'année, iso, dans le mois MM MON MONTH numéro du mois, nom du mois abrégé, nom du mois sur 9c RM Q numéro du mois en chiffre romain, numéro du trimestre YYYY YYY YY Y année sur 4, 3, 2, ou 1 chiffre(s)
DECODE(col,v1,r1,..) si colonne à v1, la forme sera r1, si col2 à v2, r2 DUMP(exp[,format]) format: 8 octal, 10 déc, 16 hexa, 17 caractère GREATEST(exp[,..]) renvoie la plus grande expression LEAST(exp[,..]) renvoie la dernière des expressions NVL(exp1,exp2) si exp1 est NULL renvoie exp2 NVL2(exp1,e2,e3) si exp1 est NULL renvoie e2 sinon e3 UID numéro identificateur de l'utilisateur USER nom de l'utilisateur USERENV(opt) renvoie des caractéristiques de l'environnement ENTRY id; SESSION id; TERMINAL; LANGUAGE VSIZE(exp) nombre d'octets stockés pour exp
........
A quel moment faut-il passer d’un SGBD micro de type serveur de fichier comme dBase, Paradox, FoxPro ou Access, à un poids lourd du client/serveur comme Oracle, Sybase, SQL Server, Informix, DB2 ou Firebird ? L’ensemble des techniques du C/S est dédié à minimiser le trafic des données sur un réseau et assurer une plus grande intégrité lors du traitement des données… Alors que dans un système à base de fichiers, c’est chaque poste de travail qui traite localement les données, dans un SGBD C/S, tous les traitements sont, en principe, effectués sur le serveur par le biais de requêtes.
Lorsque qu’un utilisateur désire modifier une donnée, le SGBD tente de poser un verrou en écriture. Soit l’opération est effective (et donc le verrou est posé), soit l’opération échoue parce qu’un autre utilisateur a déjà posé un verrou. Si l’opération est positive, pendant toute la durée de la modification, le verrou est actif pour cet utilisateur jusqu’à ce que l’utilisateur valide ses modifications ou les annule. Dans ces deux cas le verrou est libéré.
Lorsque qu’un utilisateur désire modifier une donnée, le SGBD relève le numéro de version de l’enregistrement et ne pose aucun verrou. Plusieurs utilisateurs peuvent faire de même sans aucune limite. Le premier utilisateur qui valide ses modifications, incrémente le numéro de version de l’enregistrement. Tous les autres se voient refuser leur modification, car le numéro de version qu’ils ont relevé au début de la session de modification des données n’est pas le même que celui qu’ils peuvent lire à la fin de cette session.
Lorsque l’on utilise la technique du verrouillage pessimiste, le SGBD effectue une boucle d’attente en tentant de poser le verrou pendant n secondes. C’est comme cela que fonctionne la quasi-totalité des SGBD à base de fichiers (dBase, Paradox, FoxPro, Access…).
Effectuer une boucle d’attente qui interroge un fichier, monopolise dramatiquement le réseau. C’est pourquoi la quasi-totalité des SGBD C/S fonctionne en verrouillage optimiste, car dans ce mode, l’échange de données entre la base et le poste client est rapide et bref…
De plus si nous prenons en compte l’intégrité référentielle et que la structure de la base permet de modifier des clefs existantes en répercutant leurs valeurs dans l’ensemble des tables filles, alors dans le cas d’un SGBD fichier ont peut obtenir un trafic réseau important, tandis que dans le cas du client serveur, l’opération sera menée au sein du SGBD donc sans aucune influence sur la charge du réseau.
Soit une table de nom CLIENT contient 50 000 enregistrements de 200 octets chacun. La requête est la suivante :
Dans un SGBD de type fichier, voici le flot de données :
Dans un SGBD de type C/S, voici le flot de données :
Bilan de ces opérations :
Dans ce cas, le rapport est de près de 1/10000 en faveur du C/S…
Les SGBD C/S disposent d’un mécanisme qui n’est généralement pas disponible dans les SGBD fichier, le transactionnel.
Le transactionnel permet de regrouper de multiples commandes SQL comme s’il s’agissait d’une instruction de type atomique, c’est à dire s’exécutant en totalité ou aucunement.
Cela suppose de donner un point de départ à la transaction un point d’arrivée et de contrôler si l’ensemble des commandes SQL ont été réalisées avec succès. Dans le cas ou l’une des commandes SQL n’a pas été traitée correctement, alors le point final de la transaction permet de revenir en arrière sur l’ensemble des opérations déjà effectuées. La transaction se présente alors comme une seule instruction de type ‘tout ou rien’.
Cela n’est possible que sur des serveurs capables d’enregistrer l’ensemble des insertions, modifications et suppressions effectuées sur les enregistrements des tables d’une base (historisation des modifications).
Supposons que les commerciaux sont dotés de PC portables et que, chaque semaine, ils viennent au siège de la société pour remplir la base centrale des nouveaux clients et des commandes qu’ils ont saisies sur leur portable.
Pour réaliser ce recollement d’information, l’informaticien a réalisé la transaction suivante :
S’il n’avait fait qu’enchaîner les deux requêtes, il aurait été possible que les clients soit insérés sans que les commandes le soit, et vice versa. Mais tous les bons SGBD, qu’ils soient C/S ou fichier, savent gérer les intégrités référentielles et auraient empêché la moindre insertion dans la table des commandes sans avoir la référence du client préalablement insérée dans la table des clients…
Les triggers font correspondre aux événements d’un SGBD du code.
Soit une table CLIENT liée à 3 tables filles (FACT, LIGNFACT, BONLIV). On veut modifier les tables filles lors de la suppression d’un enregistrement de CLIENT:
Dans les SGBD à base de fichiers il faut rajouter du code dans tous les éléments qui effectuent la suppression dans la table mère…
Dans une base de données C/S, avec un trigger, le traitement s’effectue directement sur le serveur et il ne nécessite aucun appel à aucune fonction d’aucune sorte. C’est en effet la base elle-même qui va se rendre compte que l’événement de suppression de la table client nécessite un traitement et va l’exécuter.
Dans un tel exemple, le code pourrait être le suivant :
Ce trigger comportant différentes commandes SQL devra être appelé au sein d’une transaction plus globale incluant la suppression de l’enregistrement dans la table mère. Les commandes SQL de ce trigger réclament la suppression dans les tables FACT, LIGNFACT et BONLIV de tous les enregistrements faisant référence à l’identifiant du client transmis en paramètre. Si au moins, une des requêtes échoue, le trigger renvoi False à la procédure l’ayant appelée et l’ensemble des requêtes sera annulé. Sinon, si tout va bien, le trigger renvoi True et l’ensemble des modifications sera rendu effectif par une validation (COMMIT).
Ce trigger est stocké au sein même de la définition de la base de données et s’exécute, sur le serveur, à chaque fois qu’un ordre de suppression arrive dans la table CLIENT. Il n’y a donc aucun trafic sur le réseau pour effectuer ce traitement…
En complément aux triggers, les procédures stockées permettent de stocker un traitement (opérant en général uniquement sur les données de la base) au sein même de la base de données, qui s’exécutera, par appel de la procédure au moment voulu, sur le serveur.
Exemple : une application réclame un traitement de modification des prix de vente des produits en fonction de la variation d’un certain nombre d’indices boursiers. Cette opération ne peut être déclenchée que manuellement par le responsable du service commercial…
Le code pourrait en être le suivant :
Dès lors cette procédure peut être appelée n’importe quand, par n’importe quel poste client… Elle s’exécutera sur le serveur et ne nécessitera pratiquement aucun trafic réseau. On peut aussi imaginer qu’elle soit couplée avec un trigger ou encore exécutée à une heure différée, par exemple la nuit afin de ne pas ralentir les accès aux données plus fréquents en général dans la journée…
En plus des triggers et des procédures stockées, la plupart des SGBD C/S proposent d’historiser la « vie » des données, dans ce que l’on appelle un journal des transactions. Celui-ci conserve une trace temporelle de toutes les insertions, suppressions, modifications intervenues dans la base de données depuis son origine. Ce journal permet de revenir en arrière de manière partielle sur les données. L’intérêt essentiel réside dans le fait de pouvoir, en cas de crash, revenir à un état des données satisfaisant.
Pour revenir à cet état stable, le système lit le journal en débutant par la fin, et reprend toutes les transactions qui ont été un succès, sans que la mise à jour physique des données ait été effectuée.
Il est nécessaire de se munir d’un serveur puissant; un SGBDR en C/S nécessite au minimum 128 Mo de RAM même avec un nombre très restreint d’utilisateurs). Il faut avoir des disques à accès très rapide (SCSI UW par exemple) et ne pas hésiter à investir dans un contrôleur RAID éventuellement en « hot plug ».
20 millisecondes