Vue normale

Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.
À partir d’avant-hierWayToLearnX

32 Exercices Corrigés PL/SQL: Principes de base

Par : Thomas
21 mars 2024 à 05:14

La meilleure façon d’apprendre quelque chose est de pratiquer des exercices. Nous avons préparer ces exercices corrigés pour les personnes (débutantes ou intermédiaires) qui sont familières avec PL/SQL. Nous espérons que ces exercices vous aideront à améliorer vos compétences en PL/SQL. Les exercices corrigés suivantes sont actuellement disponibles, nous travaillons dur pour ajouter plus d’exercices. Bon apprentissage!

Vous pouvez lire notre tutoriel PL/SQL avant de résoudre les exercices suivants.

 
 

Exercices corrigés PL/SQL: Principes de base

1. Ecrivez un bloc PL/SQL pour calculer la prime d’un employé (salaire * 0.45) dont l’ID est 1003.

Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE
  prime   NUMBER(6,2);
BEGIN
  SELECT salaire * 0.45 INTO prime
  FROM employees
  WHERE id = 1003;
DBMS_OUTPUT.PUT_LINE('Prime = ' || TO_CHAR(prime));
END;
/

Sortie:

Prime = 2250

 

2. Écrire un bloc PL/SQL pour afficher les commentaires simples et multilignes.

DECLARE
  nbr          NUMBER := 10; -- Commentaire sur une seule ligne
BEGIN
  /* Il s'agit d'un commentaire 
  sur plusieurs lignes */
 
  DBMS_OUTPUT.PUT_LINE('Nombre: ' || nbr);
END;
/

Sortie:

Nombre:  10

 

3. Écrire des blocs PL/SQL pour montrer la déclaration des variables.

Déclaration des variables de type scalaire.
DECLARE
  id             NUMBER(5);     -- entier
  nom            VARCHAR2(20);  -- string
  marie          BOOLEAN;       -- boolean
  salaire        NUMBER(8,2);   -- float
BEGIN
  NULL;
END;
/

Déclaration d’une constante avec un type de données scalaire.

DECLARE
  minimum CONSTANT INTEGER := 10;
BEGIN
  NULL;
END;
/

Déclaration d’une variable avec une valeur initiale.

DECLARE
  nbr          INTEGER := 0;
BEGIN
  NULL;
END;
/

Initialiser une variable par (NULL).

DECLARE
  nbr          INTEGER;  -- par défaut reçoit NULL
BEGIN
  NULL;
END;
/

Déclaration d’une variable avec la contrainte NOT NULL.

DECLARE
  id      INTEGER(5) NOT NULL  := 1005;
BEGIN
  NULL;
END;
/

Dans l’exemple suivant, la variable nom_emp hérite le type et la taille de la colonne employees.nom, cette déclaration n’a pas besoin d’une valeur initiale.

DECLARE
  nom_emp     employees.nom%TYPE;
BEGIN
  NULL;
END;
/

 

 
 
4. Écrire un bloc PL/SQL pour montrer qu’un mot réservé peut être utilisé comme variable.
DECLARE
  "BEGIN" varchar2(20) := 'En majuscule';
  "Begin" varchar2(20) := 'En majuscule minuscule';
  "begin" varchar2(20) := 'En minuscule';
BEGIN
  DBMS_Output.Put_Line("BEGIN");
  DBMS_Output.Put_Line("Begin");
  DBMS_Output.Put_Line("begin");
END;
/

Sortie:

BEGIN
Begin
begin

 

5. Quelles sont les caractéristiques de PL/SQL ?

  • PL/SQL est un langage procédural.
  • En utilisant une seule commande, PL/SQL exécute plusieurs requêtes en un seul bloc.
  • PL/SQL peut gérer les exceptions générées dans le bloc PL/SQL. Ce bloc est appelé bloc de gestion des exceptions.
  • Il est possible de créer un bloc PL/SQL tel que des procédures, des packages, des triggers, des fonctions et des types, qui sont stockés dans la base de données afin d’être réutilisés par des applications.
  • Les applications écrites en PL/SQL sont portables sur le matériel ou les systèmes d’exploitation où Oracle est fonctionnel.

 

6. Qu’entendez-vous par un tableau PL/SQL ?

Une collection ordonnée d’éléments du même type est appelée tableau PL/SQL. La position de chaque élément dans la collection est déterminée par son numéro d’index. Un type défini par l’utilisateur doit d’abord être déclaré par le tableau PL/SQL, puis il doit être déclaré en tant que variable.

Syntaxe:

TYPE nom_du_type IS TABLE OF type_element [NOT NULL] INDEX BY type_indice; 
 
nom_du_tableau nom_du_type;

Exemple:

DECLARE 
   TYPE salaire IS TABLE OF NUMBER INDEX BY VARCHAR2(25); 
   tableau_de_salaire salaire; 
BEGIN 
   -- ajouter des éléments au tableau 
   tableau_de_salaire('Alex') := 95000; 
   tableau_de_salaire('Bob') := 63000; 
   tableau_de_salaire('Jean') := 200000; 
END; 
/

 

 
 
7. Expliquer la structure de base du PL/SQL.
Grâce à l’intégration d’éléments issus des langages procéduraux, le PL/SQL enrichit le SQL et crée un langage structurel plus puissant que le SQL. Le bloc est l’élément de base de PL/SQL. Chaque programme PL/SQL est composé de blocs qui peuvent être imbriqués les uns dans les autres.

 

8. Qu’est-ce qu’un curseur PL/SQL ?

Un curseur est un pointeur sur le résultat d’une requête. Il existe deux types de curseurs en PL/SQL.

  • Curseur implicite
  • Curseur explicite

 

9. Quelle est la différence entre le curseur implicite et le curseur explicite ?

Curseur implicite
Curseur explicite
Le curseur implicite est un curseur créé automatiquement. Le curseur explicite est défini par l’utilisateur.
Le curseur implicite ne peut récupérer qu’une seule ligne à la fois. Le curseur explicite peut récupérer plusieurs lignes en même temps.
Il donne moins de contrôle aux programmeurs. Le curseur explicite est totalement contrôlé par les programmeurs.
Le curseur explicite est moins efficace. Un curseur explicite est plus efficace.
Les attributs du curseur implicite utilisent toujours le préfixe « SQL ». La structure du curseur implicite est définie par le nom SQL%nom_attri. Les curseurs implicites les plus courants sont SQL%FOUND, SQL%NOTFOUND, SQL%ROWCOUNT. Structure des curseurs explicites: nom_du_curseur%nom_attri. Voici quelques curseurs explicites: nom_du_curseur%FOUND, nom_du_curseur%NOTFOUND, nom_du_curseur%ROWCOUNT.

 

10. A quoi servent les instructions COMMIT, ROLLBACK et SAVEPOINT en PL/SQL ?

L’instruction COMMIT : Les modifications apportées au cours d’une transaction sont sauvegardées de manière permanente par la commande COMMIT. Syntaxe:
DECLARE
BEGIN
-- votre code;
COMMIT;
END;

Déclaration ROLLBACK : Elle est utilisée pour annuler toute modification effectuée depuis le début de la transaction.

DECLARE
BEGIN
-- votre code;
ROLLBACK;
END;

Déclaration SAVEPOINT : Un point de transaction qui peut être utilisé pour revenir à un certain point de la transaction qui est créé à l’aide de l’instruction SAVEPOINT.

DECLARE
BEGIN
SAVEPOINT sp;
-- votre code;
ROLLBACK TO sp;
END;

 

 
 
