vendredi 12 juin 2026

PL SQL , pakages, procedure stocker

 

1. Qu'est-ce que PL/SQL ?

PL/SQL (Procedural Language SQL) est le langage procédural d'Oracle.

SQL seul :

SELECT *
FROM Employees;

PL/SQL ajoute :

  • Variables
  • Conditions
  • Boucles
  • Gestion des exceptions
  • Procédures
  • Fonctions
  • Packages

Exemple :

DECLARE
v_salary NUMBER;
BEGIN
SELECT Salary
INTO v_salary
FROM Employees
WHERE EmployeeId = 1;

DBMS_OUTPUT.PUT_LINE(v_salary);
END;
/

Avantages

Traitement côté base
Moins d'allers-retours réseau
Performance
Sécurité
Centralisation de la logique métier

2. Procédure stockée (Stored Procedure)

Une procédure est un bloc PL/SQL stocké dans la base.

Exemple :

CREATE OR REPLACE PROCEDURE UpdateSalary
(
p_employee_id NUMBER,
p_salary NUMBER
)
AS
BEGIN
UPDATE Employees
SET Salary = p_salary
WHERE EmployeeId = p_employee_id;

COMMIT;
END;
/

Exécution :

EXEC UpdateSalary(100, 5000);

Paramètres

IN

Lecture seule.

p_employee_id IN NUMBER

OUT

Retourne une valeur.

CREATE PROCEDURE GetSalary
(
p_employee_id IN NUMBER,
p_salary OUT NUMBER
)

IN OUT

Lecture et modification.

p_amount IN OUT NUMBER

3. Fonction PL/SQL

Différence principale :

Une fonction retourne une valeur.

CREATE OR REPLACE FUNCTION GetBonus
(
p_salary NUMBER
)
RETURN NUMBER
AS
BEGIN
RETURN p_salary * 0.10;
END;
/

Utilisation :

SELECT GetBonus(Salary)
FROM Employees;

Procédure vs Fonction

ProcédureFonction
Peut ne rien retournerRetour obligatoire
Appelée via EXECPeut être utilisée dans un SELECT
Actions métierCalculs

4. Packages

Sujet très fréquent en entretien Oracle.

Un package est un conteneur regroupant :

Procédures
Fonctions
Variables
Types
Curseurs

Comparable à une classe statique en C#.


Package Specification

Interface publique.

CREATE OR REPLACE PACKAGE EmployeePkg
AS
PROCEDURE UpdateSalary(
p_employee_id NUMBER,
p_salary NUMBER);

FUNCTION GetSalary(
p_employee_id NUMBER)
RETURN NUMBER;
END EmployeePkg;
/

Package Body

Implémentation.

CREATE OR REPLACE PACKAGE BODY EmployeePkg
AS

PROCEDURE UpdateSalary
(
p_employee_id NUMBER,
p_salary NUMBER
)
IS
BEGIN
UPDATE Employees
SET Salary = p_salary
WHERE EmployeeId = p_employee_id;
END;

FUNCTION GetSalary
(
p_employee_id NUMBER
)
RETURN NUMBER
IS
v_salary NUMBER;
BEGIN
SELECT Salary
INTO v_salary
FROM Employees
WHERE EmployeeId = p_employee_id;

RETURN v_salary;
END;

END EmployeePkg;
/

Utilisation

EXEC EmployeePkg.UpdateSalary(100, 6000);

ou

SELECT EmployeePkg.GetSalary(100)
FROM Dual;

Pourquoi utiliser des Packages ?

Organisation

Au lieu de :

100 procédures dispersées

on a :

CustomerPkg
PaymentPkg
AccountPkg
TradePkg

Encapsulation

Comme en C# :

public class AccountService
{
}

En Oracle :

AccountPkg

Performance

Oracle garde le package compilé en mémoire.

Moins de recompilations.


Gestion des Exceptions

Très demandée.

BEGIN

UPDATE Accounts
SET Balance = Balance - 100;

EXCEPTION

WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Not Found');

WHEN OTHERS THEN
ROLLBACK;
RAISE;

END;
/

Curseurs

Utilisés pour parcourir plusieurs lignes.

DECLARE

CURSOR c_emp IS
SELECT EmployeeId
FROM Employees;

BEGIN

FOR emp IN c_emp LOOP

DBMS_OUTPUT.PUT_LINE(emp.EmployeeId);

END LOOP;

END;
/

Transactions PL/SQL

BEGIN

UPDATE Accounts
SET Balance = Balance - 100
WHERE Id = 1;

