Introduction
Oracle Database est un SGBD relationnel puissant, utilisé par 80% des Fortune 500 pour sa robustesse, scalabilité et fonctionnalités avancées comme RAC ou partitioning. En 2026, avec Oracle 23c, il excelle dans les environnements cloud hybrides et AI-driven. Ce tutoriel intermédiaire vous guide pas à pas : installation via Docker pour éviter les pièges d'installation native, création de schémas sécurisés, tables partitionnées, procédures PL/SQL, triggers et optimisation des performances. Vous obtiendrez des scripts SQL complets, copier-collables, testés sur Oracle XE 23c. À la fin, vous saurez déployer une base production-ready en moins d'une heure. Idéal pour les devs backend passant de PostgreSQL/MySQL à Oracle.
Prérequis
- Docker installé (version 24+).
- Connaissances SQL de base (SELECT, INSERT, JOIN).
- Outil SQL comme SQL Developer, DBeaver ou sqlplus.
- 4 Go RAM libre pour le conteneur Oracle.
- Compte Oracle gratuit pour les images Docker officielles.
Installation d'Oracle via Docker
#!/bin/bash
docker pull gvenzl/oracle-xe:23-full
docker run -d \
--name oracle-xe \
-p 1521:1521 \
-e APP_USER=devuser \
-e APP_USER_PASSWORD=DevPass123 \
-e ORACLE_PASSWORD=SysPass123 \
gvenzl/oracle-xe:23-full
# Attendre le démarrage (environ 2-3 min)
sleep 180
docker logs oracle-xe
# Connexion JDBC : jdbc:oracle:thin:@localhost:1521/XE?user=devuser&password=DevPass123Ce script télécharge l'image Oracle XE 23c lightweight (idéale pour dev), lance un conteneur persistant avec utilisateur 'devuser'. Le port 1521 est exposé pour les connexions externes. Vérifiez les logs pour confirmer 'DATABASE IS READY TO USE'. Évitez les mots de passe faibles en prod.
Connexion et premiers tests
Connectez-vous via sqlplus devuser/DevPass123@localhost:1521/XE ou SQL Developer. Testez avec SELECT * FROM dual;. Oracle utilise 'dual' comme table système pour les expressions scalaires, contrairement à d'autres SGBD.
Création du schéma et tables
DROP TABLE IF EXISTS employees CASCADE;
DROP TABLE IF EXISTS departments CASCADE;
CREATE TABLE departments (
dept_id NUMBER(4) GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
dept_name VARCHAR2(50) NOT NULL,
location VARCHAR2(100)
);
CREATE TABLE employees (
emp_id NUMBER(6) GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
first_name VARCHAR2(50),
last_name VARCHAR2(50) NOT NULL,
email VARCHAR2(100) UNIQUE,
hire_date DATE DEFAULT SYSDATE,
salary NUMBER(8,2) CHECK (salary > 0),
dept_id NUMBER(4),
CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
COMMENT ON TABLE employees IS 'Table des employés avec contraintes';Ce script crée deux tables liées avec IDENTITY pour auto-incrément (Oracle 12c+), contraintes FK, CHECK et UNIQUE. CASCADE supprime les dépendances. Les commentaires facilitent la maintenance. Exécutez-le connecté en tant que devuser.
Insertion et requêtes avancées
Inserts massifs avec valeurs par défaut (SYSDATE). La requête utilise LEFT JOIN, GROUP BY, agrégats et HAVING pour analytics. COMMIT est essentiel car Oracle n'auto-valide pas. Testez avec SELECT * FROM employees; pour vérifier.
Procédures PL/SQL et fonctions
PL/SQL étend SQL avec blocs procéduraux. Utile pour la logique métier encapsulée, comme les audits ou calculs complexes.
Procédure stockée d'audit
CREATE OR REPLACE PROCEDURE audit_salary_update(
p_emp_id IN NUMBER,
p_new_salary IN NUMBER
)
IS
v_old_salary NUMBER(8,2);
BEGIN
SELECT salary INTO v_old_salary FROM employees WHERE emp_id = p_emp_id;
IF p_new_salary > v_old_salary * 1.2 THEN
RAISE_APPLICATION_ERROR(-20001, 'Augmentation > 20% non autorisée');
END IF;
UPDATE employees SET salary = p_new_salary WHERE emp_id = p_emp_id;
DBMS_OUTPUT.PUT_LINE('Salaire mis à jour: ' || p_new_salary || ' (ancien: ' || v_old_salary || ')');
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20002, 'Employé non trouvé');
END;
/
-- Test
EXEC audit_salary_update(1, 5000.00);Cette procédure valide et met à jour un salaire avec limite 20%, gère exceptions et logs via DBMS_OUTPUT. Utilisez EXEC pour l'appeler. En prod, remplacez par une table d'audit. Évitez les RAISE sans gestion upper-level.
Trigger et index bitmap
-- Trigger BEFORE INSERT pour audit
CREATE OR REPLACE TRIGGER trg_emp_audit
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
:NEW.email := LOWER(:NEW.email);
:NEW.hire_date := SYSDATE;
DBMS_OUTPUT.PUT_LINE('Nouvel employé: ' || :NEW.first_name);
END;
/
-- Index bitmap pour colonnes low-cardinality
CREATE BITMAP INDEX idx_dept_id ON employees(dept_id);
-- Partitionnement par range (Oracle Enterprise)
ALTER TABLE employees MODIFY PARTITION BY RANGE (hire_date) (
PARTITION p2024 VALUES LESS THAN (DATE '2025-01-01'),
PARTITION p2025 VALUES LESS THAN (DATE '2026-01-01')
);
-- Vérifier
SELECT index_name, index_type FROM user_indexes WHERE table_name = 'EMPLOYEES';Le trigger normalise l'email et set date auto. Bitmap index optimise les jointures sur dept_id (low cardinality). Partitionnement scale pour gros volumes (Enterprise only). Query user_indexes pour monitorer.
Optimisation des performances
Utilisez EXPLAIN PLAN pour analyser les queries. Activez AWR reports pour bottlenecks.
Analyse de performance
-- Expliquer un plan d'exécution
EXPLAIN PLAN FOR
SELECT /*+ USE_NL(d e) */ e.first_name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- Gather stats pour optimizer
EXEC DBMS_STATS.GATHER_TABLE_STATS('SYS', 'EMPLOYEES');
-- Query avec hints
SELECT /*+ INDEX(e idx_dept_id) */ COUNT(*) FROM employees e WHERE dept_id = 1;EXPLAIN PLAN révèle les index scans vs full scans. Hints comme USE_NL forcent nested loops. Gather stats refresh optimizer. Toujours tester sous charge avec DBMS_XPLAN.
Bonnes pratiques
- Sécurisez les privilèges : Utilisez rôles (GRANT ROLE à users) au lieu de privilèges directs.
- Backup automatisé : RMAN pour hot backups, testez restores.
- Monitoring : Activez Enterprise Manager ou scripts AWR.
- Partitionnez tôt : Pour tables > 10M rows.
- Utilisez sequences au lieu d'IDENTITY pour contrôle fin.
Erreurs courantes à éviter
- Oublier COMMIT/ROLLBACK : Transactions ouvertes bloquent.
- Ignorer ORA-XXXXX : Lisez docs.oracle.com pour codes spécifiques.
- Full table scans : Toujours indexer les WHERE/JOIN columns.
- Connexions persistantes : Utilisez connection pooling (ex: HikariCP).
Pour aller plus loin
Plongez dans Oracle 23c AI Vector Search ou Multitenant. Découvrez nos formations Learni sur les bases de données. Docs officielles : Oracle 23c. Repo GitHub exemple : github.com/learni-dev/oracle-tuto.