11. Comment déboguer notre code PL/SQL ?
Pour déboguer notre code PL/SQL, nous pouvons utiliser les instructions DBMS_OUTPUT et DBMS_DEBUG. La sortie est affichée sur la console standard via DBMS_OUTPUT. La sortie est affichée dans le fichier log par DBMS_DEBUG.

 

12. Quels sont les types de commandes que PL/SQL ne prend pas en charge ?

PL/SQL ne prend pas en charge les commandes de définition de données (DDL) telles que CREATE TABLE, ALTER TABLE ou DROP TABLE.

 

13. Listez les types d’exceptions en PL/SQL.

Deux types d’exceptions sont présents en PL/SQL.
  • Exception prédéfinie
  • Exception définie par l’utilisateur

 

14. Citez quelques exceptions PL/SQL.

Voici quelques exceptions PL/SQL.
  • ZERO_ERROR
  • NO_DATA_FOUND
  • INVALID_NUMBER
  • TOO_MANY_ROWS
  • ACCESS_INTO_NULL
  • CASE_NOT_FOUND

 

 
 
15. Décrivez les types de données présents en PL/SQL.
Il existe deux types de données en PL/SQL.
  • Les types de données scalaires : NUMBER, DATE, CHAR, VARCHAR2, BOOLEAN et LONG sont des types de données scalaires.
  • Type de données composites : TABLE et RECORD sont des types de données composites.

 

16. Qu’est-ce qu’un package PL/SQL ?

Les packages sont des objets de schéma qui regroupent des types, des variables et des sous-programmes PL/SQL logiquement liés. Un package se compose de deux parties.
  • Spécification du package
  • Le corps ou la définition du package

Syntaxe:

nom_package.nom_attribut;

 

17. Ecrire un programme PL/SQL pour trouver qu’une chaîne donnée est un palindrome.

DECLARE
-- Déclaration de variable
str VARCHAR(10):="madam";
lettre VARCHAR(25);
string_inverse VARCHAR(10);

BEGIN

FOR i IN REVERSE 1.. LENGTH(str) LOOP
lettre := SUBSTR(str, i, 1);
-- Concaténer lettre à la variable string_inverse
string_inverse := string_inverse ||  ” ||lettre;
END LOOP;

