Vous êtes sur la page 1sur 313

DUT- Génie Informatique -

2ème année – S3

Base de Données 1
Avancées
Prof. Driss AIT OMAR
(d.aitomar@usms.ma)

Année Universitaire 2021/2022


Composition du module 2

• Architecture et Installation Oracle


• Administration de bases des données sous Oracle
• Programmation sous oracle (PL/SQL)
Installation Architecture du
d’oracle 19c serveur Oracle
01

04 02

Administration de la base de 03 Programmer avec


données PL/SQL

Quels sont les objectifs? 3


Plan 4
Partie I
Quelques rappels
Chapitre 0: Introduction à Oracle
Chapitre 1: Architecture et Gestion de l’Instance d’oracle
Chapitre 2: Structure d’une Base de données Oracle
Chapitre 3: Les Objets d’une Base de données Oracle
Rappel: Bases de données relationnelles 5

❖ Collection de données opérationnelles enregistrées sur un support


adressable et utilisées par les systèmes et les applications.
❖ Les données doivent être structurées indépendamment d'une
application particulière.
❖ Elles doivent être cohérentes (contraintes), non redondantes
(formes normales) et accessibles simultanément par plusieurs
utilisateurs.
Rappel: Système de Gestion de la BD (SGBD) 6

Un système de gestion de base de données (SGBD) est un ensemble de


programmes qui permettent la gestion et l'accès à une base de
données.
➢ Un SGBD possède son propre système de fichier.
➢ Un SGBD assure la reprise en cas de panne.
➢ Un SGBD doit permettre la sauvegarde et la restauration d’une BD.
➢ Un SGBD doit permettre une gestion des rôles et droits.
➢ Un SGBD modernes autorise les utilisateurs à effectuer des opérations
simultanées (concurrentes) sur des données partagées de la BD.
Rappel: Système de Gestion de la BD (SGBD) 7

En règle générale, un SGBD comporte les éléments suivants:


• Code du noyau : Ce code gère la mémoire et le stockage du
SGBD.
• Référentiel de métadonnées: Ce référentiel est généralement
appelé un dictionnaire de données.
• Langage de requête : Cette langue permet aux applications
d'accéder aux données.
Rappel: Types de SGBD
8
Il existe différents modèles de bases de données qui se
distinguent principalement par la structuration des données.
Le choix d’un SGBD implique donc toujours le choix définitif
d’un modèle de base de données. Il existe les bases de
données suivantes :
• relationnelles
• hiérarchiques
• orientées réseau
• orientées objet
• orientées documents
Rappel: Fonctionnement d’un SGBD 9
Traitement en consultant
Application le sous-schéma Schéma
Demande
Le système examine la
Transfert des résultats aux description physique de la base
zones de liaison de SGBD
l’application
Réception des données Le système lance une
stockées dans le Buffer commande au système
d’exploitation(OS) pour
BDD Les données demandées sont
transférées dans des Buffers,
rechercher physiquement
l’enregistrement désiré
ou mémoires tampons.

Le système accède à OS
l’enregistrement physique
Rappel: Les métier autour des BDs 10

❖Administrateur
❖Responsable de la sécurité
❖Administrateur réseaux
❖Dév l pp s ’ ppl
❖A s s ’ ppl
❖Utilisateurs : modifier les données, créer des rapports

Note:
D s s v s p ll , l’ s p
jouer quasiment tous les rôles
Rappel: Les tâches de l’administrateur de la BD 11
Rappel: Les tâches de l’administrateur de la BD 12
❑ Dans la phase de « conception »
▪ Définition du schéma conceptuel de la base
▪ Règles de gestion, cohérence des informations
▪ Volumétrie
❑ Dans la phase de maintenance
▪ Planification et création des BD
✓ Gestion des structures physiques
✓ Gestion des structures logiques
▪ Gestion de la sécurité, des utilisateurs
▪ Sauvegarde et restauration
▪ Optimisation de la base de données
✓ optimisation de requêtes
▪ Administration du réseau
Rappel: Les tâches de l’administrateur de la BD 13

 Grandesfonctions de DBA :
❖ installer le SGBD et les applications clientes
❖ Créer la base de données en faisant des choix au niveau physique
❖ Gérer les utilisateurs
❖ Assurer la cohérence et la sécurité des données
❖ Echanger des données avec l'extérieur
❖ Améliorer les performances
◼ gestion des ressources mémoires
◼ gestion des temps de réponses
Chapitre 0: Introduction à Oracle

14
Histoire d’Oracle

 Software Development Laboratories(SDL) a été créé en 1977.


 En1979, SDL change de nom en devenant Relational Software, Inc.
(RSI) et introduit son produit Oracle V2 comme base de données
relationnelle.
🞑 Laversion 2 nesupportait pas les transactions mais implémentait les fonctionnalités
SQL basiques de requête et jointure. Il n'y a jamais eu de version 1, pour des
raisonsde marketing, la première version a été la version 2. Celle-ci fonctionnait
uniquementsurles systèmes Digital VAX/VMS.

15
Histoire d’Oracle

 En1983, RSIdevient Oracle Corporation pour être plus représentative de son


produit phare.
🞑 Laversion 3 d'Oracle, entièrement ré-écrite enlangage de programmation C, est publiée.
🞑 Supporte les transactions grâce aux fonctionnalités de
commit et rollback.
🞑 Unix est supportée dans cette version
 En1984, la version 4 d'Oracle apparaît, supportant la cohérence en lecture (read
consistency).
 Début 1985, Oracle commence à intégrer le modèle client-serveur, avec l'arrivée
des réseaux au milieu des années1980.
16
Histoire d’Oracle
 En 1988, Oracle met sur le marché son ERP - Oracle Financials
basé sur la base de données relationnelle Oracle.
🞑 Oracle version 6 supporte le PL/SQL
🞑 le verrouillage de lignes (row-level locking)
🞑 les sauvegardes à chaud (hot backups, lorsque la base de
données est ouverte).
 En 1992, la version 7 d'Oracle supporte les contraintes d'intégrité, les
procédures stockées et les déclencheurs (triggers).
 En 1995, acquisition d’un puissant moteur multidimensionnel,
commercialisé sous le nom d’Oracle Express.

17
Histoire d’Oracle
 En 1997, la version 8 introduit le développement orienté objet et
les applications multimédia.
 En 1999, la version 8i est publiée dans le but d'affiner ses applications
avec Internet. La base de données comporte nativement une machine
virtuelle Java.
 En 2001, Oracle 9i
 En 2004, la version 10g est publiée.
 En 2005, vers la fin novembre, une version complètement
gratuite est publiée, la « Oracle Database 10g Express Edition ».
 Septembre 2009, sortie de Oracle 11g Release 2
18
Histoire d’Oracle
 Oracle Database 10g a introduit l'informatique en grille en 2003.
 Oracle Database 11g, sorti en 2007, a introduit une multitude de
nouvelles fonctionnalités qui ont permis aux administrateurs et aux
développeurs de s'adapter rapidement à l'évolution des besoins de
l'entreprise.
 Oracle Database 12c, sorti en 2013, a été conçu pour le cloud.
 Oracle Database 18c publiée en 2018 a simplifié l'intégration avec les
services d'annuaire tels que Microsoft Active Directory.
 Oracle Database 19c ‘2019’: Amélioration de la stabilité.
 Oracle Database 21c ‘2020’: le blockchain au cœur (Version actuelle)
19
Généralités
 Oracle est un système de gestion de base de données relationnel
(SGBDR).
 Depuis l'introduction du support du modèle objet dans sa version 8

peut être aussi qualifié de système de gestion de base de données


relationnel-objet (SGBDRO)
 Oracle est multi-plates formes.

Editions:
➢ Entreprise: comprend toutes les fonctionnalités

➢ Standard: version limitée au niveau de fonctionnalités, ne dépasse

pas 4 processeurs.
➢ Express: version gratuite, fonctionne sur une machine à un

processeur 20
Généralités

L’architecture Oracle comporte plusieurs composants principaux :


❑ Serveur Oracle: comporte plusieurs fichiers, processus et structures

mémoire. Le serveur Oracle est constitué d’une instance oracle et


d’une base oracle
✓ Instance Oracle: L'instance Oracle comprend une région de la
mémoire appelée La SGA (System Global Area), ainsi que les
processus d’arrière plan utilisé pour gérer la base de données

21
Généralités

❑ La zone mémoire du programme (PGA)


➢ Zone mémoire utilisée par un seul processus serveur à la
différence de la SGA qui est partagée par tous les processus
serveurs
➢ PGA contient :
◼ une zone de tri
◼ des informations sur la session
◼ l'état du curseur
◼…

22
Généralités
❖ Base de données Oracle:
◼ Structure physique:
◼ Fichiers de données, Fichiers redo log, Fichiers de contrôle.
◼ Autres fichiers importants: (fichier de paramètres, fichier de mots de passe)
◼ Structure logique
◼ Tablespace, segment, extent, bloc
❖ Les Processus serveurs: gèrent les requêtes des utilisateurs provenant des
connexions à la base de données; ils sont chargés de:
◼ la communication entre la SGA et le processus utilisateur.
◼ analyser, d'exécuter les requêtes SQL des utilisateurs, de lire les fichiers de
données, de placer les blocs de données correspondants dans la SGA et de
Renvoyer les résultats des commandes SQL au processus utilisateur.
23
Généralités

❖ Le serveur oracle supporte


◼ SQL (LDD , LMD, LCD)
◼ PL/SQL
◼ Autres langages de programmation (Pro*C …)

24
Généralités

Connexion a un serveur Oracle



Une connexion est un chemin de communication entre un processus utilisateur et un
processus serveur. Il existe trois types de connexions grâce auxquelles un utilisateur
peut accéder à un Serveur Oracle :
◼Connexion locale : Selon cette méthode, un utilisateur est directement connecté sur
la machine faisant office de Serveur Oracle.
◼Connexion Deux Tiers : Ce type de connexion est couramment nommé "Connexion
Client Serveur", un utilisateur se connecte à partir d'une machine directement
connectée à un Serveur Oracle.
◼Connexion Multi Tiers : Dans une architecture multi tiers, la machine de l'utilisateur se
connecte à un Serveur applicatif (Par exemple un Serveur Web) qui lui même va se
connecter au serveur Oracle pour récupérer les données issues de la base de
données. 25
Généralités

❑ Session: une session est une connexion spécifique d’un


utilisateur à un serveur oracle.
❑ La session démarre lorsque l’utilisateur est authentifié par le
serveur oracle et se termine lorsque l’utilisateur se déconnecte
ou en cas de déconnexion anormale.

26
Généralités

L'utilisateur lance
l'application Oracle sur le processus utilisateur communique
son ordinateur, en créant avec le processus serveur sur le
un processus utilisateur... serveur hôte en utilisant le PGA pour
stocker les informations spécifiques à
User Processus la session.

Serveur
Le processus serveur communique avec l'instance Oracle au
nom de l'utilisateur.
27
Généralités

Oracle supporte deux mode de fonctionnement:


1. Serveur dédié : chaque fois qu’un utilisateur se connecte, il est pris en charge par un
processus serveur.
◼ Si 100 utilisateurs se connectent, 100 processus serveurs sont crées de même
◼ Avantage:
◼ Une commande SQL est tout de suite et directement prise en compte par un processus
serveur
◼ Inconvénient:
◼ Chaque processus serveur occupe une zone mémoire et utilise la CPU
◼ Meilleure configuration (recommandée et utilisée par la majorité de DBAs), si
les ressources matérielles le permettent.
28
Généralités

2. Serveur Partagé : c’est un groupe de processus serveurs qui


s’occupent d’un grand nombre de processus utilisateurs.
◼ Lesprocessus utilisateurs sont alloués à unprocessus DISPACHER,celui-ci met
les requêtes utilisateurs dans une fille d’attente, et le processus serveur
exécute toutes les requêtes, une par une
◼ Avantage:
◼ Réduire la charge de la CPUet utilise moins de mémoire
◼ Inconvénient:
◼ Lors de forte utilisations de la BDD,il risque d’y avoir des temps d’attente (
performance)

29
Chapitre 1: Architecture –Instance d’Oracle

30
Architecture - Instance

Serveur Oracle = instance Oracle + base de données Oracle


Instance Oracle : c’est un moyen pour accéder à une base de données
Oracle (ouvre une unique base de données)
1. Structure Mémoire ( SGA )
2. Processus en arrière plan

31
Architecture - Instance : SGA

 La SGA (System Global Area) représente la zone mémoire