UPDATE Accounts
SET Balance = Balance + 100
WHERE Id = 2;

COMMIT;

EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
/

Questions fréquentes en entretien

Pourquoi utiliser une procédure stockée ?

Réduire les allers-retours réseau, centraliser la logique métier, améliorer les performances et sécuriser l'accès aux données.


Différence Procédure et Fonction ?

Une fonction retourne obligatoirement une valeur et peut être utilisée dans une requête SQL. Une procédure exécute principalement des actions métier et ne retourne pas forcément de valeur.


Pourquoi utiliser un Package ?

Pour regrouper des procédures et fonctions liées à un même domaine métier, améliorer l'organisation du code, l'encapsulation et les performances grâce à la compilation en mémoire.


Réponse entretien senior (banque)

Dans les environnements Oracle, j'ai utilisé PL/SQL pour implémenter des procédures stockées, des fonctions et des packages afin de centraliser les traitements métier côté base. Les packages permettent d'organiser les objets par domaine fonctionnel, tandis que les procédures stockées réduisent les échanges entre l'application .NET et la base de données. J'accorde également une attention particulière à la gestion des transactions, des exceptions et aux performances des requêtes via l'indexation et l'analyse des plans d'exécution.

SQL - 2

 Différence entre Clustered et Non-Clustered Index ? 

Index Seek vs Index Scan ? 

CTE vs Temp Table ? 

ROW_NUMBER vs RANK vs DENSE_RANK ?

 Que sont les Deadlocks ?

 Comment optimiser une requête lente ? 

ACID ? 

Isolation Levels ? 

Pourquoi éviter SELECT * ? 

Comment trouver le 2e ou 3e salaire le plus élevé ? 

Différence EXISTS vs IN ? 

Comment analyser un Execution Plan ?

1. Différence entre Clustered et Non-Clustered Index

Clustered Index

Les données de la table sont physiquement triées selon l'index.

Table Orders

1
2
3
4
5

L'ordre du stockage correspond à l'index.

Une seule fois par table.

Avantages

  • Très rapide pour les recherches par plage
WHERE OrderDate BETWEEN ...

Non-Clustered Index

Structure séparée contenant :

Valeur indexée
|
+--> Pointeur vers la ligne

Exemple :

CREATE INDEX IX_CustomerId
ON Orders(CustomerId)

Plusieurs par table.


Réponse entretien

Le Clustered Index définit l'ordre physique des données dans la table et il n'en existe qu'un seul. Le Non-Clustered Index est une structure séparée contenant des pointeurs vers les données et une table peut en posséder plusieurs.


2. Index Seek vs Index Scan

Index Seek

SQL Server va directement à la valeur recherchée.

SELECT *
FROM Orders
WHERE Id = 100
Index Seek

Complexité proche :

O(log n)

Très performant.


Index Scan

SQL Server parcourt tout l'index.

SELECT *
FROM Orders
WHERE YEAR(OrderDate)=2026
Index Scan

ou

Table Scan

Plus coûteux.


Réponse entretien

Index Seek signifie que SQL Server utilise efficacement l'index pour accéder directement aux lignes recherchées. Index Scan signifie qu'il parcourt une grande partie ou la totalité de l'index.


3. CTE vs Temp Table

CTE

WITH Sales AS
(
SELECT *
FROM Orders
)
SELECT *
FROM Sales

Caractéristiques :

Temporaire
Non matérialisée
Lisibilité
Requêtes récursives

Temp Table

SELECT *
INTO #Orders
FROM Orders

ou

CREATE TABLE #Orders (...)

Caractéristiques :

Stockée dans tempdb
Peut être indexée
Réutilisable plusieurs fois

Réponse entretien

Une CTE améliore la lisibilité et est généralement utilisée dans une seule requête. Une Temp Table est physiquement stockée dans tempdb et devient intéressante lorsqu'on doit réutiliser les données plusieurs fois ou créer des index intermédiaires.


4. ROW_NUMBER vs RANK vs DENSE_RANK

Données :

1000
1000
900
800

ROW_NUMBER

ROW_NUMBER()

Résultat :

1
2
3
4

Toujours unique.


RANK

RANK()

Résultat :

1
1
3
4

Trou dans la numérotation.


DENSE_RANK

DENSE_RANK()

Résultat :

1
1
2
3

Pas de trou.


Réponse entretien

ROW_NUMBER attribue un numéro unique à chaque ligne. RANK gère les ex-aequo mais laisse des trous. DENSE_RANK gère les ex-aequo sans laisser de trous.


