Introduction PL/SQL

Divers Ajouter un commentaire

PL/SQL est un langage qui intègre SQL et permet de programmer de manière procédurale. Il est spécifique ? Oracle. Pour SQL Server il existe par exemple un équivallent : TRANSAC SQL

Globalement, avec PL/SQL on aura ? notre disposition un vrai langage de programmation moins intuitif mais aussi plus puissant que le SQL. Les 2 langages sont éminemment complémentaires.

Les principaux avantages / inconvénients sont les suivants :
- ne dispense pas de connaître le SQL,
- permet le traitement par bloc de SQL et donc optimise le trafic réseau,
- l’utilisation de variable de stockage et de type simple et strucuré dynamique (%TYPE, %ROWTYPE, etc)
- des traitements plus complexes, notamment pour la gestion des cas particuliers et des erreurs (traitement des exceptions),
- l’utilisation de librairies standards prédéfinies (supplied PLSQL packages, comme les RDBMS_xxx),
- un paramétrage et la création d’ordres SQL dynamiques.

Le PL/SQL peut être utilisé sous 3 formes :

* un bloc de code, executé comme une commande SQL, viua un interpréteur standard (SQL+ ou iSQL*PLus)
* un fichier de commande PL/SQL
* un programme stocké (procédure, fonction, package ou trigger)

ordres SQL supportés dans PL/SQL

Les instructions du langage de manipulation de données (LMD) et certaines instructions de gestion de transaction, ? savoir :
- INSERT, UPDATE, DELETE, SELECT,
- COMMIT, ROLLBACK, SAVEPOINT,
- LOCK TABLE,
- SET TRANSACTION READ ONLY.
Avec les versions antérieures ? la 9i, Les ordres du LDD ne sont pas supportés par défaut il faut utiliser un package spécial comme dans le script suivant.

Autres composants du langage PL/SQL

Les principales autres instructions (non SQL) du PL/SQL sont les suivantes :
CLOSE, EXECUTE IMMEDIATE, FETCH, FORALL, GOTO, IF, LOOP, NULL, OPEN, FOR, RAISE, RETURN

A cela s’ajoute les opérateurs :
d’affectation : ‘:=’, ‘(SELECT) INTO’ et ‘(FETCH) INTO’
+ les opérateurs classqiues du SQL : ||, >, >, >=, <=, <>, !=, …

La liste des mots réservés PL/SQL est disponible ici,
http://didier.deleglise.free.fr/plsql/plsql_mots_reserves.pdf…au format PDF.


Blocs et sections PL/SQL

Les blocs de code s’appellent également des blocs anonymes.
Ils commenceront simplement par un ‘BEGIN’ ou un ‘DECLARE’.
Ils sont composés de 1 ? 3 sections :
Type de section obligatoire ? Mots clés
section déclarative non DECLARE…
section exécutable oui BEGIN …END;
section de traitement des exceptions non EXCEPTION

la section ‘exception’ quand elle est présente est incluse dans la section exécutable et NON PAS ? la suite de celle ci.

(DD is proud to announce…)le plus petit bloc PL/SQL au monde:

SQL> BEGIN
NULL;
END;
.
/
Procedure PL/SQL terminee avec succes.

le bloc ne peut pas être vide et doit contenir au moins une instruction…le ‘.’ sous SQL*PLus sert a arrêter la saisie du code PL/SQL et le ‘/’ comme toujours ? executer le contenu du buffer de commande courant.

avec une déclaration de variable un (tout petit) bloc PL/SQL ca donne ça :

SQL> DECLARE x INTEGER;
BEGIN
X := 1;
END;
.
Procedure PL/SQL terminee avec succes.

un bloc avec des exceptions a donc la structure suivante :

DECLARE — mes déclarations de variables…
BEGIN — début de la section executable
– mes ordres SQL et PLSQL
EXCEPTION
– mon traitement des exceptions
END; — la fin du bloc executable

Gestion des exceptions

Les exceptions peuvent se déclencher automatiquement en cas d’erreur système ou de pb réseau par exemple, ou explicitement avec l’instruction ‘RAISE’

Il existe des exception prédéfinies, des exceptions génériques et des exceptions définies par l’utilisateur.

exemple :

DECLARE S VARCHAR(15);
BEGIN
S := ‘Salut’;
DBMS_OUTPUT.PUT_LINE(S||’ les gars’);
EXCEPTION
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(’On a une exception générique ici’);
END;

WHEN OTHERS permet de gérer toutes les exceptions qui ne sont pas prédéfinies dans Oracle.
De manière classique en utilisant le SQLCODE (le code de retour donnant le no de l’erreur Oracle survenue)


EXCEPTION
— pb de connexion, une exception prédéfinie
WHEN LOGIN_DENIED Then

— dans tous les autres cas…
WHEN OTHERS THEN
If SQLCODE = … Then …
Elsif SQLCODE = … Then …

End if ;
END;

Voici la liste de ces dernières :

Nom exception Code Erreur
———————— ———–
ACCESS_INTO_NULL ORA-06530
CASE_NOT_FOUND ORA-06592
COLLECTION_IS_NULL ORA-06531
CURSOR_ALREADY_OPEN ORA-06511
DUP_VAL_ON_INDEX ORA-00001
INVALID_CURSOR ORA-01001
INVALID_NUMBER ORA-01722
LOGIN_DENIED ORA-01017
NO_DATA_FOUND ORA-01403
NOT_LOGGED_ON ORA-01012
PROGRAM_ERROR ORA-06501
ROWTYPE_MISMATCH ORA-06504
SELF_IS_NULL ORA-30625
STORAGE_ERROR ORA-06500
SUBSCRIPT_BEYOND_COUNT ORA-06533
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532
SYS_INVALID_ROWID ORA-01410
TIMEOUT_ON_RESOURCE ORA-00051
TOO_MANY_ROWS ORA-01422
VALUE_ERROR ORA-06502
ZERO_DIVIDE ORA-01476

NO_DATA_FOUND est fréquemment utilisée dans les programmes, lorsqu’on veut finir une boucle de lecture de lignes par exemple.
LOGIN_DENIED également, acr les pbs de connexions sont en pratique assez nombreux.

Faire un commentaire