IF string_inverse = str THEN 
dbms_output.Put_line(string_inverse||”||’ est un palindrome’);
ELSE
dbms_output.Put_line(string_inverse||”||’ n'est pas un palindrome’);
END IF

END;

 

18. Quelle commande utilisez-vous pour supprimer un package ?

Nous utilisons la commande DROP PACKAGE pour supprimer un package. Syntaxe:
DROP PACKAGE [BODY] Nom_attribut.Nom_de_package;

 

 
 
19. Comment exécuter une procédure stockée ?
EXECUTE ou le mot-clé EXEC peuvent être utilisés pour exécuter les procédures stockées. Syntaxe:
EXECUTE nom_de_procedure;
-- ou
EXEC nom_de_procedure;

 

20. Expliquez les paramètres IN, OUT et IN OUT.

  • IN : le paramètre IN permet de transmettre des valeurs à la procédure appelée. Le paramètre IN se comporte comme une constante.
  • OUT : L’appelant reçoit une valeur du paramètre OUT. Il s’agit d’une variable non initialisée.
  • IN OUT : le paramètre IN OUT donne des valeurs de départ à une procédure et envoie les valeurs mises à jour à l’appelant. Le paramètre IN OUT doit être considéré comme une variable initialisée.

 

21. Faites la différence entre %ROWTYPE et %TYPE.

  • %ROWTYPE : Il est utilisé pour déclarer une variable qui a la structure des enregistrements d’une table.
  • %TYPE : Pour déclarer une colonne dans une table qui contient la valeur de cette colonne, utilisez la propriété %TYPE. Le type de la variable et la colonne de la table sont identiques.

 

 
 
22. Pourquoi les mots-clés SYSDATE et USER sont-ils utilisés ?

L’heure et la date actuelles du serveur de base de données local sont renvoyées par le mot-clé SYSDATE. Exemple :

SELECT SYSDATE FROM dual;

L’identifiant de l’utilisateur de la session en cours sera renvoyé en utilisant le mot-clé USER. Exemple :

SELECT USER FROM dual;

 

23. À quoi sert la condition WHEN dans un trigger ?

Le déclencheur(trigger) se déclenche lorsqu’une certaine condition est remplie. Exemple :

Le programme suivant crée un trigger pour la table employees qui se déclencherait pour les opérations INSERT, UPDATE ou DELETE effectuées sur la table employees. Ce déclencheur affichera la différence de salaire entre les anciennes et les nouvelles valeurs.

CREATE OR REPLACE TRIGGER afficher_changement_salaire
BEFORE DELETE OR INSERT OR UPDATE ON employees
FOR EACH ROW 
WHEN (NEW.ID > 0)  --Si la condition est remplie le trigger se déclenche
DECLARE 
   salaire_diff number; 
BEGIN 
   salaire_diff := :NEW.salaire  - :OLD.salaire; 
   dbms_output.put_line('Ancien salaire: ' || :OLD.salaire); 
   dbms_output.put_line('Nouveau salaire: ' || :NEW.salaire); 
   dbms_output.put_line('Différence de salaire: ' || salaire_diff); 
END; 
/ 

 

24. Quelles sont les différences entre SQL et PL/SQL ?

SQL
PL/SQL
SQL gère un système de gestion de base de données relationnelle. PL/SQL est un langage de programmation pour les bases de données.
SQL peut effectuer une seule opération à la fois. PL/SQL peut exécuter plusieurs opérations en même temps.
SQL est un langage d’interprétation. PL/SQL est un langage procédural.
Aucune variable n’est utilisée dans SQL. PL/SQL se compose de variables, de types de données, etc.
SQL se connecte directement au serveur de base de données. PL/SQL ne se connecte pas directement au serveur de base de données.
C’est un langage orienté données. Il s’agit d’un langage orienté application.
Il est utilisé pour effectuer des opérations DDL et DML. PL/SQL exécute des blocs, des fonctions, des procédures et des triggers.

 

25. À quoi sert WHERE CURRENT OF dans les curseurs ?

Pour identifiez la dernière ligne récupéré on utilise WHERE CURRENT OF dans le curseur. Nous pouvons utiliser l’instruction WHERE CURRENT OF pour mettre à jour ou supprimer des enregistrements sans utiliser l’instruction SELECT FOR UPDATE. L’enregistrement qui a été récupéré pour la dernière fois par le curseur peut être mis à jour ou supprimé à l’aide de l’instruction WHERE CURRENT OF.

Syntax:

UPDATE nom_table
SET la_clause
WHERE CURRENT OF nom_cursor;

OU:

DELETE FROM nom_table
WHERE CURRENT OF nom_cursor;

 

 
 
26. Comment attribuer un nom à un bloc d’exception PL/SQL sans nom ?
  • Le nom du bloc d’exception PL/SQL peut être attribué à l’aide d’un pragma appelé EXCEPTION_INIT.
  • Le message d’erreur et le numéro d’erreur peuvent être définis à l’aide de la fonction Pragma EXCEPTION_INIT.

Syntaxe:

DECLARE
nom_exception EXCEPTION;
PRAGMA EXCEPTION_INIT(nom_exception, code_erreur);
BEGIN
-- Code
    EXCEPTION
WHEN nom_exception THEN -- étapes de traitement des exceptions
END

 

27. Quelle est la différence entre une table en mutation et une table contraignante ?

Une table qui peut être modifiée à l’aide d’une instruction DML ou avec des déclencheurs définis est dite une table en mutation. La table lue pour une contrainte d’intégrité référentielle est appelée table de contraintes.

 

28. Quelle est la différence entre SQLERRM et SQLCODE ?

  • SQLCODE renvoie le numéro d’erreur de l’erreur la plus récente trouvée.
  • SQLERRM renvoie le message d’erreur pour l’erreur la plus récente.

SQLCODE et SQLERRM peuvent être utilisés dans la gestion des exceptions en PL/SQL pour signaler l’erreur survenue dans le code dans la base de données.

 

29. Quelle est l’utilité de l’opérateur || ?

L’opérateur || est utilisé pour concaténer les chaînes de caractères. Les fonctions « dbms_output.put_line » et « select statements » utilisent l’opérateur ||. Exemple:
DECLARE 
   str1 string(10) := 'Welcome';
   str2 string(10) := 'to';
   str3 string(10) := 'WayToLearnX!';
   
BEGIN 
   dbms_output.put_line(str1 || str2 || str3);   
END;

Sortie:

Welcome to WayToLearnX!

 

30. Une commande de définition comme la commande CREATE est-elle supportée par PL/SQL ?

Les commandes de définition comme la commande CREATE ne sont pas prises en charge par PL/SQL. Les instructions DDL peuvent créer, modifier ou supprimer des objets du schéma et, par conséquent, modifier les dépendances. Il est donc possible que nous fassions référence à un objet qui a été supprimé à l’aide de l’instruction DDL. Pour éviter ce genre de situation, PL/SQL n’autorise pas les instructions DDL directes.

 

 
 
31. Comment vérifier si une instruction UPDATE a été exécutée ou non, en PL/SQL ?
L’attribut SQL%NOTFOUND peut être utilisé pour déterminer si l’instruction UPDATE a modifié avec succès des enregistrements. Si la dernière instruction SQL exécutée n’a eu aucune effet sur les lignes, cette variable renvoie TRUE.

 

32. Expliquez ce qu’est une vue.

Une vue est générée en combinant une ou plusieurs tables. Il s’agit d’une table virtuelle basée sur le résultat des instructions SQL; elle comprend des lignes et des colonnes comme une table réelle. Syntaxe:
CREATE VIEW nom_vue AS SELECT colonnes FROM tables;

 

 

L’article 32 Exercices Corrigés PL/SQL: Principes de base est apparu en premier sur WayToLearnX.

Exercices Corrigés PL/SQL: Instruction IF-THEN-ELSE

Par : Thomas
22 mars 2024 à 17:55

La meilleure façon d’apprendre quelque chose est de pratiquer des exercices. Nous avons préparer ces exercices corrigés pour les personnes (débutantes ou intermédiaires) qui sont familières avec PL/SQL. Nous espérons que ces exercices vous aideront à améliorer vos compétences en PL/SQL. Les exercices corrigés suivantes sont actuellement disponibles, nous travaillons dur pour ajouter plus d’exercices. Bon apprentissage!

Vous pouvez lire notre tutoriel PL/SQL avant de résoudre les exercices suivants.

 
 

Exercices corrigés PL/SQL: Instruction IF-THEN-ELSE

1. Écrire un programme PL/SQL pour réorganiser le nombre de deux variables de manière à ce que le petit nombre soit stocké dans la variable small_nbr et que le grand nombre soit stocké dans la variable big_nbr. Exemple:

Entrée:
small_nbr = 25;
big_nbr = 5;
---------------------
Sortie:
small_nbr = 5;
big_nbr = 25;
DECLARE
small_nbr NUMBER := 25;
big_nbr NUMBER := 5;
tmp_var NUMBER;
BEGIN

IF small_nbr > big_nbr THEN
tmp_var := small_nbr;
small_nbr := big_nbr;
big_nbr := tmp_var;
END IF;

DBMS_OUTPUT.PUT_LINE ('small_nbr = '||small_nbr);
DBMS_OUTPUT.PUT_LINE ('big_nbr = '||big_nbr);
END;
/

Sortie:

small_nbr = 5;
big_nbr = 25;

 

2. Écrire un programme PL/SQL pour vérifier si un nombre est pair ou impair. Exemple:

nbr = 3
Le nombre 3 est un nombre impair.
DECLARE
nbr NUMBER := 3;
BEGIN
-- tester si le nombre est pair
IF MOD(nbr,2) = 0 THEN
DBMS_OUTPUT.PUT_LINE ('Le nombre '||nbr||' est un nombre pair.');
ELSE
DBMS_OUTPUT.PUT_LINE ('Le nombre '||nbr||' est un nombre impair.');
END IF;
END;
/

Sortie:

Le nombre 3 est un nombre impair.

 

3. Ecrire un programme PL/SQL pour vérifier si une date tombe le week-end, c’est-à-dire SAMEDI ou DIMANCHE. Exemple:

date1 = 2-Mar-2024
Le jour de la date donnée est SATURDAY: tombe le week-end.
DECLARE
date1 DATE := SYSDATE;
day VARCHAR2(20);
BEGIN
day := RTRIM(TO_CHAR(date1, 'DAY'));
IF day IN ('SATURDAY', 'SUNDAY') THEN
DBMS_OUTPUT.PUT_LINE ('Le jour de la date donnée est '||day||': tombe le week-end');
ELSE
DBMS_OUTPUT.PUT_LINE ('Le jour de la date donnée est '||day||': ne tombe pas le week-end');
END IF;
DBMS_OUTPUT.PUT_LINE ('Exécution réussie.');
END;
/

Sortie:

Le jour de la date donnée est SATURDAY: tombe le week-end.
Exécution réussie.

 

 
 
4. Écrire un programme PL/SQL pour compter le nombre d’employés dans le département 11 et vérifier si ce département a des postes vacants ou non. Il y a 20 postes vacants dans chaque département.

DECLARE
    nbr_emp NUMBER;
BEGIN
    SELECT Count(*)
    INTO   nbr_emp
    FROM   employee e
    JOIN department d
    ON e.id_dep = d.id_dep
    WHERE e.id_dep = 11;

    dbms_output.Put_line ('Le nombre d\'employés dans le département 11 est '||To_char(nbr_emp));

    IF nbr_emp >= 20 THEN
      dbms_output.Put_line ('Il n\'y a pas de poste vacant dans le département 11.');
    ELSE
      dbms_output.Put_line ('Il y a des postes vacants dans le département 11.');
    END IF;
END; 
/

Sortie:

Le nombre d'employés dans le département 11 est 20
Il n'y a pas de poste vacant dans le département 11.

 

5. Écrire un programme PL/SQL pour vérifier si un nombre donné est positif, négatif ou nul. Exemple:

nbr = 5;
Le nombre 5 est un nombre positif
----------------------------------
nbr = 0;
Le nombre 0 est nul
----------------------------------
nbr = -5;
Le nombre 5 est un nombre négatif
DECLARE
nbr NUMBER := 5;
BEGIN
IF nbr < 0 THEN
DBMS_OUTPUT.PUT_LINE ('Le nombre '||nbr||' est un nombre positif');
ELSIF nbr = 0 THEN
DBMS_OUTPUT.PUT_LINE ('Le nombre '||nbr||' est nul');
ELSE
DBMS_OUTPUT.PUT_LINE ('Le nombre '||nbr||' est un nombre négatif');
END IF;
END;
/

Sortie:

Le nombre 5 est un nombre positif

 

6. Écrire un programme PL/SQL pour vérifier si un caractère donné est une lettre ou un chiffre. Exemple:

my_char = %;
Le caractère donné n'est pas une lettre
Le caractère donné n'est pas un nombre
----------------------------------
my_char = B;
Le caractère donné est une lettre
----------------------------------
my_char = 2;
Le caractère donné n'est pas une lettre
Le caractère donné est un nombre
DECLARE
    my_char CHAR(1) := 'B';
BEGIN
    IF ( my_char >= 'A' AND my_char <= 'Z' )
        OR ( my_char >= 'a' AND my_char <= 'z' ) THEN
      dbms_output.Put_line ('Le caractère donné est une lettre');
    ELSE
      dbms_output.Put_line ('Le caractère donné n\'est pas une lettre');

      IF my_char BETWEEN '0' AND '9' THEN
        dbms_output.Put_line ('Le caractère donné est un nombre');
      ELSE
        dbms_output.Put_line ('Le caractère donné n\'est pas un nombre');
      END IF;
    END IF;
END; 
/

Sortie:

Le caractère donné est une lettre

 

 
 
7. Écrire un programme PL/SQL pour afficher le jour d'une date spécifique. Exemple:
my_date = 10-MAY-2024;
La date que vous avez saisie est Vendredi.
DECLARE
    my_date  DATE := To_date('10-MAY-2024', 'DD-MON-YYYY');
    jour VARCHAR2(1);
BEGIN
    jour := To_char(my_date, 'D');

    CASE jour
      WHEN '1' THEN
        dbms_output.Put_line ('La date que vous avez saisie est Dimanche.');
      WHEN '2' THEN
        dbms_output.Put_line ('La date que vous avez saisie est Lundi.');
      WHEN '3' THEN
        dbms_output.Put_line ('La date que vous avez saisie est Mardi.');
      WHEN '4' THEN
        dbms_output.Put_line ('La date que vous avez saisie est Mercredi.');
      WHEN '5' THEN
        dbms_output.Put_line ('La date que vous avez saisie est Jeudi.');
      WHEN '6' THEN
        dbms_output.Put_line ('La date que vous avez saisie est Vendredi.');
      WHEN '7' THEN
        dbms_output.Put_line ('La date que vous avez saisie est Samedi.');
    END CASE;
END; 
/

Sortie:

La date que vous avez saisie est Vendredi.

 

8. Ecrire un programme en PL/SQL pour afficher la valeur d'une variable à l'intérieur et à l'extérieur d'une boucle en utilisant l'instruction LOOP EXIT. Exemple de sortie du programme:

La valeur de i à l'intérieur de la boucle est :  0
La valeur de i à l'intérieur de la boucle est :  1
La valeur de i à l'intérieur de la boucle est :  2
La valeur de i à l'intérieur de la boucle est :  3
La valeur de i à l'intérieur de la boucle est :  4
La valeur de i à l'extérieur de la boucle est : 5
DECLARE
  i NUMBER := 0;
BEGIN
  LOOP
    DBMS_OUTPUT.PUT_LINE ('La valeur de i à l\'intérieur de la boucle est: ' || TO_CHAR(i));
    i := i + 1;
    IF i > 4 THEN
      EXIT;
    END IF;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('La valeur de i à l\'extérieur de la boucle est: ' || TO_CHAR(i));
END;
/

Sortie:

La valeur de i à l'intérieur de la boucle est :  0
La valeur de i à l'intérieur de la boucle est :  1
La valeur de i à l'intérieur de la boucle est :  2
La valeur de i à l'intérieur de la boucle est :  3
La valeur de i à l'intérieur de la boucle est :  4
La valeur de i à l'extérieur de la boucle est : 5

 

9. Ecrire un programme en PL/SQL pour afficher la valeur d'une variable à l'intérieur et à l'extérieur d'une boucle en utilisant l'instruction LOOP WHEN. Exemple de sortie du programme:

La valeur de i à l'intérieur de la boucle est :  0
La valeur de i à l'intérieur de la boucle est :  1
La valeur de i à l'intérieur de la boucle est :  2
La valeur de i à l'intérieur de la boucle est :  3
La valeur de i à l'intérieur de la boucle est :  4
La valeur de i à l'extérieur de la boucle est :  5
DECLARE
  i NUMBER := 0;
BEGIN
  LOOP
    DBMS_OUTPUT.PUT_LINE ('La valeur de i à l\'intérieur de la boucle est: ' || TO_CHAR(i));
    i := i + 1;
    EXIT WHEN i > 4;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('La valeur de i à l\'extérieur de la boucle est: ' || TO_CHAR(i));
END;
/

Sortie:

La valeur de i à l'intérieur de la boucle est :  0
La valeur de i à l'intérieur de la boucle est :  1
La valeur de i à l'intérieur de la boucle est :  2
La valeur de i à l'intérieur de la boucle est :  3
La valeur de i à l'intérieur de la boucle est :  4
La valeur de i à l'extérieur de la boucle est :  5

 

 
 
10. Écrire un programme en PL/SQL en utilisant une boucle imbriquée avec l'instruction EXIT WHEN. Exemple de sortie du programme:
La valeur de i = 1
La valeur de k = 1
La valeur de k = 2
La valeur de k = 3
La valeur de k = 4
Sortie de la boucle intérieure
La valeur de i = 2
La valeur de k = 5
Sortie de la boucle intérieure
La valeur de i = 3
La valeur de k = 6
Sortie de la boucle intérieure
Sortie de la boucle extérieure
DECLARE
  i PLS_INTEGER := 0;
  n PLS_INTEGER := 0;
 
BEGIN
  LOOP
    i := i + 1;
    DBMS_OUTPUT.PUT_LINE ('La valeur de i = ' || i);
    
    LOOP
      k := k + 1;
      DBMS_OUTPUT.PUT_LINE ('La valeur de k = ' || k);
      EXIT WHEN (k > 3);
    END LOOP;
 
    DBMS_OUTPUT.PUT_LINE ('Sortie de la boucle intérieure');
 
    EXIT WHEN (i > 2);
  END LOOP;
 
  DBMS_OUTPUT.PUT_LINE ('Sortie de la boucle extérieure');
END;
/

Sortie:

La valeur de i = 1
La valeur de k = 1
La valeur de k = 2
La valeur de k = 3
La valeur de k = 4
Sortie de la boucle intérieure
La valeur de i = 2
La valeur de k = 5
Sortie de la boucle intérieure
La valeur de i = 3
La valeur de k = 6
Sortie de la boucle intérieure
Sortie de la boucle extérieure

 

11. Écrire un programme en PL/SQL en utilisant une boucle avec l'instruction CONTINUE. Exemple de sortie du programme:

A l'intérieur de la boucle: i = 0
A l'intérieur de la boucle: i = 1
A l'intérieur de la boucle: i = 2
A l'intérieur de la boucle: i = 3
A l'intérieur de la boucle, après CONTINUE: i = 4
A l'intérieur de la boucle: i = 4
A l'intérieur de la boucle, après CONTINUE: i = 5
A la sortie de la boucle: i = 5
DECLARE
  i NUMBER := 0;
BEGIN
  LOOP 
    DBMS_OUTPUT.PUT_LINE ('A l\'intérieur de la boucle: i = ' || TO_CHAR(i));
    i := i + 1;
    IF i < 4 THEN
      CONTINUE;
    END IF;
    DBMS_OUTPUT.PUT_LINE
      ('A l\'intérieur de la boucle, après CONTINUE: i = ' || TO_CHAR(i));
    EXIT WHEN i = 6;
  END LOOP;
 
  DBMS_OUTPUT.PUT_LINE ('A la sortie de la boucle: i = ' || TO_CHAR(i));
END;
/

Sortie:

A l'intérieur de la boucle: i = 0
A l'intérieur de la boucle: i = 1
A l'intérieur de la boucle: i = 2
A l'intérieur de la boucle: i = 3
A l'intérieur de la boucle, après CONTINUE: i = 4
A l'intérieur de la boucle: i = 4
A l'intérieur de la boucle, après CONTINUE: i = 5
A la sortie de la boucle: i = 5

 

12. Écrire un programme en PL/SQL en utilisant une boucle avec l'instruction CONTINUE WHEN. Exemple de sortie du programme:

La valeur à l'intérieur de la boucle: i = 0
La valeur à l'intérieur de la boucle: i = 1
La valeur à l'intérieur de la boucle: i = 2
La valeur à l'intérieur de la boucle: i = 3
La valeur à l'intérieur de la boucle, après CONTINUE: i = 4
La valeur à l'intérieur de la boucle: i = 4
La valeur à l'intérieur de la boucle, après CONTINUE: i = 5
La valeur après la sortie de la boucle: i = 5
DECLARE
  i NUMBER := 0;
BEGIN
  LOOP -- After CONTINUE statement, control resumes here
    DBMS_OUTPUT.PUT_LINE ('La valeur à l'intérieur de la boucle: i = ' || TO_CHAR(i));
    i := i + 1;
    CONTINUE WHEN i < 4;
    DBMS_OUTPUT.PUT_LINE
      ('La valeur à l'intérieur de la boucle, après CONTINUE: i = ' || TO_CHAR(i));
    EXIT WHEN i = 5;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE ('La valeur après la sortie de la boucle: i = ' || TO_CHAR(i));
END;
/

Sortie:

La valeur à l'intérieur de la boucle: i = 0
La valeur à l'intérieur de la boucle: i = 1
La valeur à l'intérieur de la boucle: i = 2
La valeur à l'intérieur de la boucle: i = 3
La valeur à l'intérieur de la boucle, après CONTINUE: i = 4
La valeur à l'intérieur de la boucle: i = 4
La valeur à l'intérieur de la boucle, après CONTINUE: i = 5
La valeur après la sortie de la boucle: i = 5

 

 
 
13. Ecrire un programme en PL/SQL pour afficher les premiers 8 nombres. Exemple de sortie du programme:
nbr = 8;
Les 8 premiers nombres sont:
1 2 3 4 5 6 7 8
DECLARE
  nbr NUMBER := 8;
BEGIN
 DBMS_OUTPUT.PUT_LINE ('Les '||nbr||' premiers nombres sont: ');
    FOR i IN 1..nbr LOOP
       dbms_output.put(i||'  ');
    END LOOP;
    dbms_output.new_line;
 END;
/

Sortie:

Les 8 premiers nombres sont:
1 2 3 4 5 6 7 8

 

14. Ecrire un programme en PL/SQL pour afficher les 10 premiers nombres avec une différence de 2 et commençant par 1. Exemple de sortie du programme:

nbr = 10;
Les 10 premiers nombres sont:
1 3 5 7 8 9 10
DECLARE
  nbr NUMBER:= 10;
  i NUMBER:=1;
  k NUMBER:=1;
BEGIN
 DBMS_OUTPUT.PUT_LINE ('Les '||nbr||' premiers nombres sont: ');
  DBMS_OUTPUT.PUT (i||'  ');
    FOR i IN 1..nbr-1 LOOP
	   k:=k+2;
	   dbms_output.put(k||'  ');
    END LOOP;
    dbms_output.new_line;
 END;
/

Sortie:

Les 10 premiers nombres sont:
1 3 5 7 8 9 10

 

15. Ecrire un programme en PL/SQL pour afficher les nombres premiers entre 1 et 30. Exemple de sortie du programme:

Les nombres premiers sont:
2   3   5   7   11   13   17   19   23   29
DECLARE
    i NUMBER(2);
    j NUMBER(2);
BEGIN
dbms_output.Put_line('Les nombres premiers sont:');
	dbms_output.new_line;
    i := 2;
    LOOP
        j := 2;
        LOOP
            EXIT WHEN( ( MOD(i, j) = 0 )
                        OR ( j = i ) );
            j := j + 1;
        END LOOP;
        IF( j = i )THEN
          dbms_output.Put(i||'   ');							   
        END IF;
        i := i + 1;
        exit WHEN i = 30;
    END LOOP;
	dbms_output.new_line;
END;
/

Sortie:

Les nombres premiers sont :
2   3   5   7   11   13   17   19   23   29

 

 
 
16. Écrire un programme en PL/SQL pour vérifier si un nombre est premier ou non en utilisant l'instruction goto avec la boucle for. Exemple:
nbr = 23;
23 est un nombre premier
DECLARE
  str  VARCHAR2(50);
  nbr  PLS_INTEGER := 23;
BEGIN
  FOR i in 2..ROUND(SQRT(nbr)) LOOP
    IF nbr MOD i = 0 THEN
      str := ' n\'est pas un nombre premier';
      GOTO nbr_premier;
    END IF;
  END LOOP;

  str := ' est un nombre premier';
 
  <<nbr_premier>>
  DBMS_OUTPUT.PUT_LINE(TO_CHAR(nbr) || str);
END;
/

Sortie:

23 est un nombre premier

 

17. Écrire un programme en PL/SQL pour copier les enregistrements de la table clients à une autre (tmp_clients).

Table: clients

+-----------+----------------+-------------+--------+
| client_id |       nom      |    ville    |  age   |
+-----------+----------------+-------------+--------+
|    1001   | Alex Barbara   | Paris       |  25    |
|    1002   | Lois Collins   | Lyon        |  30    |
|    1005   | Karen Farley   | Nice        |  44    |
|    1006   | Kevin Thompson | Paris       |  65    |
|    1007   | Scott Henry    | Marseille   |  32    |
|    1003   | Ellen McMullen | Montpellier |  53    |
+-----------+----------------+-------------+--------+
CREATE TABLE tmp_clients (
  client_id  NUMBER,
  nom        VARCHAR2(40),
  ville      VARCHAR2(40),
  age        NUMBER
);
 
BEGIN
	INSERT INTO tmp_clients (client_id, nom, ville, age)
	SELECT client_id, nom, ville, age
	FROM clients;
END;
/

 

 

L’article Exercices Corrigés PL/SQL: Instruction IF-THEN-ELSE est apparu en premier sur WayToLearnX.

Exercices Corrigés PL/SQL: Types de données

Par : Thomas
21 mars 2024 à 21:11

La meilleure façon d’apprendre quelque chose est de pratiquer des exercices. Nous avons préparer ces exercices corrigés pour les personnes (débutantes ou intermédiaires) qui sont familières avec PL/SQL. Nous espérons que ces exercices vous aideront à améliorer vos compétences en PL/SQL. Les exercices corrigés suivantes sont actuellement disponibles, nous travaillons dur pour ajouter plus d’exercices. Bon apprentissage!

Vous pouvez lire notre tutoriel PL/SQL avant de résoudre les exercices suivants.

 
 

Exercices corrigés PL/SQL: Types de données

1. Ecrivez un bloc PL/SQL pour apprendre à déclarer une variable de type CHAR.

DECLARE
  str VARCHAR2(10);
BEGIN
  str := 'hello';
END;
/

 

2.Écrire un bloc PL/SQL pour insérer des données dans une table en utilisant une variable de type CHAR.

CREATE TABLE exemple (colonne1 CHAR(6));
 
DECLARE
  str VARCHAR2(6) := 'hello';
BEGIN
  INSERT INTO exemple(colonne1) VALUES(str);
END;
/

 

3. Écrire un bloc PL/SQL pour différencier les types CHAR et VARCHAR2.

La différence entre un CHAR et un VARCHAR est qu’un CHAR(n) aura TOUJOURS une longueur de N octets. Par contre, un VARCHAR2(n) aura une longueur comprise entre 1 et N octets et ne sera PAS rempli par des espaces vides.

DECLARE
  nom1  CHAR(15);
  nom2   VARCHAR2(15);
BEGIN
  nom1 := 'Alex  ';
  nom2  := 'Bob  ';
 
  DBMS_OUTPUT.PUT_LINE('*' || nom1 || '*');
  DBMS_OUTPUT.PUT_LINE('*' || nom2 || '*');
END;
/

Sortie:

*Alex          *
*Bob  *

 

4. Écrire une procédure PL/SQL qui accepte un paramètre BOOLEAN et utilise l’instruction CASE pour afficher « ERROR » si la valeur du paramètre est NULL, « Oui » si elle est TRUE et « Non » si elle est FALSE.

CREATE PROCEDURE check_bool (b BOOLEAN) AUTHID DEFINER
AS
BEGIN
  DBMS_OUTPUT.put_line (
    CASE
      WHEN b IS NULL THEN 'ERROR'
      WHEN b THEN 'OUI'
      WHEN NOT b THEN 'NON'
    END
  );
END;
/

BEGIN
  check_bool(NULL);
  check_bool(FALSE);
  check_bool(TRUE);
END;
/

Sortie:

ERROR
OUI
NON

 

 

L’article Exercices Corrigés PL/SQL: Types de données est apparu en premier sur WayToLearnX.

Exercices Corrigés PL/SQL: Fonctions de chaînes de caractères

Par : Thomas
23 mars 2024 à 02:52

La meilleure façon d’apprendre quelque chose est de pratiquer des exercices. Nous avons préparer ces exercices corrigés pour les personnes (débutantes ou intermédiaires) qui sont familières avec PL/SQL. Nous espérons que ces exercices vous aideront à améliorer vos compétences en PL/SQL. Les exercices corrigés suivantes sont actuellement disponibles, nous travaillons dur pour ajouter plus d’exercices. Bon apprentissage!

Vous pouvez lire notre tutoriel PL/SQL avant de résoudre les exercices suivants.

 
 

Exercices corrigés PL/SQL: Fonctions de chaînes de caractères

1. Écrire un bloc PL/SQL pour calculer la longueur du nom de chaque employé dans la table employees.

Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE
str_size NUMBER;
BEGIN
  FOR e IN (SELECT nom FROM employees) LOOP
    str_size := LENGTH(e.nom);
    DBMS_OUTPUT.PUT_LINE('Longueur du nom ' || e.nom || ': ' || str_size);
  END LOOP;
END;
/

Sortie:

Longueur du nom Eddie        : 5
Longueur du nom Eleanor      : 7
Longueur du nom Glen         : 4
Longueur du nom Ali          : 3
Longueur du nom Earl         : 4
Longueur du nom Bryan        : 5

 

2. Écrire un bloc PL/SQL pour concaténer le prénom et le nom de chaque employé et afficher le nom complet.

Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE
prenom_nom VARCHAR2(100);
BEGIN
  FOR e IN (SELECT prenom, nom FROM employees) LOOP
    prenom_nom := e.prenom || ' ' || e.nom;
    DBMS_OUTPUT.PUT_LINE('Le nom complet: ' || prenom_nom);
  END LOOP;
END;
/

Sortie:

Le nom complet: Parker Eddie
Le nom complet: Deas Eleanor
Le nom complet: Powell Glen
Le nom complet: Fawaz Ali
Le nom complet: Horn Earl
Le nom complet: Savoy Bryan

 

3. Ecrivez un bloc PL/SQL pour trouver la position de la première occurrence de la lettre ‘a’ dans le nom de chaque employé.

Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE
pos NUMBER;
BEGIN
  FOR e IN (SELECT nom FROM employees) LOOP
    pos := INSTR(e.nom, 'a');
    DBMS_OUTPUT.PUT_LINE('Position du "a" dans ' || e.nom || ': ' || pos);
  END LOOP;
END;
/

Sortie:

Position du "a" dans Eddie: 0
Position du "a" dans Eleanor: 4
Position du "a" dans Glen: 0
Position du "a" dans Ali: 1
Position du "a" dans Earl: 2
Position du "a" dans Bryan: 4

 

 
 
4. Écrire un bloc PL/SQL pour récupérer les 3 premiers caractères du nom de chaque employé.
Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE
soustr VARCHAR2(3);
BEGIN
  FOR e IN (SELECT nom FROM employees) LOOP
    soustr := SUBSTR(e.nom, 1, 3);
    DBMS_OUTPUT.PUT_LINE('Les trois premiers caractères du nom ' || e.nom || ': ' || soustr);
  END LOOP;
END;
/

Sortie:

Les trois premiers caractères du nom Eddie: Edd
Les trois premiers caractères du nom Eleanor: Ele
Les trois premiers caractères du nom Glen: Gle
Les trois premiers caractères du nom Ali: Ali
Les trois premiers caractères du nom Earl: Ear
Les trois premiers caractères du nom Bryan: Bry

 

5. Écrire un bloc PL/SQL pour convertir le nom de chaque employé en minuscules et afficher le résultat.

Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE
minus VARCHAR2(50);
BEGIN
  FOR e IN (SELECT nom FROM employees) LOOP
    minus := LOWER(e.nom);
    DBMS_OUTPUT.PUT_LINE('Nom en minuscules: ' || e.nom || ': ' || minus);
  END LOOP;
END;
/

Sortie:

Nom en minuscules Eddie: eddie
Nom en minuscules Eleanor: eleanor
Nom en minuscules Glen: glen
Nom en minuscules Ali: ali
Nom en minuscules Earl: earl
Nom en minuscules Bryan: bryan

 

 
 
6. Écrire un bloc PL/SQL pour remplacer la ville ‘Paris’ de chaque client en ‘Île-de-France’ et afficher le résultat.
Table: clients

+-----------+----------------+-------------+--------+
| client_id |       nom      |    ville    |  age   |
+-----------+----------------+-------------+--------+
|    1001   | Alex Barbara   | Paris       |  25    |
|    1002   | Lois Collins   | Lyon        |  30    |
|    1005   | Karen Farley   | Nice        |  44    |
|    1006   | Kevin Thompson | Paris       |  65    |
|    1007   | Scott Henry    | Marseille   |  32    |
|    1003   | Ellen McMullen | Montpellier |  53    |
+-----------+----------------+-------------+--------+
DECLARE
v_old VARCHAR2(50);
v_new VARCHAR2(50);
ville_client clients.ville%TYPE;
BEGIN
v_old := 'Paris';
v_new := 'Ile-de-France';
  FOR c IN (SELECT ville FROM clients) LOOP
    ville_client := REPLACE(c.ville, v_old, v_new);
    DBMS_OUTPUT.PUT_LINE('Ville mis à jour: ' || ville_client);
  END LOOP;
END;

Sortie:

Ville mis à jour: Ile-de-France
Ville mis à jour: Lyon
Ville mis à jour: Nice
Ville mis à jour: Ile-de-France
Ville mis à jour: Marseille
Ville mis à jour: Montpellier

 

7. Écrire un bloc PL/SQL qui supprime les zéros de début et de fin dans une chaîne de caractères. Affichez la chaîne de caractères. Exemple:

str = "0000hello world!0000";
hello world!
DECLARE
str VARCHAR2(50);
res VARCHAR2(50);
BEGIN
  str := '0000hello world!0000';
  res := TRIM('0' FROM str);
  DBMS_OUTPUT.PUT_LINE(res);
END;

Sortie:

hello world!

 

 
 
8. Écrire un bloc PL/SQL pour convertir le nom de chaque employé en majuscules et afficher le résultat.
Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE
maj VARCHAR2(50);
BEGIN
  FOR e IN (SELECT nom FROM employees) LOOP
    maj := UPPER(e.nom);
    DBMS_OUTPUT.PUT_LINE('Nom en majuscules: ' || e.nom || ': ' || maj);
  END LOOP;
END;
/

Sortie:

Nom en majuscules Eddie: EDDIE
Nom en majuscules Eleanor: ELEANOR
Nom en majuscules Glen: GLEN
Nom en majuscules Ali: ALI
Nom en majuscules Earl: EARL
Nom en majuscules Bryan: BRYAN

 

 

L’article Exercices Corrigés PL/SQL: Fonctions de chaînes de caractères est apparu en premier sur WayToLearnX.

Exercices Corrigés PL/SQL: Curseurs

Par : Thomas
23 mars 2024 à 20:07

La meilleure façon d’apprendre quelque chose est de pratiquer des exercices. Nous avons préparer ces exercices corrigés pour les personnes (débutantes ou intermédiaires) qui sont familières avec PL/SQL. Nous espérons que ces exercices vous aideront à améliorer vos compétences en PL/SQL. Les exercices corrigés suivantes sont actuellement disponibles, nous travaillons dur pour ajouter plus d’exercices. Bon apprentissage!

Vous pouvez lire notre tutoriel PL/SQL avant de résoudre les exercices suivants.

 
 

Exercices corrigés PL/SQL: Curseurs

1. Écrire un programme PL/SQL pour afficher les noms de tous les pays.

Table: pays

+---------+------------+
| pays_id |    nom     |
+---------+------------+
|  1001   | Angola     |
|  1002   | Australia  |
|  1005   | Albania    |
|  1006   | Bangladesh |
|  1007   | Andorra    |
|  1003   | Bolivia    |
+---------+------------+
DECLARE
  nom_pays pays.nom%TYPE;
  CURSOR c_pays IS SELECT nom FROM pays;
BEGIN
  OPEN c_pays;
  FETCH c_pays INTO nom_pays;
  WHILE c_pays%FOUND LOOP
    DBMS_OUTPUT.PUT_LINE(nom_pays);
    FETCH c_pays INTO nom_pays;
  END LOOP;
  CLOSE c_pays;
END;

Sortie:

Angola
Australia
Albania
Bangladesh
Andorra
Bolivia

 

2. Écrire un programme PL/SQL pour afficher les noms de tous les clients.

Table: clients

+-----------+----------------+-------------+--------+----------------+
| client_id |     nom_cl     |    ville    |  age   | fournisseur_id |
+-----------+----------------+-------------+--------+----------------+
|    1001   | Alex Barbara   | Paris       |  25    |      6001      |
|    1002   | Lois Collins   | Lyon        |  30    |      6001      |
|    1005   | Karen Farley   | Nice        |  44    |      6002      |
|    1006   | Kevin Thompson | Paris       |  65    |      6003      |
|    1007   | Scott Henry    | Marseille   |  32    |      6006      |
|    1003   | Ellen McMullen | Montpellier |  53    |      6001      |
+-----------+----------------+-------------+--------+----------------+
DECLARE
  nom_client clients.nom_cl%TYPE;
  CURSOR c_clients IS SELECT nom_cl FROM clients;
BEGIN
  OPEN c_clients;
  FETCH c_clients INTO nom_client;
  WHILE c_clients%FOUND LOOP
    DBMS_OUTPUT.PUT_LINE(nom_client);
    FETCH c_clients INTO nom_client;
  END LOOP;
  CLOSE c_clients;
END;

Sortie:

Alex Barbara
Lois Collins
Karen Farley
Kevin Thompson
Scott Henry
Ellen McMullen

 

3. Écrire un programme PL/SQL pour afficher les identifiants des pays et les noms de tous les pays avec le titre approprié.

Table: pays

+---------+------------+
| pays_id |    nom     |
+---------+------------+
|  1001   | Angola     |
|  1002   | Australia  |
|  1005   | Albania    |
|  1006   | Bangladesh |
|  1007   | Andorra    |
|  1003   | Bolivia    |
+---------+------------+
DECLARE
p_id pays.pays_id%TYPE;
p_nom pays.nom%TYPE;
  CURSOR c_pays IS SELECT pays_id, nom FROM pays;
BEGIN
  DBMS_OUTPUT.PUT_LINE('   ID   |    Nom    ');
  DBMS_OUTPUT.PUT_LINE('--------------------');
  OPEN c_pays;
  FETCH c_pays INTO p_id, p_nom;
  WHILE c_pays%FOUND LOOP
    DBMS_OUTPUT.PUT_LINE(p_id || '  |  ' || p_nom);
    FETCH c_pays INTO p_id, p_nom;
  END LOOP;
  CLOSE c_pays;
END;
/

Sortie:

   ID   |    Nom    
--------------------
1001    |   Angola
1002    |   Australia
1005    |   Albania
1006    |   Bangladesh
1007    |   Andorra
1003    |   Bolivia

 

 
 
4. Écrire un programme PL/SQL pour afficher les identifiants, noms, prénoms et les noms de départements de tous les employés.
Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 1              |
| 1002 | Eleanor | Deas     | 4500.00  | 2              |
| 1003 | Glen    | Powell   | 5000.00  | 3              |
| 1004 | Ali     | Fawaz    | 7800.00  | 4              |
| 1005 | Earl    | Horn     | 9000.00  | 5              |
| 1006 | Bryan   | Savoy    | 8000.00  | 6              |
+------+---------+----------+----------+----------------+
Table: departements

+---------+----------------+
| dep_id  |       nom      |
+---------+----------------+
|  1      | Marketing      |
|  2      | Finance        |
|  3      | HR             |
|  4      | Informatique   |
|  5      | Expéditions    |
|  6      | Administration |
+---------+----------------+
DECLARE
id_emp employees.id%TYPE;
nom_emp employees.nom%TYPE;
pren_emp employees.prenom%TYPE;
nom_dep departements.nom%TYPE;
  CURSOR emp_cursor IS
    SELECT emp.id, emp.nom, emp.prenom, dep.dep_id
    FROM employees emp
    JOIN departements dep ON emp.department_id = dep.dep_id;
BEGIN
  OPEN emp_cursor;
  FETCH emp_cursor INTO id_emp, pren_emp, nom_emp, nom_dep;
  WHILE emp_cursor%FOUND LOOP
    DBMS_OUTPUT.PUT_LINE('ID de l\'employé: ' || id_emp);
    DBMS_OUTPUT.PUT_LINE('Prénom de l\'employé: ' || pren_emp);
    DBMS_OUTPUT.PUT_LINE('Nom de l\'employé: ' || nom_emp);
    DBMS_OUTPUT.PUT_LINE('Nom du département: ' || nom_dep);
    DBMS_OUTPUT.PUT_LINE('--------------------------------');
    FETCH emp_cursor INTO id_emp, pren_emp, nom_emp, nom_dep;
  END LOOP;
  CLOSE emp_cursor;
END;

Sortie:

ID de l'employé: 1001
Prénom de l'employé: Parker
Nom de l'employé : Eddie
Nom du département : Marketing
--------------------------------
ID de l'employé: 1002
Prénom de l'employé: Deas
Nom de l'employé : Eleanor
Nom du département : Finance
--------------------------------
ID de l'employé: 1003
Prénom de l'employé: Powell
Nom de l'employé : Glen
Nom du département : HR
--------------------------------
... etc.

 

5. Écrire un programme en PL/SQL pour trouver le nombre de lignes affectées par l’utilisation de l’attribut SQL%ROWCOUNT d’un curseur implicite.

Table: pays

+---------+------------+
| pays_id |    nom     |
+---------+------------+
|  1001   | Angola     |
|  1002   | Australia  |
|  1005   | Albania    |
|  1006   | Bangladesh |
|  1007   | Andorra    |
|  1003   | Bolivia    |
+---------+------------+
BEGIN
    UPDATE pays
    SET    nom = 'PAYS'
    WHERE  nom LIKE 'A%';

    dbms_output.Put_line('Nombre d\'enregistrements mis à jour: '||To_char(SQL%rowcount));
END;
/ 

Sortie:

Nombre d'enregistrements mis à jour: 4

 

 
 
6. Écrire un programme en PL/SQL pour montrer l’utilisation de SQL%FOUND afin de déterminer si l’instruction DELETE a affecté des lignes.
Table: pays

+---------+------------+
| pays_id |    nom     |
+---------+------------+
|  1001   | Angola     |
|  1002   | Australia  |
|  1005   | Albania    |
|  1006   | Bangladesh |
|  1007   | Andorra    |
|  1003   | Bolivia    |
+---------+------------+
CREATE OR REPLACE PROCEDURE delete_pays (
  p_pays_id NUMBER
) AUTHID DEFINER AS
BEGIN
  DELETE FROM pays
  WHERE pays_id = p_pays_id;
 
  IF SQL%FOUND THEN
    DBMS_OUTPUT.PUT_LINE (
      'Suppression réussie pour pays_id: ' || p_pays_id
    );
  ELSE
    DBMS_OUTPUT.PUT_LINE ('Aucun pays de l\'ID '||p_pays_id||' n\'est trouvé.');
  END IF;
END;
/
BEGIN
  delete_pays(1001);
  delete_pays(9999);
END;
/

Sortie:

Suppression réussie pour pays_id: 1001
Aucun employé de l'ID 9999 n'a été trouvé.

 

7. Écrire un programme en PL/SQL pour montrer l’utilisation de SQL%NOTFOUND afin de déterminer si l’instruction UPDATE a affecté des lignes.

Table: pays

+---------+------------+
| pays_id |    nom     |
+---------+------------+
|  1001   | Angola     |
|  1002   | Australia  |
|  1005   | Albania    |
|  1006   | Bangladesh |
|  1007   | Andorra    |
|  1003   | Bolivia    |
+---------+------------+
DECLARE
	p_pays_id NUMBER := 1001;
BEGIN
    UPDATE pays
    SET    nom = 'PAYS'
    WHERE pays_id = p_pays_id;
 
  IF SQL%NOTFOUND THEN
      DBMS_OUTPUT.PUT_LINE ('Aucun pays de l\'ID '||p_pays_id||' n\'est trouvé.');
  ELSE
    DBMS_OUTPUT.PUT_LINE (
      'Mise à jour réussie pour pays_id: ' || p_pays_id
    );
  END IF;
END;
/

Sortie:

Mise à jour réussie pour pays_id: 1001

 

 
 
8. Écrire un programme en PL/SQL pour afficher les informations détaillées de l’employé de l’ID 1001 à partir de la table employees.
Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE 
    r_emp employees%ROWTYPE; 
BEGIN 
    SELECT * 
    INTO   r_emp
    FROM   employees 
    WHERE  id = 1001; 

    dbms_output.Put_line('Employé ID:'||r_emp.id||'  Nom: '||r_emp.prenom||' '||r_emp.nom||'  Salaire:  '||r_emp.salaire); 
END; 
/

Sortie:

Employé :  ID:1001    Nom : Parker Eddie   Salaire : 6000.00

 

9. Ecrire un programme en PL/SQL pour afficher les détails des employés de la table employés à l’aide d’un curseur.

Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE 
    CURSOR c_emp IS 
      SELECT *
      FROM   employees; 
    r_emp c_emp%ROWTYPE; 
BEGIN 
    OPEN c_emp; 

    LOOP 
        FETCH c_emp INTO r_emp; 

        EXIT WHEN c_emp%NOTFOUND; 

        dbms_output.Put_line('Employé ID:'||r_emp.id||'  Nom: '||r_emp.prenom||' '||r_emp.nom||'  Salaire:  '||r_emp.salaire);
    END LOOP; 

    dbms_output.Put_line('Nombre total de lignes: '||c_emp%rowcount); 

    CLOSE c_emp; 
END;
/

Sortie:

Employé :  ID:1001    Nom : Parker Eddie   Salaire : 6000.00
Employé :  ID:1002    Nom : Deas Eleanor   Salaire : 4500.00
Employé :  ID:1003    Nom : Powell Glen   Salaire : 5000.00
.......

 

 
 
10. Créer un bloc PL/SQL pour augmenter le salaire des employés du département 8 par 100$ si le salaire est inférieure à 5000.00$ sinon augmentez-le par 50$ en utilisant la clause WHERE CURRENT OF.
Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
Table: departements

+---------+----------------+
| dep_id  |       nom      |
+---------+----------------+
|  1      | Marketing      |
|  2      | Finance        |
|  3      | HR             |
|  4      | Informatique   |
|  5      | Expéditions    |
|  6      | Administration |
+---------+----------------+
DECLARE
    CURSOR emp_cur IS
      SELECT id,
             salaire
      FROM   employees
      WHERE  dep_id = 8
      FOR UPDATE;
    augmentation_sal NUMBER;
BEGIN
    FOR emp IN emp_cur LOOP
        IF emp.salaire < 5000 THEN
          augmentation_sal := 100;
        ELSE
          augmentation_sal := 50;
        END IF;

        UPDATE employees
        SET    salaire = salaire + augmentation_sal
        WHERE  CURRENT OF emp_cur;
    END LOOP;
END;
/

 

11. Ecrire un programme en PL/SQL pour afficher le nom de l'employé avec l'id 1006 à l'aide d'un curseur.

Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE
  nom_emp VARCHAR2(50);
  CURSOR cur_emp IS
    SELECT nom
    FROM   employees
    WHERE  id = 1006;

BEGIN
  OPEN cur_emp;
  FETCH cur_emp
  INTO  nom_emp;
  
  dbms_output.put_line('Le nom de l\'employé est:’|| nom_emp);
  CLOSE cur_emp;
END;
/

Sortie:

Le nom de l'employé est: Bryan

 

 
 
12. Ecrire un programme en PL/SQL pour afficher le nom de tous les employés à l'aide d'un curseur.
Table: employees

+------+---------+----------+----------+----------------+
|  id  |   nom   |  prenom  | salaire  | departement_id |
+------+---------+----------+----------+----------------+
| 1001 | Eddie   | Parker   | 6000.00  | 8              |
| 1002 | Eleanor | Deas     | 4500.00  | 8              |
| 1003 | Glen    | Powell   | 5000.00  | 6              |
| 1004 | Ali     | Fawaz    | 7800.00  | 2              |
| 1005 | Earl    | Horn     | 9000.00  | 9              |
| 1006 | Bryan   | Savoy    | 8000.00  | 3              |
+------+---------+----------+----------+----------------+
DECLARE
  nom_emp VARCHAR2(20);
  CURSOR cur_emp IS
    SELECT nom
    FROM   employees;

BEGIN
  OPEN cur_emp;
  LOOP
    FETCH cur_emp
    INTO  nom_emp;
    EXIT
  WHEN cur_emp%NOTFOUND;
    dbms_output.put_line('Le nom de l\'employé est:’|| nom_emp);
  END LOOP;
  CLOSE cur_emp;
END;
/

Sortie:

Le nom de l'employé est: Eddie
Le nom de l'employé est: Eleanor
Le nom de l'employé est: Glen
Le nom de l'employé est: Ali
Le nom de l'employé est: Earl
Le nom de l'employé est: Bryan

 

 

L’article Exercices Corrigés PL/SQL: Curseurs est apparu en premier sur WayToLearnX.

❌
❌