Débuter avec plsql

Bonjour le monde

set serveroutput on

DECLARE
   message constant varchar2(32767):= 'Hello, World!';
BEGIN
   dbms_output.put_line(message);
END;
/

La commande set serveroutput on est requise dans les clients SQL*Plus et SQL Developer pour activer la sortie de dbms_output. Sans la commande, rien ne s’affiche.

La ligne end; signale la fin du bloc PL/SQL anonyme. Pour exécuter le code à partir de la ligne de commande SQL, vous devrez peut-être taper / au début de la première ligne vide après la dernière ligne du code. Lorsque le code ci-dessus est exécuté à l’invite SQL, il produit le résultat suivant :

Hello, World!

PL/SQL procedure successfully completed.

Définition de PLSQL

PL/SQL (Procedural Language/Structured Query Language) est l’extension procédurale d’Oracle Corporation pour SQL et la base de données relationnelle Oracle. PL/SQL est disponible dans Oracle Database (depuis la version 7), la base de données en mémoire TimesTen (depuis la version 11.2.1) et IBM DB2 (depuis la version 9.7).

L’unité de base en PL/SQL est appelée un bloc, composé de trois parties : une partie déclarative, une partie exécutable et une partie de création d’exceptions.

DECLARE
   <declarations section>
BEGIN
   <executable command(s)>
EXCEPTION
   <exception handling>
END;

Déclarations - Cette section commence par le mot clé DECLARE. C’est une section facultative qui définit toutes les variables, curseurs, sous-programmes et autres éléments à utiliser dans le programme.

Commandes exécutables - Cette section est comprise entre les mots-clés BEGIN et END et c’est une section obligatoire. Il se compose des instructions PL/SQL exécutables du programme. Il doit avoir au moins une ligne de code exécutable, qui peut être juste une commande NULL pour indiquer que rien ne doit être exécuté.

Gestion des exceptions : cette section commence par le mot clé EXCEPTION. Cette section est à nouveau facultative et contient des exceptions qui gèrent les erreurs dans le programme.

Chaque instruction PL/SQL se termine par un point-virgule (;). Les blocs PL/SQL peuvent être imbriqués dans d’autres blocs PL/SQL à l’aide de BEGIN et END.

Dans un bloc anonyme, seule la partie exécutable du bloc est requise, les autres parties ne sont pas nécessaires. Vous trouverez ci-dessous un exemple de code anonyme simple, qui ne fait rien d’autre que fonctionner sans rapport d’erreur.

BEGIN
    NULL;
END;
/ 

L’instruction exécutable manquante entraîne une erreur, car PL/SQL ne prend pas en charge les blocs vides. Par exemple, l’exécution du code ci-dessous conduit à une erreur :

BEGIN
END;
/ 

L’application générera une erreur :

END;
*
ERROR at line 2:
ORA-06550: line 2, column 1:
PLS-00103: Encountered the symbol "END" when expecting one of the following:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge

Symbole " * " dans la ligne sous le mot-clé “END ;” signifie que le bloc qui se termine par ce bloc est vide ou mal construit. Chaque bloc d’exécution a besoin d’instructions à exécuter, même s’il ne fait rien, comme dans notre exemple.

Différence entre %TYPE et %ROWTYPE.

%TYPE : utilisé pour déclarer un champ avec le même type que celui de la colonne d’une table spécifiée.

DECLARE
        vEmployeeName   Employee.Name%TYPE;
BEGIN
        SELECT Name 
        INTO   vEmployeeName
        FROM   Employee
        WHERE  RowNum = 1;
        
        DBMS_OUTPUT.PUT_LINE(vEmployeeName);
END;
/

%ROWTYPE : utilisé pour déclarer un enregistrement avec les mêmes types que ceux trouvés dans la table, la vue ou le curseur spécifié (= plusieurs colonnes).

DECLARE
        rEmployee     Employee%ROWTYPE;
BEGIN
        rEmployee.Name := 'Matt';
        rEmployee.Age := 31;
        
        DBMS_OUTPUT.PUT_LINE(rEmployee.Name);
        DBMS_OUTPUT.PUT_LINE(rEmployee.Age);
END;
/

À propos de PLSQL

PL/SQL signifie extensions de langage procédural à SQL. PL/SQL n’est disponible qu’en tant que “technologie habilitante” dans d’autres produits logiciels ; il n’existe pas en tant que langage autonome. Vous pouvez utiliser PL/SQL dans la base de données relationnelle Oracle, dans le serveur Oracle et dans les outils de développement d’applications côté client, tels qu’Oracle Forms. Voici quelques façons d’utiliser PL/SQL :

  1. Pour construire des procédures stockées. .
  2. Pour créer des déclencheurs de base de données.
  3. Pour implémenter la logique côté client dans votre application Oracle Forms.
  4. Pour lier une page d’accueil du World Wide Web à une base de données Oracle.

Créer ou remplacer une vue

Dans cet exemple, nous allons créer une vue.
Une vue est principalement utilisée comme un moyen simple de récupérer des données à partir de plusieurs tables.

Exemple 1 :
Voir avec une sélection sur une table.

CREATE OR REPLACE VIEW LessonView AS
       SELECT     L.*
       FROM       Lesson L;

Exemple 2 :
Afficher avec une sélection sur plusieurs tables.

CREATE OR REPLACE VIEW ClassRoomLessonView AS
       SELECT     C.Id, 
                  C.Name, 
                  L.Subject, 
                  L.Teacher 
       FROM       ClassRoom C, 
                  Lesson L 
       WHERE      C.Id = L.ClassRoomId;

Pour appeler ces vues dans une requête, vous pouvez utiliser une instruction select.

SELECT * FROM LessonView;
SELECT * FROM ClassRoomLessonView;

Créer un tableau

Ci-dessous, nous allons créer un tableau avec 3 colonnes.
La colonne Id doit être remplie, nous la définissons donc NOT NULL.
Dans la colonne “Contrat”, nous ajoutons également une coche afin que la seule valeur autorisée soit “Y” ou “N”. Si une insertion est terminée et que cette colonne n’est pas spécifiée lors de l’insertion, un ‘N’ est inséré par défaut.

CREATE TABLE Employee (
        Id            NUMBER NOT NULL,
        Name          VARCHAR2(60),
        Contract      CHAR DEFAULT 'N' NOT NULL,
        ---
        CONSTRAINT p_Id PRIMARY KEY(Id),
        CONSTRAINT c_Contract CHECK (Contract IN('Y','N'))
);