déterminante d’une instance, tant par sa taille que par son rôle.
🞑 C’est elle qui assure le partage des données entre les utilisateurs.
◼ Oracle utilise la mémoire SGA comme buffer intermédiaire (plus rapide que le disque)
pour l’échange de données entres processus
🞑 Elle est divisée trois composants obligatoires :
◼ shared pool
◼ Database buffer cache (L.e cache de données)
◼ redo log buffer (Le cache de reprise)
🞑 Et de trois composants optionnels
◼ Java pool
◼ Large pool
◼ Streams pool

32
Architecture - Instance : SGA

Database Buffer cache


➢ Est utilisé pour stocker des blocs de données en mémoire afin
d'accélérer l'interrogation et/ou la modification
➢ Aucune modification est faite directement sur les données du
disque
➢ Oracle lit les données suite à la demande d'un processus utilisateur et ensuite
valide les modifications sur le disque
➢ Il utilise un algorithme nommé LRU mois récemment utilisés (Least-
Recently Used) pour déterminer les données à libérer du cache

33
Architecture - Instance : SGA

Organisation du buffer cache


❑ Le buffer cache est organisé en 2 listes :
◼ La dirty list
◼ La liste LRU (Least Recently Used)

❑ La dirty list contient les buffers qui ont été modifiés mais ne
sont pas encore écrits sur le disque
❑ La liste LRU contient les buffers libres (qui n'ont pas été modifiés),
les « pinned » buffers (qui sont en cours de modification, les dirty
buffers qui n'ont pas encore été déplacés dans la dirty list

34
Architecture - Instance : SGA

Buffer Redo Log


❑ C’est un buffer circulaire qui stocke les modifications réalisées sur la
base de données avec les opérations: insert, delete, update, create,
alter y drop.
❑ Permet à oracle de reconstruire les modifications des données en cas
de panne
❑ L'information Redo reste dans le buffer Redo log jusqu'à ce
qu‘oracle la stocke sur le disque
❑ Sa taille est définie par LOG_BUFFER

35
Architecture - Instance : SGA

Shared Pool
Permet de stocker plusieurs éléments cruciaux pour la gestion des
données :
◼ Library cache : permet d'analyse l'ordre d'exécution d'une requête SQL et de
définir un plan d'exécution.
◼ Dictionary cache : stocke des les données en provenance du dictionnaire afin
d'accélérer l'accès au dictionnaire (nom d'utilisateurs, privilèges, etc.).
◼ SQL area : stocke les requêtes SQL les plus récemment utilisées par les
utilisateurs de base de données.
◼ Si la même requête est ré-exécutée, le serveur n'analyse pas son ordre. Cela permet
d'améliorer la performance des applications
36
Architecture - Instance : SGA

 Le fonctionnement d’une base Oracle est assuré par un


ensemble de processus imbriqués qui réalisent de
nombreuses actions. Pour plus de simplicité, nous avons
regroupé les processus en deux familles :
▪ les indispensables,
▪ les optionnels.

37
Architecture - Instance :
Processus en arrière plan

 Les processus indispensables sont présents dès qu’une base Oracle


fonctionne. Ils sont requis pour en assurer le fonctionnement
minimal. Si l’un d’eux s’arrête, la base de données n’est plus
opérationnelle.
 D’autres processus peuvent être lancés pour assurer des fonctions
complémentaires, comme l’archivage des redo log. Si l’un de ces
processus optionnels n’est pas démarré, cela ne met pas en cause
le fonctionnement global de la base de données. Seule la tâche
assurée par ce processus optionnel ne sera pas réalisée.
38
Les processus indispensables

 DBWR (Database Writer) ;


 LGWR (Log Writer) ;
 CKPT (Checkpoint) ;
 PMON (Process Monitor) ;
 SMON (System Monitor).

39
40
Les processus indispensables

 DBWR (Data Base WRiter)


• Ecrit les blocs modifiés dans le cache de données sur les disques.
• DBWn se déclenchera lors des événements suivants :
◼ Lorsque le nombre de bloc dirty atteint une certaine limite
◼ Lorsqu'un processus sera à la recherche de blocs libres dans le Database
Buffer Cache, et qu'il ne sera pas en mesure d'en trouver.
◼ Lors de timeouts (environ toutes les 3 secondes par défaut)
◼ Lors d'un checkpoint.

41
Les processus indispensables

 Le comportement de DBWR est contrôlé par le paramètre


d’initialisation DB_WRITERS, qui permet de démarrer
plusieurs processus DBWR, afin d’augmenter le taux
d’écriture sur disque dans les systèmes très fortement
sollicités. Nous vous conseillons de démarrer une base
Oracle avec un seul processus DBWR et d’en
augmenter progressivement le nombre dans les
systèmes très sollicités en entrées/sorties disque.

42
Les processus indispensables
 LOGWR (LoG WRiter)
✓ Ecrit dans les fichiers Redo Log le contenu du cache
Redo Log
✓ Le processus LGWR transcrit les informations contenues
dans le REDO LOG Buffer vers les fichiers REDOLOG
FILE quand :
◼ une transaction s'est terminée avec un COMMIT
◼ le REDO LOG Buffer est au 1/3 plein
◼ Avant que DBWR n'écrive le contenu du Database Buffer
Cache dans les fichiers du disque dur 43
Les processus indispensables

 CKPT (CHECKPOINT)
Checkpoint inscrit les informations de point de reprise dans les
fichiers de Controles et dans l'entête de chaque fichier de données.
C'est ce point de reprise (SCN) qui permet de rendre cohérent les
fichiers de controles et les fichiers de données, indispensable pour un
processus de récupération.

44
Les processus indispensables
 CKPT (CHECKPOINT)
❑ Le processus Checkpoint n'écrit pas les blocs sur le disque, c'est
le role du processus Database Writer DBWR.
◼ Provoque l'activation du DBWR pour écrire les blocs modifiés
depuis le dernier point de contrôle,
❑ Les numéros SCN enregistrés dans les fichiers garantissent que
toutes les modifications apportées aux blocs de base de données
avant un numéro SCN ont été écrites sur le disque.
◼ En cas d'arrêt anormal de l'instance, ce SCN marque le début des
données à utiliser pour la récupération de l'instance.
45
Les processus indispensables
 CKPT (CHECKPOINT)
• Le processus Log Writer (LGWR) n’écrit pas dans le fichier de
journalisation (REDO LOG) tant que le processus CKPT n'a pas
synchronisé, car tant que cette synchronisation n'est pas faite, le
fichier de journalisation contient des données nécessaires à une
éventuelle récupération après défaillance de l'instance.
• A savoir qu'une synchronisation se déclenche aussi à chaque
basculement de REDO LOG, lors de l’arrêt de la base de données,
lors de la mise hors ligne d'un Tablespace.

46
Les processus indispensables
 SMON (System MONitor)
✓ System Monitor surveille la base de données lors de son démarrage
c'est à dire faire la récupération de l'instance après un arrêt anormal.
Lors du démarrage de l'instance Oracle, il vérifie si le dernier arrêt a été
correctement effectué.
✓ SMON est aussi chargé de:
◼ libérer les segments temporaires
◼ compacter l'espace contigu dans les Tablespaces
◼ surveiller la base de données.

47
Les processus indispensables
 Le processus SMON en action lors d'un arrêt brutal de la base de
données
➢ SMON lit les informations contenu dans les
segments UNDO (données en attente de validation) puis les annule. (ROLL
BACK)
➢ SMON récupère dans les fichiers REDO LOG les enregistrements
validés mais pas encore écrit dans les fichiers de données et les
insère. (ROLL FORWARD).
➢ SMON libère toute les ressources de la base de données (vérrous,
segments temporaires).

48
Les processus indispensables

 Le processus System Monitor SMON en action lors d'un


fonctionnement normal de la base de données
❖ SMON surveille l'activité de la base de données.
❖ SMON recycle les segments temporaires et assure les espaces de tris.
❖ SMON libère toute les ressources de la base de données (vérrous,
segments temporaires).
❖ SMON peut être appelé par d'autre Processus pour libérer de
l'espace.

49
Les processus indispensables

 PMON (Process Monitor)


✓ Ce processus gère les ressources utilisateurs
✓ Si un incident survient (arrêt brutal du poste client)
◼ PMON annule les transactions en cours

◼ Il supprime les verrous posés sur les tables et les lignes

◼ Et libère les ressources utilisées

50
Les processus optionnels

 Les processus détachés optionnels sont les suivants :


 Listener ou listener Net ;
 ARCH ou Archiver ;
 RECO ou Recover ;
 Dnnnn et Snnnn Dispatcher et Server ;
 ....

51
Les processus server

 Le rôle des processus server est fondamental. Dès que


l’application demande l’accès à l’instance, ce sont eux qui
vérifient que les données sont présentes en mémoire.
❖ Dans l’affirmative, le processus server traite vos ordres SQL.
❖ Dans la négative, les processus server lisent les fichiers de la
base de données pour les « monter » en mémoire SGA, avant
de traiter l'ordre SQL.

52
Les processus server

 Ce n’est pas un processus permanent de l'instance


le processus server est créé lors de chaque connexion
 Il assure la lecture des données contenues dans vos fichiers.
 Il assure le lien entre le processus client, les processus
d’arrière plan, la SGA et les fichiers qui composent la base.

53
Traitement d'une requête d'interrogation

 Le processus client envoie la requête au processus


serveur
 Le processus serveur effectue l'analyse syntaxique et
sémantique de la requête
🞑 utilise la shared pool de la SGA pour compiler l'ordre
🞑 retourne l'état (analyse correcte ou incorrecte) au processus client.
 Exécution de la requête
 Récupération des résultats
🞑 le processus serveur envoie les lignes extraites par la requête (à
partir du cache de données si les données y ont déjà été
chargées)
54
Traitement d'une
requête d'interrogation

55
Traitement d'une
requête de MAJ
 Similaire à une requête d'interrogation pour la
phase d'analyse
 Phase d'exécution différente :
1. le processus serveur lit des blocs de données et de
rollback à partir
◼ des fichiers de données
◼ du buffer cache de données
2. Si des blocs ne sont pas déjà dans le cache, copie des
blocs du disque dans le cache
3. Mise à jour de verrou sur les données 56
Traitement d'une requête de MAJ

4. Enregistrement des modifications


◼ à apporter au rollback (image avant)
◼ et aux données (nouvelles valeurs) dans le cache de reprise
(redo log)
5. Mêmes opérations dans le cache de données
◼ ces blocs sont marqués comme modifiés (différents des
blocs stockés sur disque)

57
Chapitre 2:Structure d’une Base de données Oracle

58
Architecture - BDD
 Base de Données Oracle
❖Structure Physique de stockage
◼ Fichiers de données
◼ fichiers Redo Log
◼ Fichiers de Contrôles
◼ Autres fichiers
❖Structure Logique de stockage
◼ Tablespace
◼ Segment
◼ Extent
◼ Bloc de données

➔ Nécessaire de comprendre ces 2 niveaux de représentation


59
Architecture – structure Physique de la BDD

60
Architecture – structure Physique de la BDD

 Fichiers de données

61
Architecture – structure Physique de la BDD

select * from dba_data_files;

62
Présentation du dictionnaire de données

 Le dictionnaire de données est un ensemble de tables et de vues


où est stockée l’information sur la structure logique et physique
de la BDD:
✓ Les utilisateurs des bases de données
✓ Noms et caractéristiques des objets stockés dans la base de donnée
✓ Contraintes d’intégrités
✓ Ressources physiques allouées à la base

63
Présentation du dictionnaire de données

 Le dictionnaire de données est créé à la création de la BDD, mis à


jour au fur et à mesure de la création d’objets.

 Les utilisateurs des bases de données, les développeurs


d'applications, les administrateurs de bases de données et le
serveur Oracle utilisent le dictionnaire de données comme une
source centrale d’information associée à une base de données.

64
Présentation du dictionnaire de données

 Le dictionnaire de données possède deux composants :


1. les tables de base
2. les vues du dictionnaire de données

65
Présentation du dictionnaire de données

1. Les tables de base sont les tables réelles d'Oracle qui stockent les
informations sur une base de données.
◼ Ces tables sont créées avec le script sql.bsq. Ce script est stocké dans le
répertoire ORACLE_HOME\rdbms\admin. Les informations stockées dans les
tables de base sont lues et écrites par le serveur Oracle. Ces informations sont
rarement accédées directement par les utilisateurs car ces informations sont
normalisées et stockées sous une forme encodée.
◼ Les utilisateurs ou administrateurs de bases de données ne doivent pas utiliser de
commandes LMD, telles que INSERT, UPDATE et DELETE, pour mettre à jour
les tables de base directement, à l'exception de la table de trace d'audit lorsque
la fonctionnalité d'audit est utilisée.

66
Présentation du dictionnaire de données

2. Les vues du dictionnaire de données sont des vues sur les


tables de base.
▪ Elles sont crées par le script catalog.sql.
▪ Les vues du dictionnaire de données simplifient et résument les
informations contenues dans les tables de base.
▪ Les vues du dictionnaire stockent également ces informations sous
une forme que les utilisateurs de la base de données peuvent lire
facilement.
▪ Ces vues permettent au DBA de gérer et d’administrer la
base de données.

67
Présentation du dictionnaire de données

 Les utilisateurs n’ont pas accès à ce dictionnaire


éventuellement en lecture à traves trois catégories des vues:
1. USER_<vues> : Vues sur les objets créé par un utilisateur
◼ Par exemple, la vue USER_TABLES contient les informations sur les tables
appartenant à un utilisateur.

68
Présentation du dictionnaire de données

2. ALL_<vues>: Vues sur les objets auxquels un utilisateur a accès (pas


nécessairement qu’il a créés(à travers l’obtention publique ou explicite
de rôles et de privilèges)

3. DBA_<vues>: Vues sur tous les objets de la base de données de tous


les utilisateurs accessible par les administrateur(DBA) ou les
utilisateurs qui possèdent le privilège système SELECT ANY TABLE.

69
Présentation du dictionnaire de données

70
Architecture – structure Physique de la BDD

 fichiers Redo Log

71
fichiers Redo Log

 L’idée de base : enregistrer toutes les modifications


apportées aux données pour minimiser les problèmes liés
aux pannes
 Le serveur Oracle met à jour les fichiers de reprise
🞑 buffer de reprise
🞑 processus LGWR
 Ne sont utilisés qu'en cas d'échec d'une instance pour
restaurer des données validées non écrites dans les
fichiers de données
72
fichiers Redo Log
 Groupes de fichiers de reprise :
 un membre est un élément d'un groupe, i.e. un fichier de reprise
 LGWR écrit simultanément sur chaque membre du groupe
 tous Les membres d'un groupe redo
log en ligne possèdent
exactement les mêmes informations
 Les membres d'un groupe sur des disques différents (au
moins 2 groupes)
 tous les membres d'un groupe possèdent un numéro de séquence log sert
d'identifiant
 le numéro courant est stocké dans le fichier de contrôle

select * from v$logfile; select * from v$log;

73
fichiers Redo Log

 Archivage de fichiers de redo log


🞑 Une des décisions importantes qu’un DBA doit prendre est
configurer la base de données dans le mode :
1. ARCHIVELOG
2. NOARCHIVELOG

74
fichiers Redo Log

 Archivage de fichiers de redo log


🞑 NOARCHIVELOG :
◼ En mode, NOARCHIVELOG, les fichiers de redo log online
sont réécrits à chaque fois qu’un fichier de redo log online est
rempli et qu’un log switch est lancé.

75
fichiers Redo Log

 Archivage de fichiers de redo log


🞑 ARCHIVELOG :
◼ Si la base de données est configurée dans le mode ARCHIVELOG, alors les
groupes de redo remplis doivent être archivé. Comme toutes les
modifications faites sur la base de données sont enregistrées dans les
fichiers de redo log online, le DBA peut utiliser la sauvegarde présente sur le
disque dur et les fichiers de redo log archivés pour restaurer la base de
données sans perdre aucune donnée comité.
🞑 On peut archiver les fichiers de redo log :
◼ Manuellement.
◼ Automatiquement : Méthode recommandée.

76
fichiers Redo Log

 Archivage de fichiers de redo log


🞑 ARCHIVELOG :
◼ Le paramètre d’initialisation LOG_ARCHIVE_START, lorsqu’il est à
◼ TRUE indique que l’archivage se fait automatiquement.
◼ A FALSE, indique que le DBA le fait manuellement.
◼ En mode automatique, l’archivage se fait grâce au processus
ARCn, et manuellement avec des requêtes SQL.

77
Architecture – structure Physique de la BDD

 Fichiers de Contrôles

78
Fichiers de Contrôles

 Fichier binaire
 Sert pour la base de données
🞑 lors du démarrage normal
◼ A chaque fois qu'une instance monte une base de données, elle lit le fichier
de contrôle pour localiser emplacement des fichiers de données et des
fichiers de reprise
🞑 lors du démarrage après panne
◼ Contient les informations nécessaires à la remise en état de la base de
données
🞑 pour le bon fonctionnement
◼ doit être disponible quand une base de données est montée ou ouverte

79
Fichiers de Contrôles

 Tous les fichiers de données et les fichiers log de la base de


données sont identifiés dans le fichier de contrôle.
 Le nom de la base de données est répertorié dans le fichier de
contrôle.
 Le fichier de contrôle est requis pour monter, ouvrir, et
accéder à la base de données.
 Le numéro de séquence de log actuel. Cette information
permet de synchroniser tous les fichiers appartenant à la
base de données.
 La configuration recommandée est un minimum de deux
fichiers de contrôle sur des disques différents (multiplixage).
80
Fichiers de Contrôles

 Multiplexage des fichiers de contrôle


🞑 Dans le but de prévenir une erreur dans un fichier de contrôle, il est
fortement recommandé de multiplexer les fichiers de contrôles et de les
stocker séparément sur des disques différents.
◼ Si un fichier de contrôle est perdu, une copie du fichier de contrôle peut être
utilisé pour redémarrer l’instance. On peut multiplexer jusqu’à 8 fichiers de
contrôles.

81
Fichiers de Contrôles

 Multiplexage des fichiers de contrôle


🞑 Modifier le SPFILE (Fichiers de paramètres) :
ALTER SYSTEM SET control_files =
‘$HOME/ORADATA/u01/ctrl01.ctl’, ‘$HOME/ORADATA/u02/ctrl02.ctl’
SCOPE = SPFILE ;
🞑 Eteindre la base de données.
🞑 Créer les fichiers de contrôles supplémentaires :
cp $HOME/ORADATA/u01/ctrl01.ctl
$HOME/ORADATA/u02/ctrl02.ctl
🞑 Redémarrer la base de données
82
Multiplexage du fichier de contrôle

 Avec le init.ora (Fichiers de paramètres) :


🞑 Eteindre la base de données.

🞑 Copier le fichier de contrôle existant sur un autre disque et changer


sont nom :
cp control01.ctl …/DISK3/control02.ctl
🞑 Ajouter le nouveau fichier de contrôle à init.ora :
CONTROL_FILES = (/DISK1/control01.ctl,
/DISK3/control02.ctl)
🞑 Redémarrer la base de données.
83
Fichiers de Contrôles

 Requêtes sur le fichier de contrôle


🞑 Select * from V$CONTROLFILE;

84
Architecture - BDD
 Autres fichiers
🞑Fichiers de paramètres
d’initialisation

85
Structure logique de stockage

 Objectifs
🞑 Faire le lien entre structure physique et logique
◼ via les fichiers de données
🞑 Comprendre les moyens logiques de structuration
◼ Segment
🞑 Etude de deux segments particuliers
◼ Segment rollback
◼ Segment temporaires

86
Tablespace : Définitions
 L’utilisateur, qu’il soit connecté par une application, ou
directement à la BDD par SQL*Plus, ne voit que la structure
logique de la BDD.
🞑 Quand il envoie une requête il voit que les tables et leurs
description
🞑 A aucun moment ne fait appel dans sa commande aux fichiers
physiques
🞑 Le processus serveur qui réceptionne la commande va devoir
savoir dans qu’il fichier sont stockées
🞑 Le relation entre les tables et les données stockées dans le fichier
physique se fait par un objet logique : Le tablespace
87
Tablespace : Définitions

 Les données d’une base Oracle sont mémorisées dans une ou


plusieurs unités logiques appelées tablespaces et
physiquement dans des fichiers associés à ces tablespaces.
 Un tablespace est la plus grande unité logique de stockage
allouable dans oracle.
 Un tablespace est composé d’au moins un fichier de données
ayant une existence physique(stocké sur disque dur).

88
Tablespace : Définitions
 Tout objet du schéma de base de données est crée
dans un seul tablespace, mais peut s’étaler sur
plusieurs fichiers de données.
 Les tablespaces peuvent être activés (online) ou
désactivés (offline) individuellement pour
d’éventuelles opérations de maintenance:
🞑 Les objets d’un tablespace offline ne sont plus
accessibles.

89
Utilisation des Tablespaces

 Contrôle de l'allocation d'espace et affectation de quotas aux


utilisateurs
 Contrôle de disponibilité des données par la mise online ou offline
des tablespaces
 Distribution du stockage des données sur plusieurs dispositifs
🞑 pour améliorer les E/S
🞑 pour réduire la contention sur un seul disque
 Exécution de sauvegarde partielle
 Conservations de volumes importants de données statiques sur des
dispositifs en lecture seule.

90
Tablespace

 Appartient à une seule base de données


 Chaque tablespace comprend un ou plusieurs
fichiers SE
 Les tablespaces peuvent être mis on/off line lors de
l'exécution de la base de données
🞑 excepté le tablespace SYSTEM
🞑 et un tablespace avec un rollback segment actif
 Possibilité de basculer entre le statut Read/Write et le
statut Read seul.
91
Fichiers de données
 Informations quantitatives :
🞑 nombre maximum de fichier par tablespace = 1023
🞑 nombre maximum de tablespace par base de données
: 64 000

92
93
Lien
segments/extents/blocs

 Segments
🞑 Espace alloué à un type spécifique de structure logique de stockage dans un tablespace
◼ segments de table, segments d'index, segment temporaire, rollback segment,…
 Extents
🞑 Ensemble de blocs contigus.
🞑 Chaque type de segment est composé d'un ou plusieurs extents
 Blocs de données
🞑 contient un ou plusieurs blocs de fichier physique alloué à partir d'un fichier de données existant
🞑 plus petite unité d'E/S
🞑 sa taille vaut DB_BLOC_SIZE

94
Segments,Extents& bloc (suite)

95
96
97
Les Tablespaces

 Le tablespace System:
🞑 Indispensable au fonctionnement de la base de donnée.
🞑 Il contient les informations du dictionnaire de données, les
définitions des procédures stockées, des packages … .
🞑 Ne devrait pas contenir de données utilisateurs

 Les tablespaces non system:


🞑 Permettent plus de flexibilité dans l’administration de la BD.
🞑 Composées de segments de données, d’indexes, de rollback et de
segments temporaires.

98
Création d’un tablespace

 Un tablespace est créé à l’aide de la commande


🞑 Create tablespace

Create tablespace tbs_user


Datafile ‘c:/oracle/oradata/userdata01.dbf’ size 100M
Autoextend on next 5M maxsize 200M;

99
Création d’un tablespace
 Syntaxe de création d'un tablespace :
CREATE TABLESPACE nom
DATAFILE spécification_fichier_data [,_]
[MINIMUM EXTENT valeur [K|M]]
[ONLINE|OFFLINE]
[PERMANENT|TEMPORARY]
[LOGGING|NOLOGGING]
[EXTENT MANAGEMENT
DICTIONARY
|LOCAL [AUTOALLOCATE |UNIFORM [SIZE valeur [K|M]]]]
[DEFAULT clause _ storage ]
[BLOCKSIZE valeur [K]]

100
Création d’un tablespace
 DATAFILE: spécifie le ou les fichiers de données liés au tablespace. M spécifie la
taille en Mo ou Kbits.
 MINIMUM EXTENT: garantit que la taille de chaque extent du tablespace est un
multiple de valeur
 LOGGING: option par défaut qui spécifie que toutes les tables, indexes et partitions
dans le tablespace génèrent des infos de redo log.
 DEFAULT: définit les paramètres de stockage par défaut pour tous
les objets créés dans le tablespace.
 OFFLINE: rend le tablespace indisponible immédiatement après la création.
 PERMANENT: spécifie que le tablespace peut être utilisé pour contenir des
objets permanents.
 TEMPORARY: cette clause est utilisée pour les objets temporaires.

101
Création d’un tablespace
 MANAGEMENT DICTIONARY: le tablespace est géré avec le dictionnaire de données.
 MANAGEMENT LOCAL: le tablespace est géré localement et une partie de son espace est
réservée pour sa gestion.
🞑 A la différence des tablespaces standards géré au niveau du dictionnaire de données, la
gestion de l'espace physique (allocation / libération de blocs) se fait dans l'entête du
fichier(s) du tablespace. Une table binaire d'allocation (bitmap) y est maintenue.
🞑 Avantages:

◼ pas de contention en mise a jour au niveau du dictionnaire


◼ …
 AUTOALLOCATE: la taille des extents est gérée par oracle, c’est l’option par défaut
 UNIFORM: il est défini une taille uniforme des extents en k octets ou en M octets . La taille
par défaut est de 1 méga Octet

102
Création d’un tablespace
Exemple 1 (tablesapace géré par le dictionnaire de donnée)

Create tablespace data Datafile


‘d:\oracle\oradata\iges5\data01.dbf’ size 30M,
‘e:\oracle\oradata\iges5\data02.dbf’ size 20M autoextend on
next 5M maxsize 60M
Extent management dictionary Minimum
extent 150K
Default storage (initial 300K
next 300K pctincrease 0
minextents 1
maxentents 50)
Online;

103
Création d’un tablespace

Exemple 2

Create temporary tablespace temp


TEMFILE ‘d:\oracle\oradata\iges5\temp01.dbf’ size
100M autoextend on next 10M maxsize 1000M
extent management local uniform size 4M;

104
Tablespaces temporaires

 Tablespaces temporaires
🞑 Utilisé pour les opérations de tri
🞑 Ils ne peuvent pas contenir d’objets permanents
🞑 La gestion local des exents est recommandée
🞑 Exemple :
CREATE TEMPORARY TABLESPACE temp
TEMPFILE ‘/DISK2/temp01.dbf’ SIZE 500M
Extent management local uniform size 4M;

105
Les Undo Tablespaces

 Les tablespaces de undo (tablespaces d’annulation)


🞑 Ils sont utilisés uniquement pour stocker les segments de undo (annulation)
🞑 Il ne peut contenir aucun autre objet
🞑 Il ne peut être utilisé qu’avec la clause datafile

CREATE UNDO TABLESPACE undo1


DATAFILE ‘u01/oradate/undo101.dbf’ SIZE 40M;

 Les informations d’utilisation des segments de UNDO sont


stockées dans la vue V$UNDOSTAT.

106
Augmenter la capacité de stockage
🞑 Augumenter la taille d’un tablespace
◼ Ajouter des fichiers de données au tablespace
ALTER TABLESPACE data ADD DATAFILE
‘d:\oracle\oradata\iges5\data03.dbf' SIZE 200M;
◼ Automatiquement avec l’activation de AUTOEXTEND
ALTER TABLESPACE data
ADD DATAFILE
‘d:\oracle\oradata\iges5\data02.dbf' SIZE 200M AUTOEXTEND ON NEXT
10M MAXSIZE 500M;
🞑 Redimensionner manuellement un fichier de données
ALTER DATABASE
DATAFILE ‘d:\oracle\oradata\iges5\data02.dbf' RESIZE 60M;

107
Statut OFFLINE
 Les données d'un tablespace offline ne sont plus
accessibles
🞑 L’administrateur peut sauvegarder cette partie des données sans
arrêter le fonctionnement du reste de la base
🞑 Ne peuvent jamais être mis offline
◼ le tablespace SYSTEM
◼ tout tablespace avec des rollbacks segments actifs
 Exemple :
ALTER TABLESPACE data OFFLINE;

Pour rendre de nouveau le tablespace online: (ALTER


TABLESPACE data ONLINE;)

108
Chapitre 3: Objets d’une BDD Oracle

109
Les Types de données

Type de données Description


VARCHAR2 (taille) Texte de longueur variable. La longueur minimale est
de 1 caractère et maximale 4000 caractères. La taille
devra obligatoirement être définie.
CHAR (taille) Texte de longueur fixes. La taille minimum de 1 caractère
et pouvant aller jusqu'à 2000 caractères.
NUMBER (p, e) Nombre ayant une précision pouvant aller de 1 à 38
chiffres et ayant une échelle pouvant aller de –84 à 127.
(L'échelle est en fait le nombre de chiffre à afficher après
la virgule.)
DATE Date notée sous la forme DD-MON-YY.

110
Les Types de données
Type de données Description
LONG Texte de longueur variable pouvant stocker jusqu'à 2
gigas. On ne pourra mettre qu'une colonne de type LONG
par table.
RAW (taille) Equivalent à VARCHAR2, mais il permet de stocker des
données binaires qui ne sont pas interprétées par Oracle.
La taille maximum est de 2000.
LONGRAW Equivalent à LONG mais pour des données de type
binaire non interprétées par Oracle.

111
Les Types de données
Type de données Description
CLOB Permet de stocker un pointeur vers un fichier de
données composé de caractère et pouvant contenir
jusqu'à 4 gigas.
BLOB Permet de stocker un pointeur vers un fichier
composé de données binaire et pouvant contenir jusqu'à
4 gigas.
BFILE Permet de stocker les données binaires d'un fichier
externe pouvant contenir jusqu'à 4 gigas.

112
Les Types de données

113
Tables

 Est une unité de stockage élémentaire, composée de lignes et


de colonnes
 Le nom d'une table dans une BDD Oracle
🞑 Doit commencer par une lettre
🞑 Ne doit pas dépasser les 30 caractères
🞑 Ne peut contenir que les caractères A à Z, a à z, 0 à 9,
_, $, et #
🞑 Ne doit pas porter le nom d'un autre objet appartenant au
même utilisateur
🞑 Ne doit pas être un mot réservé

114
Tables

 Pour créer une table, vous devez avoir le privilège


CREATE TABLE

Syntaxe

115
Tables

116
Tables

CREATE TABLE EMP2 (EMPNO NUMBER(2), ENAME VARCHAR2(50),


LOCATION VARCHAR2(50)) TABLESPACE DATA1;

117
Tables
 Attention
🞑 Pour accéder à une table d'un autre utilisateur, il faut précéder le
nom de la table par le nom du propriétaire
◼ Ex: SCOTT.EMP
🞑 La création d'une table fait appel à un ordre du LDD
⇒sa validation est automatique
 L'option DEFAULT
🞑 Permet de définir la valeur par défaut
◼ Ex:
– DATE_PRET DATE DEFAULT SYSDATE
– DEPARTEMENT VARCHAR2(25) DEFAULT 'Commercial'

118
Création des tables en utilisant
une sous-requête
 Il est possible de créer une table et insérer des
lignes en utilisant la requête CREATE TABLE et
l’option AS sous-requête.

CREATE TABLE table


[(colonne, colonne …)]
AS sous-requête ;

119
Création des tables en utilisant
une sous-requête

 Exemple
SQL> CREATE TABLE copy_emp AS SELECT * FROM emp;

 Explication : On créée une nouvelle table copy_emp


qui possède la même structure et les mêmes données
que la table emp.

120
Création des tables en utilisant
une sous-requête
 Exemple
SQL> CREATE TABLE copy_emp NOLOGGING
TABLESPACE DATA2
AS SELECT * FROM emp
WHERE EMPNO<20;

121
Création des tables en utilisant
une sous-requête

 ATTENTION
🞑 Le nombre de colonnes spécifiées doit correspondre au nombre des
colonnes de la requête
🞑 La définition d'une colonne ne peut contenir que son nom et sa
valeur par défaut
🞑 Si aucune colonne n'est spécifiée, la table aura les mêmes
colonnes que celles de la requête
🞑 Les contraintes ne sont pas prises en compte

122
Modification des tables

 L'ordre ALTER TABLE


🞑 Permet de modifier la structure d'une table (Ajout d'une colonne,
modification, définition d'une valeur par défaut, supprimer une
colonne, etc.)
🞑 La modification d'une valeur par défaut ne s'appliquer qu'aux
insertions ultérieures dans la table

123
Modification des tables

 L'ordre ALTER TABLE


🞑 Apres avoir crée une table, il est parfois nécessaire de modifier sa
structure. Pour modifier une table il faudra employer la commande :
ALTER TABLE nom_de_la_table

ALTER TABLE tablename


ADD|MODIFY|DROP (column datatype [DEFAULT expr]);

124
Modification des tables
 L'ordre ALTER TABLE

ALTER TABLE EMPLOYEE


ADD TELEPHONE VARCHAR2(10);

ALTER TABLE EMPLOYEE ADD (fax VARCHAR2(10)


email VARCHAR2(50));

125
Modification des tables

 L'ordre ALTER TABLE

ALTER TABLE EMPLOYEE


MODIFY TELEPHONE VARCHAR2(20);

126
Modification des tables

 L'ordre ALTER TABLE

ALTER TABLE EMPLOYEE DROP COLUMN


TELEPHONE CASCADE CONSTRAINTS;

127
Modification des tables
 L'ordre RENAME
🞑 Permet de modifier le nom d'une table, d'une vue, d'une
séquence, et d'un synonyme
Syntaxe
SQL> RENAME nom_objet TO nouveau_Nom;
Ou
SQL> ALTER TABLE nom_table RENAME
TO nouveau_Nom;
🞑 Vous devez être propriétaire de l'objet

128
Supprimer une table

 L'ordre DROP TABLE


🞑 Syntaxe
SQL> DROP TABLE
[schema.]nom_table
CASCADE CONSTRAINTS;

◼ La clé étrangère doit être supprimée avant la table


parent (cascade constraints)

129
Supprimer une table

 L'ordre DROP TABLE


SQL> DROP TABLE emp;

 Pour supprimer une table, l'utilisateur Doit être le créateur


 Il possède le privilège DROP ANY TABLE

130
Vider une table
 L'ordre TRUNCATE TABLE
🞑 Permet de vider une table et libérer l'espace de stockage utilisé
par la table
 Syntaxe
SQL> TRUNCATE TABLE nom_table;
 Cet ordre est irréversible
 Vous pouvez utiliser l'ordre DELETE pour supprimer les lignes
d'une table
🞑 Mais il ne libère pas l'espace de stockage

131
Tables

 L'ordre COMMENT ON
🞑 Permet d'ajouter des commentaire à une table
 Syntaxe
SQL> COMMENT ON [TABLE nom_table| COLUMN
nom_table.nom_colonne]IS 'commentaire';

132
Tables

 L'ordre COMMENT ON

COMMENT ON TABLE EMP IS


‘Employes’;

COMMENT ON COLUMN EMP.TEL IS


‘Numero de Telephone’;

133
Tables

 L'ordre COMMENT ON
🞑 Pour afficher les commentaire, on peut utiliser
◼ ALL_COL_COMMENTS
◼ USER_COL_COMMENTS
◼ ALL_TAB_COMMENTS
◼ USER_TAB_COMMENTS

134
Tables

 Intégrité de données
🞑 Garantit que les données d’une base respectent certaines règles
◼ pour empêcher l’utilisateur d’entrer des données invalides dans la base
🞑 Empêchent la suppression d'une table lorsqu'il existe des
dépendances

135
tables
 Toutes les contraintes sont stockées dans le dictionnaire de
données (dans la table USER_CONSTRAINTS ).
🞑 Sont nommées sous Oracle
◼ Automatiquement sous le format SYS_Cn
◼ Manuellement par l'utilisateur
◼ Lors de la création (CREATE TABLE)
◼ Après la création (ALTER TABLE)
🞑 Donner des noms explicites à vos contraintes pour faciliter le
référencement.
 Les contraintes peuvent être définies soit au moment de la création
de la table soit après la création.

136
Tables
 Typesde contraintesvalides

NOT NULL Spécifie que cette colonne ne doit pas contenir


une valeur NULL
UNIQUE Spécifie une colonne (ou une combinaison de
colonnes) dont les valeurs doivent être uniques

PRIMARY KEY Identifie la clé primaire

FOREIGN KEY Identifie la clé étrangère

CHECK Spécifie une condition à laquelle doit répondre


chaque ligne de la table

137
Tables

 La contrainte NOT NULL

CREATE TABLE employee ( employee_id


NUMBER(6),
nom VARCHAR2(25) NOT NULL, ➔NOMME PAR LE SYSTEME
sal NUMBER(8,2),
hiredate DATE CONSTRAINT emp_hiredate_nn NOT NULL,
➔NOMME PAR L’utilisateur …);

138
Tables

139
Tables

140
Tables

141
Tables

142
Tables

143
Tables

 Ajout d’une contrainte


ALTER TABLE table
ADD [CONSTRAINT constriant] type (column);

 Pour ajouter la contrainte NOT NULL utilisez la


clause MODIFY
ALTER TABLE table
MODIFY column NOT NULL;

144
Tables

145
Tables

ALTER TABLE EMP


DROP CONSTRATINT cn_nom;

146
Tables

147
Tables

 Désactivation de contraintes
ALTER TABLE Emp
DISABLE CONSTRAINT pk_emp CASCADE;

ALTER TABLE Emp


DISABLE CONSTRAINT cn_nom;

148
Tables
 Activation de contraintes
ALTER TABLE Emp
ENABLE CONSTRAINT pk_emp;

149
Tables

150
Tables

151
Données

152
Données

153
Données

154
Données

155
Données

156
Données
223

157
Données

158
Vues

 Les vues sont des tables virtuelles qui permettent de


définir des filtres sur des tables réelles.
🞑 Une Vue est requête pouvant être manipulée comme une
table
🞑 Contrairement à une table, une vue stocke aucune
donnée, seulement une instruction SQL

 Elles permettent de limiter l'accès à certaines colonnes


d'une table pour un groupe d'utilisateurs et le type
d'accès
159
Vues
 Elles permettent de simplifier l'accès aux données

160
Vues

161
Vues

162
Vues

163
Vues

164
Vues

◼ Sans valeur par default

165
Vues

166
Vues

167
Séquences

 Une séquence est un objet créé par l’utilisateur.


 Elle sert à créer des valeurs pour les clés primaires,
qui sont incrémentées ou décrémentées par le serveur
Oracle.
 Noter que la séquence est stockée et générée
indépendamment de la table, et une séquence peut
être utilisée pour plusieurs tables.

168
Séquences

169
Séquences

170
Séquences

171
Séquences

172
Séquences

173
Séquences

174
Séquences

175
Séquences

176
Synonymes

 Un synonyme est un nom alternatif pour désigner un


objet de la base de données.
🞑 C'est aussi un objet de la base de données.
 Si un utilisateur veut accéder à un objet
appartenant à un autre schéma, il faut le faire
préfixer par le nom de schéma (SCOTT.emp)

177
Synonymes

178
Synonymes

179
Index
 Un index est un objet qui peut augmenter la vitesse
de récupération des lignes en utilisant les pointeurs.
 Les index peuvent être créés automatiquement par le
serveur Oracle ou manuellement par l’utilisateur.
 Ils sont indépendants donc lorsque vous supprimez
ou modifiez un index les tables ne sont pas
affectées.

180
Index
 Lors de la création des clés primaires ou des clés
étrangères, les index sont crées
automatiquement et ils possèdent les même
noms que les contraintes.

181
Index
 Quand créer un index:
🞑 La colonne contient une large plage de valeurs.
🞑 La colonne contient plusieurs valeurs nulles.
🞑 Une ou plusieurs colonnes sont fréquemment utilisées dans
la clause WHERE ou pour les conditions de jointure.
🞑 La table est grande et la plupart des requêtes
recherchent moins de 2-4% des lignes.

182
Index
 Quand ne pas créer des index:
🞑 La table est petite.
🞑 Les colonnes ne sont pas souvent utilisées.
🞑 Les requêtes recherchent plus de 2-4% des lignes.
🞑 La table est mise à jour fréquemment.
🞑 Les colonnes indexées sont référencées comme une
partie de l’expression.

183
Index
 Pour créer un index, il faut utiliser la requête
CREATE INDEX

CREATE INDEX nomindex


ON table (column1, column2 …);

 Exemple :
SQL> CREATE INDEX emp_ename_idx ON
emp(ename);

184
Index
 Pour créer un index, il faut utiliser la requête
CREATE INDEX

CREATE INDEX nomindex


ON table (column1, column2 …)
[TABLESPACE INDX];

 Exemple :
SQL> CREATE INDEX emp_ename_idx ON
emp(ename);

185
Index
 Pour vérifier l’existence d’un index, vous pouvez interroger
la table USER_INDEXES

 Supprimer un index
🞑 Il n’est pas possible de modifier un index, il faut le
supprimer ou recréer.
DROP INDEX nomindex;

DROP INDEX emp_ename_idx;

186
Plan (Partie II)
187
Introduction
Chapitre 1: DÉVELOPPER UN BLOC SIMPLE PL/SQL
Chapitre 2: Traitements Conditionnels et Traitements
Répétitifs
Chapitre 3: Curseurs et Gestion des Erreurs (EXCEPTION)
Chapitre 4: PROCEDURES, FONCTIONS ET PACKAGES
Chapitre 5: Déclencheurs (TRIGGERs)
Oracle - PL / SQL
(Procedural Language / Structured Query
Language)
Pourquoi PL/SQL ?

 SQL est un langage non procédural


🞑 Les traitements complexes sont parfois difficiles à écrire si on
ne peut utiliser des variables et les structures de
programmation comme les boucles et les alternatives
 On ressent vite le besoin d’un langage procédural pour
lier plusieurs requêtes SQL avec des variables et dans
les structures de programmation habituelles
Présentation du langage PL/SQL

PL/SQL

SQL STATEMENT EXECUTOR PROCEDURAL STATEMENT EXECUTOR


Intégréau noyauet aux outils
Intégréau noyau RDBMS.
(Forms, Rports, OAS, …)

REGLES

Déclarations possibles des variables.

Intégration de la majorité des ordresSQL..

Traitements séquentiels.

Exécution conditionnelle de blocs d’instructions.

Traitements répétitifs (boucles).

Gestion desexceptions.
Avantages de PL/SQL

 Intégration
 Amélioration des performances
 Portabilité
 Développement modulaire
CHAPITRE 1:
DÉVELOPPER UN BLOC
SIMPLE PL/SQL PL
Structure d'un Block PL/SQL

[ DECLARE ]
- Variables, constantes, curseurs,
exceptions utilisateurs
BEGIN
- Ordres SQL
- Instructions de Contrôle PL/SQL [
EXCEPTION ]
- Traitements à effectuer lors d'erreurs
END ;
STRUCRURED’UN
BLOCPL/SQL

BLOC PL/SQL

Partie déclarative Partie exécutable Partie exception


(optionnelle) (obligatoire) (optionnelle)

DECLARE BEGIN … END EXCEPTION

• Chaque instruction se termine par un point virgule.

• Les commentaires sont possibles / * * / .

• Possibilité d’imbrication desblocs.


Règles Syntaxiques d'un Bloc PL/SQL

 Identifiants :
🞑 Peuvent contenir jusqu'à 30 caractères.
🞑 Ne peuvent pas contenir de mots réservés à moins qu'ils
soient encadrés de guillemets.
🞑 Doivent commencer par une lettre.
🞑 Doivent avoir un nom distinct de celui d'une table de la base
ou d'une colonne.
Règles Syntaxiques d'un Bloc PL/SQL

 Utiliser un slash (/) pour exécuter un boc PL/SQL


anonyme dans PL/SQL.
 Placer un point virgule (;) à la fin d’une instruction SQL ou
SQL*PLUS
 Les chaînes de caractères et les dates doivent être
entourées de simples quotes ( ' ' ).
 Les commentaires peuvent être
- sur plusieurs lignes avec :
/* début et
fin de commentaire*/
- sur une ligne précédée de :
-- début et fin de commentaire
Les variables

En PL/SQL, une variable est le nom explicite d’un emplacement de


stockage temporaire prenant en charge un type de données particulier
dans un programme. Avant d'utiliser une variable, vous devez d'abord
la déclarer dans la section de déclaration d'un bloc PL / SQL.
Les variables

Il existe quatre catégories de types de variables :


Les variables - scalaire
Les variables

Convention de nommage des variables PL / SQL:


Il est vivement recommandé de suivre les conventions de
dénomination dans le tableau suivant pour rendre les variables
évidentes dans les programmes PL / SQL:
Prefix Data Type
v_ VARCHAR2
n_ NUMBER
t_ TABLE
r_ ROW
d_ DATE
b_ BOOLEAN
Les variables
Déclaration de variables PL / SQL
Pour déclarer une variable, vous utilisez un nom de variable suivi du type
de données et terminé par un point-virgule (;). Vous pouvez également
ajouter explicitement une contrainte de longueur au type de données
entre parenthèses.
DECLARE
v_last_name varchar2(20);
n_employee_id number;
BEGIN
NULL;
END;
Name [CONSTANT] datatype [NOT NULL] [:= DEFAULT value|expression];
Les variables -référence
Déclaration d’un variable de référence PL / SQL
Dans le programme PL/SQL, l’une des tâches les plus courantes
consiste à sélectionner les valeurs des colonnes d’un tableau dans un
ensemble de variables. Si les types de données des colonnes de la
table changent, vous devez modifier le programme PL / SQL pour que
les types des variables soient compatibles avec les nouvelles
modifications.

PL/SQL fait référence à l’utilisation du mot clé %TYPE pour


déclarer une variable dont le type de données est associé au type
de données d’une colonne d’une colonne donnée dans une table.

Variable_name table.column_name%TYPE | another_variable%TYPE ;


Les variables -référence

Déclaration d’un variable de référence PL / SQL


DECLARE
v_first_name EMPLOYEES.FIRST_NAME%TYPE;
v_last_name EMPLOYEES.LAST_NAME%TYPE;
n_employee_id EMPLOYEES.EMPLOYEE_ID%TYPE;
d_hire_date EMPLOYEES.HIRE_DATE%TYPE;
BEGIN
NULL;
END;
/
Les variables

Affectation de variable PL / SQL


pour affecter une valeur ou une variable à une autre, vous utilisez
l'opérateur d'affectation (: =).
DECLARE
v_first_name EMPLOYEES.FIRST_NAME%TYPE;
v_last_name EMPLOYEES.LAST_NAME%TYPE;
n_employee_id EMPLOYEES.EMPLOYEE_ID%TYPE;
d_hire_date EMPLOYEES.HIRE_DATE%TYPE;
BEGIN
v_first_name := 'Mary';
v_last_name := 'Jane';
d_hire_date := to_date('19700101','YYYYMMDD');
END;
/
Les variables

Affectation de variable PL / SQL


Vous pouvez utiliser INTO dans l'instruction SELECT pour affecter une
valeur à une variable. La clause INTO déplace les valeurs de la liste
des colonnes de SELECT query dans les variables PL / SQL
correspondantes.
Les variables

Affectation de variable PL / SQL


SET SERVEROUTPUT ON; d_hire_date
DECLARE FROM employees
v_first_name EMPLOYEES.FIRST_NAME%TYPE; WHERE employee_id = 200;
v_last_name EMPLOYEES.LAST_NAME%TYPE;
n_employee_id EMPLOYEES.EMPLOYEE_ID%TYPE; DBMS_OUTPUT.PUT_LINE(v_first_name);
d_hire_date EMPLOYEES.HIRE_DATE%TYPE; DBMS_OUTPUT.PUT_LINE(v_last_name);
BEGIN DBMS_OUTPUT.PUT_LINE(d_hire_date);
SELECT employee_id, END;
first_name, /
last_name,
hire_date
INTO n_employee_id,
v_first_name,
v_last_name,
Les variables

délimiteurs et commentaires de votre code


les délimiteurs sont des symboles ayant une signification
Les variables - Record

Un enregistrement PL / SQL est une structure de données composite


qui est un groupe de données liées stockées dans des champs.
Chaque champ de l'enregistrement PL / SQL a son propre nom et son
propre type de données.

TYPE type_name IS RECORD


(field1 data_type1 [NOT NULL] := [DEFAULT VALUE],
field2 data_type2 [NOT NULL] := [DEFAULT VALUE],
...
fieldn data_type3 [NOT NULL] := [DEFAULT VALUE]
);
Les variables - Record

DECLARE
table_based_record table_name%ROWTYPE;

DECLARE
r_emp employees%ROWTYPE;
n_emp_id employees.employee_id%TYPE := 200;
BEGIN
SELECT *
INTO r_emp
FROM employees
WHERE employee_id = n_emp_id;
-- print out the employee's first name
DBMS_OUTPUT.PUT_LINE(r_emp.first_name);
END;
/
Les variables - Record

SET SERVEROUTPUT ON SIZE 1000000;


DECLARE
TYPE t_name IS RECORD(
first_name employees.first_name%TYPE,
last_name employees.last_name%TYPE
);
r_name t_name; -- name record
n_emp_id employees.employee_id%TYPE := 200;
BEGIN
SELECT first_name,
last_name
INTO r_name
FROM employees
WHERE employee_id = n_emp_id;
-- print out the employee's name
DBMS_OUTPUT.PUT_LINE(r_name.first_name || ',' || r_name.last_name );
END;
Les variables - Record

Au niveau de l'enregistrement, vous pouvez effectuer les opérations suivantes:

• Vous pouvez affecter un enregistrement PL / SQL à un autre enregistrement


PL / SQL. La paire d'enregistrements PL / SQL doit avoir le même nombre de
champs et le type de données de chaque champ doit être convertible.
• Vous pouvez affecter une valeur NULL à un enregistrement PL / SQL en
affectant un enregistrement non initialisé.
• Un enregistrement PL / SQL peut être utilisé comme argument de paramètre
dans une fonction
• Vous pouvez renvoyer un enregistrement PL / SQL à partir d'une fonction
• Pour vérifier si l'enregistrement est NULL, vous devez vérifier chaque champ
individuel de l'enregistrement.
• Pour comparer deux enregistrements, vous devez comparer chaque champ
individuel de chaque enregistrement.
Devoir surveillé aura lieu le 25
novembre 2021 à 14h30 (la
salle B15)
212
CHAPITRE 2:
Traitements
Conditionnels et PL
Traitements Répétitifs
Les structures de contrôle

IF statement:
IF condition THEN
sequence_of_statements;
END IF;

IF-THEN-ELSE statement:
IF condition THEN
sequence_of_statements;
ELSE
sequence_of_else_statements;
END IF;
Les structures de contrôle

IF-THEN-ELSIF Statement
IF condition1 THEN
sequence_of_statements1
ELSIF condition2 THEN
sequence_of_statements2
ELSE
sequence_of_statements3
END IF;
Exemple

IF salaire < =1000 THEN nouveau_salaire := ancien_salaire + 100;


ELSEIF salaire > 1000 AND emp_id_emp = 1 THEN
nouveau_salaire := ancien_salaire + 500;
ELSE nouveau_salaire := ancien_salaire + 300;
END IF;

216
Les structures de contrôle

CASE Statement
CASE [TRUE | selector]
WHEN expression1 THEN
sequence_of_statements1;
WHEN expression2 THEN
sequence_of_statements2;
...
WHEN expressionN THEN
sequence_of_statementsN;
[ELSE sequence_of_statementsN+1;]
END CASE [label_name];
NB :PL / SQL ajoutera la clause ELSE implicite suivante: ELSE RAISE CASE_NOT_FOUND;
Les structures de contrôle

PL / SQL fournit une instruction CASE spéciale appelée instruction CASE


recherchée. La syntaxe de l'instruction CASE recherchée par PL / SQL est la
suivante:
Searched CASE Statement
CASE
WHEN search_condition_1 THEN sequence_of_statements_1;
WHEN search_condition_2 THEN sequence_of_statements_2;
...
WHEN search_condition_N THEN sequence_of_statements_N;
[ELSE sequence_of_statements_N+1;]
END CASE
Les structures de contrôle

LOOP Statement
LOOP
sequence_of_statements;
END LOOP;
Il doit y avoir au moins une instruction exécutable entre les mots clés LOOP et
END LOOP. La séquence d'instructions est exécutée à plusieurs reprises jusqu'à
atteindre une sortie de boucle. PL / SQL fournit des instructions EXIT et EXIT-
WHEN pour vous permettre de terminer une boucle.
Les structures de contrôle

LOOP Statement
Une boucle peut avoir une étiquette facultative qui est un identifiant non
déclaré entouré par des crochets doubles «étiquette». L'étiquette de la boucle
apparaît au début et à la fin de l'instruction PL / SQL LOOP. Une étiquette de
boucle est utilisée pour qualifier le nom de la variable de compteur de boucle
lorsqu'une boucle est imbriquée dans une autre boucle.
<<label>>
LOOP
sequence_of_statements;
END LOOP label;
Les structures de contrôle

FOR LOOP Statement


FOR loop_counter IN [REVERSE] lower_bound .. higher_bound LOOP
sequence_of_statements;
END LOOP;
Les structures de contrôle

WHILE LOOP Statement


WHILE condition LOOP
sequence_of_statements;
END LOOP;

NB: Si la condition est évaluée à FALSE ou à NULL, la boucle se termine et le


contrôle est passé à la prochaine instruction exécutable suivant les mots clés
END LOOP.
Exercice:

Ecrire un programme PL/SQL qui affiche les multiples de 3, 4


et 5 qui sont entre 4 et 32.

223
Exercice:
SET SERVEROUTPUT ON -- sous SQL pLUS
DECLARE i NUMBER:= 4;
BEGIN
LOOP
IF (MOD(i,3)=0) THEN
DBMS_OUTPUT.PUT_LINE (i || ‘ est un multiple de 3’);
END IF;
IF (MOD(i,4)=0) THEN
DBMS_OUTPUT.PUT_LINE (i || ‘ est un multiple de 4’);
END IF;
IF (MOD(i,5)=0) THEN
DBMS_OUTPUT.PUT_LINE (i || ‘ est un multiple de 5’);
END IF;
i := i+1;
EXIT WHEN i>32;
END LOOP; 224
END;
Les structures de contrôle

set serveroutput on;


DECLARE
n_counter NUMBER := 4;
n_factorial NUMBER := 1;
n_temp NUMBER;
BEGIN
n_temp := n_counter;
WHILE n_counter > 0
LOOP
n_factorial := n_factorial * n_counter;
n_counter := n_counter - 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE('factorial of ' || n_temp ||' is ' || n_factorial);
END;
CHAPITRE 3:
Exceptions & Curseurs
PL
Exceptions

• En PL / SQL, tout type d'erreur est traité comme une exception.


• Une exception est définie comme une condition spéciale
modifiant le flux d'exécution du programme.
• PL / SQL vous offre un moyen souple et puissant de gérer de
telles exceptions.
Exceptions
Exceptions

Il existe deux types d'exceptions:


❖Exception système: l’exception système est générée par
l’exécution de PL / SQL lorsqu’elle détecte une erreur. Par exemple,
une exception NO_DATA_FOUND est déclenchée si vous
sélectionnez un enregistrement non existant dans la base de
données.
❖Exception définie par le programmeur: l'exception définie par le
programmeur dans une application spécifique. on peut mapper des
noms d'exception avec des erreurs Oracle spécifiques à l'aide de
EXCEPTION_INIT pragma. On peut également affecter un numéro et
une description à l'exception à l'aide de
RAISE_APPLICATION_ERROR.
Exceptions
Pour définir une exception, on utilise le mot EXCEPTION
comme ci-dessous:
EXCEPTION_NAME EXCEPTION;
Pour déclencher cette exception, on utilise le mot RAISE
RAISE EXCEPTION_NAME;
Exceptions

Exception Oracle Error SQLCODE Description


Il est déclenché lorsqu'un objet null reçoit
ACCESS_INTO_NULL 06530 -6530
automatiquement une valeur.

Il est déclenché lorsqu'aucun des choix de la clause WHEN


CASE_NOT_FOUND 06592 -6592 d'une instruction CASE n'est sélectionné et qu'il n'y a pas de
clause ELSE.

s'il tente d'attribuer des valeurs aux éléments d'une table


COLLECTION_IS_NULL 06531 -6531
ou d'un tableau imbriqué non initialisé.
Exceptions

Exception Oracle Error SQLCODE Description


Il est déclenché lorsque l'on tente de stocker les valeurs en
DUP_VAL_ON_INDEX 00001 -1
double dans une colonne à index unique.

Il est déclenché lorsque vous tentez de créer une


INVALID_CURSOR 01001 -1001 opération de curseur non autorisée, telle que la fermeture
d'un curseur non ouvert.

Il est déclenché lorsque la conversion d'une chaîne de


INVALID_NUMBER 01722 -1722 caractères en un nombre échoue car cette chaîne ne
représente pas un nombre valide.
Exceptions

Oracle
Exception SQLCODE Description
Error
Il est déclenché lorsqu'une instruction SELECT INTO ne
NO_DATA_FOUND 01403 +100
renvoie aucune ligne.

Il est déclenché lorsqu'un curseur extrait une valeur d'une


ROWTYPE_MISMATCH 06504 -6504
variable dont le type de données est incompatible.

Il est déclenché lorsqu'une instruction SELECT INTO


TOO_MANY_ROWS 01422 -1422
renvoie plusieurs lignes.
Les curseurs - cursor

Un curseur PL / SQL est un pointeur qui pointe sur le jeu de résultats


d'une requête SQL par rapport à des tables de base de données.

Non

Oui
DECLARE OPEN FETCH VIDE ? CLOSE

• Créer une • Execute • Charger • Tester • Libérer


zone SQL • Identifier la ligne l'existence l'ensemble
nommée l'ensemble en cours de lignes actif
actif dans des • Si des lignes
variables existent,
revenir à
FETCH
Déclarer le curseur

Exemple :
DECLARE
CURSOR c1 IS
SELECT employee_id, last_name
FROM employees;

CURSOR c2 IS
SELECT *
FROM departments
WHERE department_id = 10;
BEGIN
...

Il est important de noter que le nom du curseur n’est pas une variable. Par conséquent, vous ne pouvez pas l’utiliser
comme variable, telle que l’affecter à un autre curseur ou l’utiliser dans une expression.
Ouvrir le curseur

Syntaxe :

OPEN cursor_name;

• Ouvrir le curseur pour exécuter l'interrogation et


identifier l'ensemble actif
• Si l'interrogation ne renvoie pas de ligne, aucune
exception n'est déclenchée
• Utiliser les attributs du curseur pour tester le
résultat après une extraction
Extraire les données à
partir du curseur
Exemples :
FETCH c1 INTO v_empid, v_ename;

DECLARE
v_empid employees.employee_id%TYPE;
... v_ename employees.last_name%TYPE;
OPEN i NUMBER := 1;
defined_cursor;
LOOP CURSOR c1 IS
FETCHSELECT employee_id,
defined_cursor INTOlast_name
defined_variables
EXIT FROM employees;
WHEN ...;
BEGIN
...
OPEN
-- c1; the retrieved data
Process
...FOR i IN 1..10 LOOP
END; FETCH c1 INTO v_empid, v_ename;
...
END LOOP;
END ;
Fermer le curseur

Syntaxe :
CLOSE cursor_name;

• Fermer le curseur après avoir terminé le traitement


des lignes
• Rouvrir le curseur, si nécessaire
• Ne pas essayer d'extraire les données d'un curseur
s'il a été fermé
Attributs d'un curseur explicite

Obtenir les informations d'état concernant un curseur


NomCurseur%attribut
Attribut Type Description
%ISOPEN BOOLEAN Prend la valeur TRUE si le curseur est
ouvert
%NOTFOUND BOOLEAN Prend la valeur TRUE si la dernière
extraction ne renvoie pas de ligne
%FOUND BOOLEAN Prend la valeur TRUE si la dernière
extraction renvoie une ligne ;
complément de %NOTFOUND
%ROWCOUNT NUMBER Prend la valeur correspondant au
nombre total de lignes renvoyées
jusqu'à présent
Boucles FOR de curseur
Procéder à l'extraction des employés, un par un, jusqu'au dernier
Exemple :

DECLARE
CURSOR c1 IS
SELECT employee_id, last_name
FROM employees;
BEGIN
FOR emp_record IN c1 LOOP

-- implicit open and implicit fetch occur

IF emp_record.employee_id = 134 THEN


...
END LOOP; -- implicit close occurs
END;
Clause WHERE CURRENT OF

La clause CURRENT-OF permet d'accéder directement en écriture


à la ligne en cours de lecture
Exemple : DECLARE
CURSOR cursLivre IS
SELECT liv_num, liv_titre FROM livre
ORDER BY liv_num
FOR UPDATE OF liv_num;
BEGIN
FOR monLivre IN cursLivre LOOP
UPDATE livre SET liv_num = liv_num+200
WHERE CURRENT OF cursLivre;
END LOOP;
COMMIT; -- valide les modifications et lève le verrou
END;
Clause WHERE CURRENT OF
Exemple:
DECLARE
CURSOR c1 IS
SELECT salary FROM employees
FOR UPDATE OF salary NOWAIT;
BEGIN
...
FOR emp_record IN c1 LOOP
UPDATE ...
WHERE CURRENT OF c1;
...
END LOOP;
COMMIT;
END;
Intercepter les erreurs prédéfinies
du serveur Oracle
▪ Utiliser le nom standard à l'intérieur du sous-programme
de traitement des exceptions
▪ Exemples d'exceptions prédéfinies (le package
STANDARD) :
• NO_DATA_FOUND
• TOO_MANY_ROWS
• INVALID_CURSOR
• ZERO_DIVIDE
• DUP_VAL_ON_INDEX
Exception prédéfinie

Syntaxe :
BEGIN SELECT ... COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
statement1;
statement2;
WHEN TOO_MANY_ROWS THEN
statement1;
WHEN OTHERS THEN
statement1;
statement2;
statement3;
END;
Erreur non prédéfinie
Intercepter une violation de contrainte d'intégrité
(code d'erreur du serveur Oracle -2292)
DECLARE
e_products_invalid EXCEPTION; 1 1
PRAGMA EXCEPTION_INIT (
e_products_invalid, -2292); 2 2
v_message VARCHAR2(50);
BEGIN
. . . 3
EXCEPTION
WHEN e_products_invalid THEN
:v_message := 'Product ID specified is not valid.';
. . .
END;
Exception définie par l'utilisateur
Pour intercepter une exception définie par l'utilisateur, vous devez la déclarer et la
déclencher explicitement.
DECLARE
nom_erreur EXCEPTION; 1
. . .
BEGIN
. . .IF (Problème) THEN
RAISE nom_erreur; 2
. . .
EXCEPTION
WHEN nom_erreur THEN 3
(traitement de l’erreur);
. . .
END;
RAISE_APPLICATION_ERROR

Syntaxe :
raise_application_error (error_number,
message[, {TRUE | FALSE}]);

Permet de déclencher des exceptions en leur attribuant un numéro


et un message.

Elle est appelée uniquement à partir d'un sous-programme stocké


en cours d'exécution
error_number est une valeur numérique définie par l'utilisateur pour
l'exception (-20000 … -20999).
RAISE_APPLICATION_ERROR

Elle peut être utilisée à deux endroits :


section exécutable
section de traitement des exceptions
DECLARE
. . .
BEGIN
. . . ...
DELETE FROM employees
WHERE manager_id = v_mgr;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20202,'This is not
a valid manager');
END IF;
. . .
END;
CHAPITRE 4:
Procédures et Fonctions
PL
Définition d'une procédure

❖ Une procédure est un type de sous-programme qui exécute une


action

❖ Une procédure peut être stockée en tant qu'objet de schéma dans


la base de données en vue d'exécutions répétées
Syntaxe pour la création de procédures

CREATE [OR REPLACE] PROCEDURE procedure_name


[(parameter1 [mode1] datatype1,
parameter2 [mode2] datatype2,
. . .)]
IS|AS
PL/SQL Block;

• L'option REPLACE indique que, si la procédure existe, elle sera


supprimée et remplacée par la nouvelle version créée avec
l'instruction
• Le bloc PL/SQL commence par BEGIN ou par la déclaration de
variables locales et se termine par END ou par END
procedure_name
Paramètres formels/réels

❖ Les paramètres formels sont des variables déclarées dans la


liste de paramètres d'une spécification de sous-programme
Exemple:
CREATE PROCEDURE raise_sal(p_id NUMBER, p_amount NUMBER)
...
END raise_sal;
❖ Les paramètres réels sont des variables ou des expressions
référencées dans la liste de paramètres d'un appel de sous-
programme
Exemple:
raise_sal(v_id, 2000)
Modes des paramètres des procédures
Procédure
Paramètre IN
Environnement
Paramètre OUT
appelant
Paramètre IN OUT

(DECLARE)
RQ : DATATYPE ne peut être que la
définition %TYPE ou %ROWTYPE, ou un BEGIN
type de données explicite sans
EXCEPTION
spécification de taille.
END;
Créer des procédures avec des paramètres

IN OUT IN OUT
Mode par défaut Doit être indiqué Doit être indiqué
La valeur est transmise au Est renvoyé à Est transmis à un sous-
sous-programme l'environnement programme ; est renvoyé à
appelant l'environnement appelant

Le paramètre formel se Variable non Variable initialisée


comporte en constante initialisée
Le paramètre réel peut être un Doit être une Doit être une
littéral, une expression, une variable variable
constante ou une variable
initialisée
Peut se voir affecter une valeur Ne peut pas se voir Ne peut pas se voir
par défaut affecter de valeur affecter de valeur par
par défaut défaut
Exemples de paramètres IN

176 p_id

CREATE OR REPLACE PROCEDURE raise_salary


(p_id IN employees.employee_id%TYPE)
IS
BEGIN
UPDATE employees
SET salary = salary * 1.10
WHERE employee_id = p_id;
END raise_salary;

Par défaut, le paramètre IN est transmis par référence et les paramètres OUT et IN OUT sont transmis
par valeur.
Exemples de paramètres OUT

Environnement appelant Procédure


Environnement appelant QUERY_EMP
Procédure QUERY_EMP

171 p_id

SMITH p_name

7400 p_salary

0.15 p_comm
Exemples de paramètres OUT

emp_query.sql
CREATE OR REPLACE PROCEDURE query_emp
(p_id IN employees.employee_id%TYPE,
p_name OUT employees.last_name%TYPE,
p_salary OUT employees.salary%TYPE,
p_comm OUT employees.commission_pct%TYPE)
IS
BEGIN
SELECT last_name, salary, commission_pct
INTO p_name, p_salary, p_comm
FROM employees
WHERE employee_id = p_id;
END query_emp;
Visualiser des paramètres OUT

• Déclarer les variables, exécuter la procédure QUERY_EMP, puis


imprimer la valeur de la variable globale G_NAME
VARIABLE g_name VARCHAR2(25)
VARIABLE g_sal NUMBER
VARIABLE g_comm NUMBER

EXECUTE query_emp(171, :g_name, :g_sal, :g_comm)

PRINT g_name

RQ :
--N'indiquez pas de taille pour une variable hôte de type NUMBER.
--La longueur par défaut d'une variable de type CHAR ou VARCHAR2 est de 1, si
aucune valeur n'est indiquée entre parenthèses.
Paramètres IN OUT

Environnement appelant Procédure FORMAT_PHONE

'8006330575' '(800)633-0575' p_phone_no

CREATE OR REPLACE PROCEDURE format_phone


(p_phone_no IN OUT VARCHAR2)
IS
BEGIN
p_phone_no := '(' || SUBSTR(p_phone_no,1,3) ||
')' || SUBSTR(p_phone_no,4,3) ||
'-' || SUBSTR(p_phone_no,7,4);
END format_phone;
Visualiser des paramètres IN OUT

VARIABLE g_phone_no VARCHAR2(15)


BEGIN
:g_phone_no := '8006330575';
END;

PRINT g_phone_no
EXECUTE format_phone (:g_phone_no)
PRINT g_phone_no
Méthodes de transmission des paramètres

Méthode positionnelle : répertorie les paramètres réels dans le même


ordre que les paramètres formels
Méthode de transmission de paramètres par association de noms :
répertorie les paramètres réels dans un ordre arbitraire en associant
chacun d'eux au paramètre formel correspondant
Méthode par combinaison : répertorie certains paramètres réels en tant
que paramètres positionnels et d'autres en tant que paramètres
nommés
Option DEFAULT des paramètres

CREATE OR REPLACE PROCEDURE add_dept


(p_name IN departments.department_name%TYPE
DEFAULT 'unknown',
p_loc IN departments.location_id%TYPE
DEFAULT 1700)
IS
BEGIN
INSERT INTO departments(department_id,
department_name, location_id)
VALUES (departments_seq.NEXTVAL, p_name, p_loc);
END add_dept;

RQ : Les paramètres OUT et IN OUT n’acceptent pas de valeur par défaut.


Exemples de transmission de paramètres

BEGIN
add_dept; ----????
add_dept ('TRAINING', 2500);
add_dept ( p_loc => 2400, p_name =>'EDUCATION');
add_dept ( p_loc => 1200) ;
END;

SELECT department_id, department_name, location_id


FROM departments;


Déclarer des sous-programmes

leave_emp2.sql

CREATE OR REPLACE PROCEDURE leave_emp2


(p_id IN employees.employee_id%TYPE)
IS
PROCEDURE log_exec
IS
BEGIN
INSERT INTO log_table (user_id, log_date)
VALUES (USER, SYSDATE);
END log_exec;
BEGIN
DELETE FROM employees
WHERE employee_id = p_id;
log_exec;
END leave_emp2;
/
Appeler une procédure depuis un bloc PL/SQL anonyme

DECLARE
v_id NUMBER := 163;
BEGIN
raise_salary(v_id); --invoke procedure
COMMIT;
...
END;
Appeler une procédure depuis une
autre procédure

CREATE OR REPLACE PROCEDURE process_emps


IS
CURSOR emp_cursor IS
SELECT employee_id
FROM employees;
BEGIN
FOR emp_rec IN emp_cursor
LOOP
raise_salary(emp_rec.employee_id);
END LOOP;
COMMIT;
END process_emps;
/
Exceptions traitées

Procédure appelée
Procédure appelante PROCEDURE
PROC2 ...
PROCEDURE IS
PROC1 ... ...
IS BEGIN
... ... Exception déclenchée
BEGIN EXCEPTION
... ... Exception traitée
PROC2(arg1); END PROC2;
...
EXCEPTION La procédure
...
END PROC1; appelante reprend
le contrôle
Exceptions non traitées

Procédure appelée
Procédure appelante
PROCEDURE
PROCEDURE PROC2 ...
PROC1 ... IS
IS ...
... BEGIN
BEGIN ... Exception déclenchée
... EXCEPTION
... Exception non traitée
PROC2(arg1); END PROC2;
...
EXCEPTION
...
END PROC1; La section de traitement
des exceptions de la
procédure appelante a
repris le contrôle
Supprimer des procédures
Supprimer une procédure stockée dans la
base de données.
Syntaxe:
DROP PROCEDURE procedure_name

Exemple:
DROP PROCEDURE raise_salary;
Présentation des fonctions stockées

Une fonction est un bloc PL/SQL nommé qui renvoie


une valeur
Une fonction peut être stockée en tant qu'objet de
schéma dans la base de données en vue
d'exécutions répétées
Une fonction est appelée dans une expression
Syntaxe pour la création de fonctions

CREATE [OR REPLACE] FUNCTION function_name


[(parameter1 [mode1] datatype1,
parameter2 [mode2] datatype2,
. . .)]
RETURN datatype -- ne doit pas inclure de spécification de taille
IS|AS
PL/SQL Block;

Le bloc PL/SQL doit comporter au moins une


instruction RETURN.
Exécuter des fonctions

Appeler une fonction dans une expression PL/SQL


Créer une variable destinée à recevoir la valeur renvoyée
Exécuter la fonction. La valeur renvoyée par l'instruction
RETURN sera placée dans la variable

RQ : Évitez d'utiliser les modes OUT et IN OUT avec les


fonctions
Exemple d'exécution de fonctions

Environnement appelant Fonction GET_SAL


117 p_id

RETURN v_salary

1. Charger et exécuter le fichier get_salary.sql pour créer


la fonction
2 VARIABLE g_salary NUMBER

3 EXECUTE :g_salary := get_sal(117)

4 PRINT g_salary
Exemple d'appel de fonctions dans des expressions SQL

CREATE OR REPLACE FUNCTION tax(p_value IN NUMBER)


RETURN NUMBER IS
BEGIN
RETURN (p_value * 0.08);
END tax;

SELECT employee_id, last_name, salary, tax(salary)


FROM employees
WHERE department_id = 100;
Exemple de création d'une fonction stockée

get_salary.sql
CREATE OR REPLACE FUNCTION get_sal
(p_id IN employees.employee_id%TYPE)
RETURN NUMBER
IS
v_salary employees.salary%TYPE :=0;
BEGIN
SELECT salary
INTO v_salary
FROM employees
WHERE employee_id = p_id;
RETURN v_salary;
END get_sal;
Supprimer des fonctions
Supprimer une fonction stockée.
Syntaxe :
DROP FUNCTION function_name

Exemple:
DROP FUNCTION get_sal;

• Tous les privilèges accordés à une fonction sont


annulés lorsque celle-ci est supprimée.
• Lorsque la syntaxe CREATE OR REPLACE est utilisée,
la fonction est supprimée et recréée, mais dans ce
cas, les privilèges accordés sur la fonction ne sont
pas affectés.
Procédure ou fonction ?

Procédure Fonction
Paramètre IN Paramètre IN
Environnement Environnement
Paramètre OUT
appelant appelant
Paramètre IN OUT
(DECLARE) (DECLARE)

BEGIN BEGIN

EXCEPTION EXCEPTION

END; END;
Comparer les procédures et les fonctions

Procédures Fonctions
S'exécutent en tant Sont appelées dans une
qu'instruction PL/SQL expression
Ne contiennent pas de Doivent contenir une clause
clause RETURN dans l'en-tête RETURN dans l'en-tête
Peuvent transférer zéro, une Doivent renvoyer une seule
ou plusieurs valeurs valeur
Peuvent contenir une Doivent contenir au moins
instruction RETURN une instruction RETURN
Avantages liés aux procédures et aux
fonctions stockées

❖ Performances améliorées
❖ Facilité de maintenance
❖ Sécurité et intégrité accrues des données
❖ Clarté améliorée du code
Le contrôle de la partie PL/SQL aura lieu le
mardi 28/12/2021 après midi. L’heure et le
local de l’examen seront communiqués
ultérieurement.

280
CHAPITRE 5: Triggers PL/SQL

PL
Types de déclencheur

Un déclencheur :
❑ est une procédure ou un bloc PL/SQL associé à la base de
données, à une table, à une vue ou à un schéma
❑ s'exécute de façon implicite lorsqu'un événement donné se
produit
il peut s'agir d'un :
▪ déclencheur applicatif, qui s'exécute lorsqu'un événement se produit dans une
application donnée
▪ déclencheur de base de données, qui s'exécute lorsqu'un événement de type
données (LMD) ou système (connexion ou arrêt) se produit dans un schéma ou
une base de données
Règles relatives à la conception de
déclencheurs
• Il est conseillé de concevoir des déclencheurs pour :
exécuter des actions associées
centraliser des opérations globales

• Si le code PL/SQL est très long, créer des procédures stockées et les
appeler dans un déclencheur

• L'utilisation excessive de déclencheurs peut entraîner des


interdépendances complexes dont la gestion peut s'avérer difficile
dans les applications volumineuses
Exemple de déclencheur de base de données

Application

INSERT INTO EMPLOYEES


. . .;

Table EMPLOYEES Déclencheur CHECK_SAL


Créer des déclencheurs LMD

Une instruction de déclenchement comporte les


éléments suivants :
1. moment du déclenchement
pour une table : BEFORE, AFTER
pour une vue : INSTEAD OF
2. événement déclencheur : INSERT, UPDATE ou DELETE
3. nom de la table : sur la table ou la vue
4. type de déclencheur : ligne ou instruction
5. clause WHEN : condition restrictive par ligne
6. corps du déclencheur : bloc PL/SQL
Composants des déclencheurs LMD

Moment du déclenchement : à quel moment le


déclencheur doit-il s'exécuter ?
BEFORE : exécution du corps du déclencheur avant le déclenchement de
l'événement LMD sur une table
AFTER : exécution du corps du déclencheur après le déclenchement de
l'événement LMD sur une table
INSTEAD OF : exécution du corps du déclencheur au lieu de l'instruction
de déclenchement. Ce déclencheur est utilisé pour les vues qui ne
peuvent pas être modifiées autrement
Composants des déclencheurs LMD

Evénement utilisateur déclencheur : quelle instruction LMD


entraîne l'exécution du déclencheur ?

Vous pouvez utiliser les instructions


suivantes :
INSERT
UPDATE
DELETE
Composants des déclencheurs LMD (Type)

Type de déclencheur : le corps du déclencheur doit-il


s'exécuter une seule fois ou pour chaque ligne
concernée par l'instruction ?
Instruction : le corps du déclencheur s'exécute une seule fois pour
l'événement déclencheur. Il s'agit du comportement par défaut. Un
déclencheur sur instruction s'exécute une fois, même si aucune ligne
n'est affectée
Ligne : le corps du déclencheur s'exécute une fois pour chaque ligne
concernée par l'événement déclencheur. Un déclencheur sur ligne ne
s'exécute pas si l'événement déclencheur n'affecte aucune ligne
Composants des déclencheurs LMD(Corps)

Corps du déclencheur : quelle action le déclencheur


doit-il effectuer ?
Le corps du déclencheur est un bloc PL/SQL ou un
appel de procédure (PL/SQL ou Java).

RQ
Les déclencheurs sur ligne utilisent des noms de corrélation pour accéder aux
anciennes ou nouvelles valeurs de colonne de la ligne en cours de traitement.
La taille d'un déclencheur est limitée à 32 Ko.
Séquence d'exécution

Lorsque la manipulation concerne une seule ligne, utilisez la


séquence d'exécution suivante pour un déclencheur sur une table :
Instruction LMD
INSERT INTO departments (department_id,
department_name, location_id)
VALUES (400, 'CONSULTING', 2400);

Action de déclenchement
Déclencheur sur
instruction BEFORE


Déclencheur sur ligne BEFORE
Déclencheur sur ligne AFTER
Déclencheur sur instruction
AFTER
Séquence d'exécution

Lorsque la manipulation concerne plusieurs lignes, utilisez la


séquence d'exécution suivante pour un déclencheur sur une table :
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = 30;

Déclencheur sur instruction BEFORE

Déclencheur sur ligne BEFORE

Déclencheur sur ligne AFTER


...
Déclencheur sur ligne BEFORE
Déclencheur
... sur ligne AFTER

Déclencheur sur instruction AFTER


Syntaxe pour la création de déclencheurs sur instruction LMD

Syntaxe :

CREATE [OR REPLACE] TRIGGER trigger_name


timing - - BEFORE ou AFTER
event1 [OR event2 OR event3] - - INSERT, UPDATE, DELETE
ON table_name
trigger_body

RQ: Les noms des déclencheurs doivent être uniques


au sein d'un même schéma
Créer des déclencheurs sur instruction LMD

Exemple :
CREATE OR REPLACE TRIGGER secure_emp
BEFORE INSERT ON employees
BEGIN
IF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR
(TO_CHAR(SYSDATE,'HH24:MI')
NOT BETWEEN '08:00' AND '18:00')
THEN RAISE_APPLICATION_ERROR (-20500,'You may
insert into EMPLOYEES table only
during business hours.');
END IF;
END;
/

RQ : En cas d'échec d'un déclencheur de base de données, l'instruction de


déclenchement est annulée.
Tester SECURE_EMP

INSERT INTO employees (employee_id, last_name,


first_name, email, hire_date,
job_id, salary, department_id)
VALUES (502, ‘Adil', ‘KAMAL', ‘kemail', SYSDATE,
'IT_PROG', 4500, 60);
Utiliser des prédicats conditionnels
CREATE OR REPLACE TRIGGER secure_emp
BEFORE INSERT OR UPDATE OR DELETE ON employees
BEGIN
IF (TO_CHAR (SYSDATE,'DY') IN ('SAT','SUN')) OR
(TO_CHAR (SYSDATE, 'HH24') NOT BETWEEN '08' AND '18')
THEN
IF DELETING THEN
RAISE_APPLICATION_ERROR (-20502,'You may delete from
EMPLOYEES table only during business hours.');
ELSIF INSERTING THEN
RAISE_APPLICATION_ERROR (-20500,'You may insert into
EMPLOYEES table only during business hours.');
ELSIF UPDATING ('SALARY') THEN
RAISE_APPLICATION_ERROR (-20503,'You may update
SALARY only during business hours.');
ELSE
RAISE_APPLICATION_ERROR (-20504,'You may update
EMPLOYEES table only during normal hours.');
END IF;
END IF;
END;
Créer un déclencheur sur ligne LMD
Syntaxe :
CREATE [OR REPLACE] TRIGGER trigger_name
timing
event1 [OR event2 OR event3]
ON table_name
[REFERENCING OLD AS old | NEW AS new]
FOR EACH ROW
[WHEN (condition)]
trigger_body
Créer des déclencheurs sur ligne LMD

CREATE OR REPLACE TRIGGER restrict_salary


BEFORE INSERT OR UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
IF :NEW.salary > 15000
THEN
RAISE_APPLICATION_ERROR (-20202,'Employee
cannot earn this amount');
END IF;
END;

UPDATE employees
SET salary = 15500
WHERE last_name = 'Russell';
Utiliser les qualificatifs OLD et NEW

CREATE OR REPLACE TRIGGER audit_emp_values


AFTER DELETE OR INSERT OR UPDATE ON employees
FOR EACH ROW
BEGIN
INSERT INTO audit_emp_table (user_name, timestamp,
id, old_last_name, new_last_name, old_title,
new_title, old_salary, new_salary)
VALUES (USER, SYSDATE, :OLD.employee_id,
:OLD.last_name, :NEW.last_name, :OLD.job_id,
:NEW.job_id, :OLD.salary, :NEW.salary );
END;
/
Utiliser les qualificatifs OLD et NEW : exemple de la table
Audit_Emp_Table

INSERT INTO employees


(employee_id, last_name,email,hire_date,job_id, salary)
VALUES
(777,'Temp
emp7','emp7@gmail.com',SYSDATE,'SA_REP',1000);

UPDATE employees
SET salary = 5000, last_name = 'Smith'
WHERE employee_id = 999;

SELECT user_name, timestamp, ... FROM audit_emp_table


Restreindre l'action d'un déclencheur sur ligne

CREATE OR REPLACE TRIGGER derive_commission_pct


BEFORE INSERT OR UPDATE OF salary ON employees
FOR EACH ROW
WHEN (NEW.job_id = 'SA_REP')
BEGIN
IF INSERTING
THEN :NEW.commission_pct := 0;
ELSIF :OLD.commission_pct IS NULL
THEN :NEW.commission_pct := 0;
ELSE
:NEW.commission_pct := :OLD.commission_pct + 0.05;
END IF;
END;
/
Déclencheurs INSTEAD OF

Application

INSERT INTO my_view


. . .;

INSERT
TABLE1
Déclencheur
INSTEAD OF

UPDATE
MY_VIEW TABLE2
Créer un déclencheur INSTEAD OF

Syntaxe :

CREATE [OR REPLACE] TRIGGER trigger_name


INSTEAD OF
event1 [OR event2 OR event3]
ON view_name
[REFERENCING OLD AS old | NEW AS new]
[FOR EACH ROW]
trigger_body

RQ : Les déclencheurs INSTEAD OF ne peuvent être écrits que pour des vues. Les options
BEFORE et AFTER ne sont pas valides.
Créer un déclencheur INSTEAD OF Exemple

CREATE TABLE new_emps AS


SELECT employee_id, last_name,
salary, department_id,
email, job_id, hire_date
FROM employees;

CREATE TABLE new_depts AS


SELECT d.department_id, d.department_name,
d.location_id, sum(e.salary) tot_dept_sal
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_id, d.department_name,
d.location_id;

CREATE VIEW emp_details AS


SELECT e.employee_id, e.last_name, e.salary,
e.department_id, e.email, e.job_id,
d.department_name, d.location_id
FROM employees e, departments d
WHERE e.department_id = d.department_id;
Créer un déclencheur INSTEAD OF (suite)

CREATE OR REPLACE TRIGGER new_emp_dept


INSTEAD OF INSERT ON emp_details
FOR EACH ROW
BEGIN

INSERT INTO new_emps


VALUES (:NEW.employee_id, :NEW.last_name,
:NEW.salary, :NEW.department_id,
:NEW.email, :New.job_id, SYSDATE);
UPDATE new_depts
SET tot_dept_sal = tot_dept_sal + :NEW.salary
WHERE department_id = :NEW.department_id;

END;
Créer un déclencheur INSTEAD OF

Exécution d'une instruction INSERT dans la vue EMP_DETAILS


basée sur les tables EMPLOYEES et DEPARTMENTS

1 INSERT INTO emp_details


(employee_id, last_name, salary,department_id,email,
job_id,department_name,location_id)
VALUES
(9002,'ABBOTT',3000,10,'abbott.mail.com',
'HR_MAN‘,'Finance',1700);

Opération INSERT d'un


déclencheur INSTEAD …
OF dans EMP_DETAILS
Créer un déclencheur INSTEAD OF

Exécution d'une instruction INSERT dans la vue EMP_DETAILS


basée sur les tables EMPLOYEES et DEPARTMENTS

INSERT INTO emp_details(employee_id, ... )


1 VALUES(9001,'ABBOTT',3000,10,'abbott.mail.com','HR_MAN');

Opération INSERT d'un


déclencheur INSTEAD
OF dans EMP_DETAILS

INSERT dans UPDATE


2 3
NEW_EMPS NEW_DEPTS



Différences entre les déclencheurs de base de données et les
procédures stockées

Déclencheurs Procédures

Définis via la commande CREATE Définis via la commande


TRIGGER CREATE PROCEDURE
Le dictionnaire de données Le dictionnaire de données contient
contient le code source dans le code source dans
USER_TRIGGERS USER_SOURCE
Appel implicite Appel explicite
Les instructions COMMIT, Les instructions COMMIT,
SAVEPOINT et ROLLBACK ne sont SAVEPOINT et ROLLBACK sont
pas autorisées autorisées
Différences entre les déclencheurs de base de données et les
déclencheurs Form Builder

INSERT INTO EMPLOYEES


. . .;

Table EMPLOYEES Déclencheur CHECK_SAL

BEFORE

INSERT
ligne
Gérer les déclencheurs

Désactiver ou réactiver un déclencheur de base de données :


ALTER TRIGGER trigger_name DISABLE | ENABLE

Désactiver ou réactiver tous les déclencheurs d'une table :


ALTER TABLE table_name DISABLE | ENABLE ALL TRIGGERS

Recompiler un déclencheur pour une table :


ALTER TRIGGER trigger_name COMPILE
Syntaxe DROP TRIGGER

Pour supprimer un déclencheur de la base de


données, utiliser la syntaxe DROP TRIGGER :
DROP TRIGGER trigger_name;

DROP TRIGGER secure_emp;

Remarque : Lorsqu'une table est supprimée, tous ses


déclencheurs sont également supprimés
Tests des déclencheurs

▪ Tester toutes les opérations sur les données qui provoquent


un déclenchement, ainsi que celles n'en produisent pas
▪ Tester chaque cas de la clause WHEN
▪ Provoquer une exécution directe du déclencheur via une
opération de base sur les données, et une exécution
indirecte via une procédure
▪ Tester l'impact du déclencheur sur les autres déclencheurs
▪ Tester l'impact des autres déclencheurs sur le déclencheur
Exemple de modèle d'exécution des
déclencheurs et de vérification des contraintes

UPDATE employees SET department_id = 999


WHERE employee_id = 170;
-- Integrity constraint violation error
CREATE OR REPLACE TRIGGER constr_emp_trig
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
INSERT INTO departments
VALUES (999, 'dept999', 140, 2400);
END;
/

UPDATE employees SET department_id = 999


WHERE employee_id = 170;
-- Successful after trigger is fired
Fin

Vous aimerez peut-être aussi