5. Que sont les Deadlocks ?

Transaction A :

Lock TableA
Attend TableB

Transaction B :

Lock TableB
Attend TableA

Résultat :

Deadlock

SQL Server choisit une victime :

Deadlock Victim

et annule sa transaction.


Prévention

Même ordre d'accès aux tables
Transactions courtes
Index adaptés
Retry automatique

Réponse entretien

Un deadlock survient lorsque deux transactions se bloquent mutuellement en attendant des ressources détenues par l'autre. SQL Server détecte la situation et annule l'une des transactions.


6. Comment optimiser une requête lente ?

Checklist classique :

1. Execution Plan

Chercher :

Table Scan
Index Scan
Sort coûteux
Hash Match coûteux

2. Vérifier les index

WHERE
JOIN
ORDER BY
GROUP BY

3. Éviter

SELECT *

4. Réduire les données

TOP
Pagination

5. Vérifier statistiques

UPDATE STATISTICS

Réponse entretien

Je commence toujours par analyser l'Execution Plan afin d'identifier les scans, tris ou jointures coûteuses. Ensuite je vérifie les index, les statistiques et le volume de données traité.


7. ACID

Atomicity

Tout ou rien.

Commit ou Rollback

Consistency

Les règles métier restent valides.


Isolation

Les transactions ne se perturbent pas.


Durability

Après Commit :

Les données survivent à un crash

Réponse entretien

ACID garantit la fiabilité des transactions : Atomicité, Cohérence, Isolation et Durabilité.


8. Isolation Levels

Read Uncommitted

Dirty Reads possibles

Read Committed

Défaut SQL Server.

Pas de Dirty Read

Repeatable Read

Empêche la modification des lignes lues.


Serializable

Isolation maximale.


Snapshot

Très utilisé.

Versioning
Moins de blocages

Résumé

Read Uncommitted < Read Committed < Repeatable Read < Serializable

9. Pourquoi éviter SELECT * ?

Mauvais :

SELECT *
FROM Customers

Problèmes :

Lecture inutile
Plus d'I/O
Plus de réseau
Moins d'utilisation d'index couvrants
Maintenance compliquée

Préférer :

SELECT Id, Name
FROM Customers

Réponse entretien

SELECT * augmente les I/O, le trafic réseau et empêche parfois SQL Server d'utiliser des index couvrants. Je sélectionne uniquement les colonnes nécessaires.


10. Trouver le 2e ou 3e salaire le plus élevé

Avec DENSE_RANK

WITH Ranked AS
(
SELECT
Salary,
DENSE_RANK()
OVER(ORDER BY Salary DESC) AS Rnk
FROM Employees
)
SELECT *
FROM Ranked
WHERE Rnk = 2

2e salaire.


WHERE Rnk = 3

3e salaire.


11. EXISTS vs IN

IN

SELECT *
FROM Orders
WHERE CustomerId IN
(
SELECT Id
FROM Customers
)

EXISTS

SELECT *
FROM Orders o
WHERE EXISTS
(
SELECT 1
FROM Customers c
WHERE c.Id = o.CustomerId
)

Différence

EXISTS

S'arrête dès qu'il trouve une correspondance

IN

Peut nécessiter davantage de traitement

sur gros ensembles.


Réponse entretien

EXISTS est souvent plus performant sur de gros volumes car SQL Server s'arrête dès qu'une correspondance est trouvée. IN est généralement plus lisible pour les petites listes.


12. Comment analyser un Execution Plan ?

Les opérateurs à surveiller :

OpérateurBon/Mauvais
Index Seek✅ Bon
Clustered Index Seek✅ Bon
Index Scan⚠️ Moyen
Table Scan❌ Mauvais
Nested Loop✅ Souvent bon
Hash Match⚠️ Peut être coûteux
Sort⚠️ Coûteux
Key Lookup⚠️ À surveiller

Méthode d'analyse

  1. Activer Actual Execution Plan.
  2. Identifier l'opérateur le plus coûteux.
  3. Chercher :
Table Scan
Index Scan
Sort
Hash Match
Key Lookup
  1. Vérifier les index.
  2. Contrôler le nombre de lignes estimées vs réelles.

Réponse entretien

J'analyse d'abord l'Execution Plan réel, je repère les opérateurs les plus coûteux, puis je vérifie la présence de scans, de key lookups et la cohérence entre les lignes estimées et réelles. Cela permet d'identifier rapidement les problèmes d'indexation ou de cardinalité.

SQL - 2 Lượt xem: