SlideShare une entreprise Scribd logo
Le SQL procédural d’Oracle
 Faire cohabiter des structures de contrôle (si, pour et tant que) avec des
instructions SQL (principalement SELECT, INSERT, UPDATE et DELETE).
 Eviter les encombrements reseau : En effet, un bloc PL/SQL donne lieu à
un seul échange entre le client et le serveur
 La modularité (un bloc d’instruction peut être composé d’un autre, etc.) :
un bloc peut être nommé pour devenir une procédure ou une fonction
cataloguée, donc réutilisable. Une procédure, ou fonction, cataloguée
peut être incluse dans un paquetage (package) pour mieux contrôler et
réutiliser ces composants logiciels.
 La portabilité : un programme PL/SQL est indépendant du système
d’exploitation qui héberge le serveur Oracle. En changeant de système,
les applicatifs n’ont pas à être modifiés.
 L’intégration avec les données des tables : on retrouvera avec PL/SQL
tous les types de données et instructions disponibles sous SQL, et des
mécanismes pour parcourir des résultats de requêtes (curseurs), pour
traiter des erreurs (exceptions), pour manipuler des données complexes
(paquetages DBMS_xxx) et pour programmer des transactions (COMMIT,
ROLLBACK, SAVEPOINT).
 un bloc de code, executé comme une
commande SQL, via un interpréteur standard
(SQL+ ou iSQL*PLus)
 un fichier de commande PL/SQL
 un programme stocké (procédure, fonction,
package ou trigger)
identificateur [CONSTANT] typeDeDonnée [NOT NULL]
[:= | DEFAULT expression];
 CONSTANT précise qu’il s’agit d’une constante ;
 NOT NULL pose une contrainte en ligne sur la variable ;
 DEFAULT permet d’initialiser la variable (équivaut à l’affectation :=).
c_pi CONSTANT NUMBER := 3.14159;
v_rayon NUMBER DEFAULT 1.5;
v_aire NUMBER := c_pi * v_rayon**2;
v_trouvé BOOLEAN NOT NULL := TRUE;
VALUE_ERROR
 l’affectation comme on la connaît dans les langages de programmation
(variable := expression) ;
 par la directive DEFAULT ;
 par la directive INTO d’une requête (SELECT … INTO variable FROM …).
 Variables %TYPE
 Variables %ROWTYPE
 TYPE RECORD DECLARE
v_cat Produit.categorie%TYPE;
r_prod Produit%ROWTYPE;
BEGIN
SELECT * INTO r_prod FROM
produit WHERE refProd=5;
v_cat=r_prod.categorie;
r_prod.nom=‘nouvp’;
insert into produit values r_prod;
…
TYPE nomRecord IS RECORD
( nomChamp typeDonnées [[NOT NULL] {:= | DEFAULT} expression]
[,nomChamp typeDonnées… ]… );
 Type TABLE
TYPE nomTypeTableau IS TABLE OF
{typeScalaire | variable%TYPE | table.colonne%TYPE} [NOT NULL]
| table%ROWTYPE
[INDEX BY BINARY_INTEGER];
nomTableau nomTypeTableau;
IF condition THEN
instructions;
END IF;
IF condition THEN
instructions;
ELSE
instructions;
END IF;
IF condition1 THEN
instructions;
ELSIF condition2 THEN
instructions;
ELSE
instructions;
END IF;
[<<étiquette>>]
CASE variable
WHEN expr1 THEN instructions1;
WHEN expr2 THEN instructions2;
…
WHEN exprN THEN instructionsN;
[ELSE instructionsN+1;]
END CASE [étiquette];
[<<étiquette>>]
CASE
WHEN condition1 THEN instructions1;
WHEN condition2 THEN instructions2;
…
WHEN conditionN THEN instructionsN;
[ELSE instructionsN+1;]
END CASE [étiquette];
WHILE condition LOOP
instructions;
END LOOP;
LOOP
instructions;
EXIT [WHEN condition;]
END LOOP;
FOR compteur IN [REVERSE] valeurInf..valeurSup LOOP
instructions;
END LOOP;
CONTINUE [ etiquette ] [ WHEN condition ];
SELECT liste INTO { nomVariablePLSQL [,nomVariablePLSQL]… |
nomRECORD } FROM nomTable …;
 l’atomicité des instructions qui sont
considérées comme une seule opération
(principe du tout ou rien) ;
 la cohérence (passage d’un état cohérent de
la base à un autre état cohérent) ;
 l’isolation des transactions entre elles (lecture
consistante, mécanisme décrit plus loin) ;
 la durabilité des opérations (les mises à jour
perdurent même si une panne se produit
aprèsla transaction).
CREATE [OR REPLACE] PROCEDURE [schéma.]nomProcédure
[(paramètre [ IN | OUT | IN OUT ] [NOCOPY] typeSQL
[{:= | DEFAULT} expression]
[,paramètre [ IN | OUT | IN OUT ] [NOCOPY] typeSQL
[{:= | DEFAULT} expression]… ) ] ]
[AUTHID { CURRENT_USER | DEFINER }]
{ IS | AS }
[PRAGMA AUTONOMOUS_TRANSACTION;]
{ corpsduSousProgrammePL/SQL | LANGUAGE {
JAVA NAME 'nomMéthodeJava' |
C [NAME nomSourceC] LIBRARY nomLibrairie [AGENT IN (paramètre)]
[WITH CONTEXT] [PARAMETERS ( paramètres )] } };
 IN désigne un paramètre d’entrée, out un paramètre de sortie et
in out un paramètre d’entrée et de sortie. Il est possible
d’initialiser chaque paramètre par une valeur.
 NOCOPY permet de transmettre directement le paramètre. On
l’utilise pour améliorer les performances lors du passage de
volumineux paramètres de sortie comme les record, les tables
index-by (les paramètres IN sont toujours passés en NOCOPY).
 La clause AUTHID détermine si la procédure s’exécute avec les
privilèges de son propriétaire (option par défaut, on parle de
definer-rights procedure) ou de l’utilisateur courant (on parle de
invoker-rights procedure).
 PRAGMA AUTONOMOUS_TRANSACTION déclare le sous-
programme en tant que transaction autonome (lancée par une
autre transaction dite « principale »). Les transactions autonomes
permettent de mettre en suspens la transaction principale puis
de reprendre la transaction principale
 corpsduSousProgrammePL/SQL contient la déclaration et les
instructions de la procédure, toutes deux écrites en PL/SQL.
CREATE [OR REPLACE ] FUNCTION [schéma.]nomFonction
[(paramètre [ IN | OUT | IN OUT ] [NOCOPY] typeSQL
[{:= | DEFAULT} expression]
[,paramètre [ IN | OUT | IN OUT ] [NOCOPY] typeSQL
[{:= | DEFAULT} expression]… ) ] ]
RETURN typeSQL
[ AUTHID { DEFINER | CURRENT_USER } ]
{IS | AS}
{ corpsduSousProgrammePL/SQL |
LANGUAGE {
JAVA NAME 'nomMéthodeJava' |
C [NAME nomSourceC] LIBRARY nomLibrairie [AGENT IN (paramètre)]
[WITH CONTEXT] [PARAMETERS ( paramètres )] } };
EXCEPTION
WHEN exception1 [OR exception2 …] THEN
instructions;
[WHEN exception3 [OR exception4 …] THEN
instructions; ]
[WHEN OTHERS THEN
instructions; ]
nomException EXCEPTION;
PRAGMA EXCEPTION_INIT(nomException, numéroErreurOracle);
RAISE_APPLICATION_ERROR(numéroErreur, message [, {TRUE | FALSE}]);
numéroErreur entre –20 000 et –20 999
 BEFORE | AFTER | INSTEAD OF précise la chronologie entre l’action à
réaliser par le déclencheur LMD et la réalisation de l’événement
(exemple BEFORE INSERT programmera l’exécution du déclencheur
avant de réaliser l’insertion).
 DELETE | INSERT | UPDATE précise la nature de l’événement pour les
déclencheurs LMD.
 ON {[schéma.] nomTable | nomVue} spécifie la table, ou la vue,
associée au déclencheur LMD.
 REFERENCING permet de renommer des variables.
 FOR EACH ROW différencie les déclencheurs LMD au niveau ligne ou
au niveau état.
 événementBase identifie la nature d’un déclencheur d’instance (STARTUP ou
SHUTDOWN pour exécuter le déclencheur au démarrage ou à l’arrêt de la
base), d’un déclencheur d’erreurs (SERVERERROR ou SUSPEND pour exécuter
le déclencheur dans le cas d’une erreur particulière ou quand une transaction
est suspendue) ou d’un déclencheur de connexion (LOGON ou LOGOFF pour
exécuter le déclencheur lors de la connexion ou de la déconnexion à la
base).
 actionStructureBase spécifie la nature d’un déclencheur LDD (CREATE, ALTER,
DROP, etc. pour exécuter par exemple le déclencheur lors de la création, la
modification ou la suppression d’un objet de la base).
 ON {[schéma.]SCHEMA | DATABASE}} précise le champ d’application du
déclencheur (de type LDD, erreur ou connexion). Utilisez DATABASE pour les
déclencheurs qui s’exécutent pour quiconque commence l’événement, ou
SCHEMA pour les déclencheurs qui ne doivent s’exécuter que dans le schéma
courant.
 WHEN conditionne l’exécution du déclencheur
CREATE [OR REPLACE] PACKAGE
[AUTHID {CURRENT_USER | DEFINER}] {IS | AS}
[déclarationTypeRECORD…] [déclarationSUBTYPE …]
[déclarationCONSTANT …] [déclarationEXCEPTION …]
[déclarationRECORD …] [déclarationVariable …]
[déclarationCURSOR …] [déclarationFonction …]
[déclarationProcédure …]
END [ ];
F1 := UTL_FILE.FOPEN('MYDIR','MYFILE','R');
UTL_FILE.GET_LINE(F1,V1);
UTL_FILE.FCLOSE(F1);
CREATE OR REPLACE PROCEDURE test_file_pack IS
file_handle UTL_FILE.FILE_TYPE;
BEGIN
file_handle := UTL_FILE.FOPEN('l:db8utlfiledir','file1.txt','w');
DBMS_OUTPUT.PUT_LINE('Start');
UTL_FILE.PUT_LINE(file_handle,'Bonjour chez Vous !');
UTL_FILE.PUT_LINE(file_handle,' on est le ' || to_char(sysdate));
UTL_FILE.FFLUSH(file_handle);
UTL_FILE.FCLOSE(file_handle);
DBMS_OUTPUT.PUT_LINE('Fin !');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No_data_found');
UTL_FILE.FCLOSE(file_handle);
WHEN UTL_FILE.INVALID_PATH THEN
DBMS_OUTPUT.PUT_LINE('UTL_FILE.INVALID_PATH');
UTL_FILE.FCLOSE(file_handle);
WHEN UTL_FILE.READ_ERROR THEN
DBMS_OUTPUT.PUT_LINE('UTL_FILE.READ_ERROR');
UTL_FILE.FCLOSE(file_handle);
WHEN UTL_FILE.WRITE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('UTL_FILE.WRITE_ERROR');
UTL_FILE.FCLOSE(file_handle);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Autres erreurs');
UTL_FILE.FCLOSE(file_handle);
END;
 SQL> @$ORACLE_HOME/rdbms/admin/utlmail.sql
 SQL> @$ORACLE_HOME/rdbms/admin/prvtmail.plb
 SMTP_OUT_SERVER ='XXX.XX.X.X‘
UTL_MAIL.SEND_ATTACH_VARCHAR2 (
sender IN VARCHAR2 CHARACTER SET ANY_CS,
recipients IN VARCHAR2 CHARACTER SET ANY_CS,
cc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
bcc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
subject IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
message IN VARCHAR2 CHARACTER SET ANY_CS,
mime_type IN VARCHAR2 DEFAULT 'text/plain; charset=us-ascii',
priority IN PLS_INTEGER DEFAULT NULL
attachment IN RAW,
att_inline IN BOOLEAN DEFAULT TRUE,
att_mime_type IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT
'text/plain; charset=us-ascii',
att_filename IN VARCHAR2 DEFAULT NULL);
begin
UTL_MAIL.send(sender => ‘source@gmail.fcom',
recipients => ‘cible@hotmail.com',
cc => NULL,
bcc => NULL,
subject => ‘email de test',
message => ‘message de utl_mail ‘);
end;
begin
UTL_MAIL.send_attach_raw
(sender => ‘sender@yahoo.com',
recipients => ‘aicha@gmail.com',
subject => ‘sj',
attachment => HEXTORAW('616262646566C2AA'),
message => ‘email avec fichier attaché',
att_filename => 'os.sql');
end;
 Fonction OPEN_CURSOR RETURN INTEGER ;Cette fonction ouvre un
curseur et renvoie un INTEGER.
 Procédure PARSE (pointeur IN INTEGER, requête_sql IN
VARCHAR2,DBMS.NATIVE) ;Cette procédure analyse la chaîne
‘requête_sql‘ suivant la version sous laquellel’utilisateur est
connecté.
 Fonction EXECUTE (pointeur IN INTEGER) RETURN INTEGER ;Cette
fonction exécute l’ordre associé au curseur et renvoie le nombre de
lignestraitées dans le cas d’un INSERT, DELETE ou UPDATE.
 Procédure CLOSE_CURSOR (pointeur IN OUT INTEGER) ;Cette
procédure ferme le curseur spécifié, met l’identifiant du curseur à
NULL etlibère la mémoire allouée au curseur
 Procédure BIND_VARIABLE( pointeur IN INTEGER,
nom_variable_substitutionIN VARCHAR2,
valeur_variable_substitution IN {NUMBER|VARCHAR2|DATE})
CREATE OR REPLACE PROCEDURE up (
p_salaire IN NUMBER, p_no IN NUMBER,
p_table IN VARCHAR2)
IS
pointeur INTEGER;exec INTEGER;
BEGIN
pointeur:=DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE( pointeur,
'update '||p_table||
' set salaire ='||p_salaire||
' where no ='||p_no,
DBMS_SQL.V7);
exec:=DBMS_SQL.EXECUTE(pointeur);
DBMS_SQL.CLOSE_CURSOR(pointeur);
END;
CREATE PROCEDURE insert_into_table (
table_name VARCHAR2, deptnumber NUMBER, deptname VARCHAR2,
location VARCHAR2)
IS
cur_hdl INTEGER; stmt_str VARCHAR2(200); rows_processed BINARY_INTEGER;
BEGIN
stmt_str := 'INSERT INTO ' || table_name || ' VALUES (:deptno, :dname, :loc)';
-- open cursor
cur_hdl := dbms_sql.open_cursor;
-- parse cursor
dbms_sql.parse(cur_hdl, stmt_str, dbms_sql.native);
-- supply binds
dbms_sql.bind_variable(cur_hdl, ':deptno', deptnumber);
dbms_sql.bind_variable(cur_hdl, ':dname', deptname);
dbms_sql.bind_variable(cur_hdl, ':loc', location);
-- execute cursor
rows_processed := dbms_sql.execute(cur_hdl);
-- close cursor
dbms_sql.close_cursor(cur_hdl);
END;
…
source_cursor := dbms_sql.open_cursor;
DBMS_SQL.PARSE(source_cursor,
'SELECT id, name, birthdate FROM ' || source,
DBMS_SQL.NATIVE);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, id_var);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 2, name_var, 30);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 3, birthdate_var);
ignore := DBMS_SQL.EXECUTE(source_cursor);
…
LOOP
IF DBMS_SQL.FETCH_ROWS(source_cursor)=0 THEN exit; END IF;
-- get column values of the row
DBMS_SQL.COLUMN_VALUE(source_cursor, 1, id_var);
DBMS_SQL.COLUMN_VALUE(source_cursor, 2, name_var);
DBMS_SQL.COLUMN_VALUE(source_cursor, 3, birthdate_var);
…
END LOOP;
EXECUTE IMMEDIATE dynamic_string
[ INTO { define_variable [, define_variable ...]
| record_name } ]
[ USING [ IN | OUT | IN OUT ] bind_argument
[, [ IN | OUT | IN OUT ] bind_argument] ... ]
Plus grande rapidité d’exécution : En moyenne, le SQL
dynamique natif s’exécute de 1.5 à 3 fois plus rapidement.
Support des types définis : Le SQL dynamique natif supporte tous
les types définis par l’utilisateur, Objets, collections, etc…
Support des types RECORD pour les ordres Select : Le SQL
dynamique natif permet d’utiliser un objet de type RECORD dans
une clause INTO
DECLARE
Requete VARCHAR2(256) ;
Emp_id emp.emp_id%TYPE := 1214 ;
BEGIN
Requete := ‘CREATE TABLE XX ( ID NUMBER, LIBELLE VARCHAR2(100) )’;
EXECUTE IMMEDIATE Requete ;
Requete := ‘BEGIN Mon_package.Ma_procedure( :1 ); END;’;
EXECUTE IMMEDIATE Requete USING Emp_id;
END ;
DECLARE
Emp_id emp.emp_id%TYPE := 1214 ;
Salary NUMBER(7,2) ;
v_Null NUMBER := NULL ;
Requete VARCHAR2(256) ;
BEGIN
Requete:= ‘SELECT salary from EMP WHERE empno = :1’;
EXECUTE IMMEDIATE Requete INTO salary USING Emp_id ;
Requete:= ‘UPDATE EMP SET salary = :1 WHERE empno = :2’;
EXECUTE IMMEDIATE Requete USING NULL, Emp_id ;
Requete:= ‘UPDATE EMP SET salary = :1 WHERE empno = :2’;
EXECUTE IMMEDIATE Requete USING v_Null, Emp_id ;
END ;
create function row_count (tab_name VARCHAR2) RETURN NUMBER AS
rows NUMBER;
begin
EXECUTE IMMEDIATE ’select count(*) from ’ || tab_name into rows;
return rows;
end;
DECLARE
Emp_id emp.emp_id%TYPE := 1214 ;
Emp_name emp.name_id%TYPE ;
Emp_rec emp%ROWTYPE ;
Requete VARCHAR2(256) ;
BEGIN
Requete:= ‘SELECT emp_name from EMP WHERE empno = :1’;
EXECUTE IMMEDIATE Requete INTO Emp_name USING Emp_id ;
Requete:= ‘SELECT * from EMP WHERE empno = :1’;
EXECUTE IMMEDIATE Requete INTO Emp_rec USING Emp_id ;
END ;
DECLARE
TYPE T_EMP_NAME is TABLE of EMP.emp_name%TYPE;
TYPE T_EMP_SAL is TABLE of EMP.salary%TYPE;
T_Names T_EMP_NAME ;
T_Sal T_EMP_SAL ;
Requete VARCHAR2(256);
BEGIN
Requete:= ‘SELECT emp_name, salary from EMP’;
EXECUTE IMMEDIATE Requete BULK COLLECT INTO T_Names, T_sal;
END;
DECLARE
TYPE EmpCurTyp IS REF CURSOR;
emp_cv EmpCurTyp;
emp_rec employees%ROWTYPE;
sql_stmt VARCHAR2(200);
v_job VARCHAR2(10) := ’ST_CLERK’;
BEGIN
sql_stmt := ’SELECT * FROM employees WHERE job_id = :j’;
OPEN emp_cv FOR sql_stmt USING v_job;
LOOP
FETCH emp_cv INTO emp_rec;
EXIT WHEN emp_cv%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(’Name: ’ || emp_rec.last_name || ’
Job Id: ’ || emp_rec.job_id);
END LOOP;
CLOSE emp_cv;
END;
/
 IDENTIFIED BY motdePasse permet d’affecter un mot de passe à un utilisateur
local (cas le plus courant et le plus simple).
 IDENTIFIED BY EXTERNALLY permet de se servir de l’authenticité du système
d’exploitation pour s’identifier à Oracle (cas des compte OPS$ pour Unix).
 IDENTIFIED BY GLOBALLY permet de se servir de l’authenticité d’un système
d’annuaire.
 DEFAULT TABLESPACE nomTablespace associe un espace disque de travail
(appelé tablespace) à l’utilisateur.
 TEMPORARY TABLESPACE nomTablespace associe un espace disque
temporaire (dans lequel certaines opérations se dérouleront) à l’utilisateur.
 QUOTA permet de limiter ou pas chaque espace alloué.
 PROFILE nomProfil affecte un profil (caractéristiques système relatives au CPU
et aux connexions) à l’utilisateur.
 PASSWORD EXPIRE pour obliger l’utilisateur à changer son mot de passe à la
première connexion (par défaut il est libre). Le DBA peut aussi changer ce
mot de passe.
 ACCOUNT pour verrouiller ou libérer l’accès à la base (par défaut UNLOCK).
 SESSIONS_PER_USER : nombre de sessions concurrentes autorisées.
 CPU_PER_SESSION : temps CPU maximal pour une session en centièmes de secondes.
 CPU_PER_CALL : temps CPU autorisé pour un appel noyau en centièmes de secondes.
 CONNECT_TIME : temps total autorisé pour une session en minutes (pratique pour les examens
de TP minutés).
 IDLE_TIME : temps d’inactivité autorisé, en minutes, au sein d’une même session (pour les
étudiants qui ne clôturent jamais leurs sessions).
 PRIVATE_SGA : espace mémoire privé alloué dans la SGA (System Global Area).
 FAILED_LOGIN_ATTEMPTS : nombre de tentatives de connexion avant de bloquer l’utilisateur
 PASSWORD_LIFE_TIME : nombre de jours de validité du mot de passe (il expire s’il n’est pas
changé au cours de cette période).
 PASSWORD_REUSE_TIME : nombre de jours avant que le mot de passe puisse être utilisé à
nouveau. Si ce paramètre est initialisé à un entier, le paramètre PASSWORD_REUSE_MAX doit
être passé à UNLIMITED.
 PASSWORD_REUSE_MAX : nombre de modifications de mot de passe avant de pouvoir réutiliser
le mot de passe courant. Si ce paramètre est initialisé à un entier, le paramètre
PASSWORD_REUSE_TIME doit être passé à UNLIMITED.
 PASSWORD_LOCK_TIME : nombre de jours d’interdiction d’accès à un compte après que le
nombre de tentatives de connexions a été atteint
 PASSWORD_GRACE_TIME : nombre de jours d’une période de grâce qui prolonge l’utilisation du
mot de passe avant son changement (un message d’avertissement s’affiche lors des
connexions). Après cette période le mot de passe expire.
 privilègeSystème : description du privilège système (exemple
CREATE TABLE, CREATE SESSION, etc.).
 ALL PRIVILEGES : tous les privilèges système.
 PUBLIC : pour attribuer le(s) privilège(s) à tous les utilisateurs.
 IDENTIFIED BY désigne un utilisateur encore inexistant dans la
base. Cette option n’est pas valide si le bénéficiaire est un
rôle ou est PUBLIC.
 WITH ADMIN OPTION : permet d’attribuer aux bénéficiaires le
droit de retransmettre le(s) privilège(s) reçu(s) à une tierce
personne (utilisateur(s) ou rôle(s)).
 privilègeObjet : description du privilège objet (ex : SELECT,
DELETE, etc.).
 colonne précise la ou les colonnes sur lesquelles se porte le
privilège INSERT, REFERENCES, ou UPDATE (exemple :
UPDATE(typeAvion) pour n’autoriser que la modification de la
colonne typeAvion).
 ALL PRIVILEGES donne tous les privilèges avec l’option GRANT
OPTION) l’objet en question.
 PUBLIC : pour attribuer le(s) privilège(s) à tous les utilisateurs.
 WITH GRANT OPTION : permet de donner aux bénéficiaires le
droit de retransmettre les privilèges reçus à une tierce
personne (utilisateur(s) ou rôle(s)).
IDENTIFIED indique le mot de passe du rôle si besoin est.
ALL active tous les rôles (non identifies) accordes a l’utilisateur qui execute la
commande. Cette activation n’est valable que dans la session courante. La clause EXCEPT
permet d’exclure des rôles accordes a l’utilisateur (mais pas via d’autres rôles) de
l’activation globale.
•NONE désactive tous les rôles dans la session courante (role DEFAULT inclus).

Contenu connexe

Tendances

cours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhouminecours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhoumine
abdelkhalek benhoumine
 
Cours java script
Cours java scriptCours java script
Cours java script
AdelThaljaoui
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmique
Abdoulaye Dieng
 
Les fondamentaux du langage C
Les fondamentaux du langage CLes fondamentaux du langage C
Les fondamentaux du langage C
Abdoulaye Dieng
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP
Abdoulaye Dieng
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
neuros
 
cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++
Abdoulaye Dieng
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
Abdoulaye Dieng
 
Csharp1 : quelques elements de base
Csharp1 :  quelques elements de baseCsharp1 :  quelques elements de base
Csharp1 : quelques elements de base
Abdoulaye Dieng
 
C# 7 - Nouveautés
C# 7 - NouveautésC# 7 - Nouveautés
C# 7 - Nouveautés
James RAVAILLE
 
Php1
Php1Php1
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
Abdoulaye Dieng
 
Fonctions Mono-Ligne
Fonctions Mono-LigneFonctions Mono-Ligne
Fonctions Mono-Ligne
webreaker
 
Manipulation des Données , cours sql oracle
Manipulation des Données , cours sql oracleManipulation des Données , cours sql oracle
Manipulation des Données , cours sql oracle
webreaker
 
Programmation Shell Script
Programmation Shell ScriptProgrammation Shell Script
Programmation Shell Script
Boubakr NOUR
 

Tendances (18)

cours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhouminecours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhoumine
 
Plsql2
Plsql2Plsql2
Plsql2
 
Cours java script
Cours java scriptCours java script
Cours java script
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmique
 
Les fondamentaux du langage C
Les fondamentaux du langage CLes fondamentaux du langage C
Les fondamentaux du langage C
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
 
cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++
 
Sql3
Sql3Sql3
Sql3
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Csharp1 : quelques elements de base
Csharp1 :  quelques elements de baseCsharp1 :  quelques elements de base
Csharp1 : quelques elements de base
 
C# 7 - Nouveautés
C# 7 - NouveautésC# 7 - Nouveautés
C# 7 - Nouveautés
 
Php1
Php1Php1
Php1
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
Fonctions Mono-Ligne
Fonctions Mono-LigneFonctions Mono-Ligne
Fonctions Mono-Ligne
 
Manipulation des Données , cours sql oracle
Manipulation des Données , cours sql oracleManipulation des Données , cours sql oracle
Manipulation des Données , cours sql oracle
 
Cours php
Cours phpCours php
Cours php
 
Programmation Shell Script
Programmation Shell ScriptProgrammation Shell Script
Programmation Shell Script
 

En vedette

Trabajo gbi etica
Trabajo gbi eticaTrabajo gbi etica
Trabajo gbi etica
andrea783
 
Laser pdf
Laser pdfLaser pdf
Laser pdf
mariaeugeniag76
 
Fortaleciendo las capacidades de los partidos políticos y los Congresos en se...
Fortaleciendo las capacidades de los partidos políticos y los Congresos en se...Fortaleciendo las capacidades de los partidos políticos y los Congresos en se...
Fortaleciendo las capacidades de los partidos políticos y los Congresos en se...
ndiperu
 
Propuestas metodológicas
Propuestas metodológicasPropuestas metodológicas
Propuestas metodológicaschuchomedina
 
"Análisis de un problema: una actividad viva", POPBL en Pedagogía
"Análisis de un problema: una actividad viva", POPBL en Pedagogía"Análisis de un problema: una actividad viva", POPBL en Pedagogía
"Análisis de un problema: una actividad viva", POPBL en Pedagogía
PBLesp
 
Comment HWC accompagne ses bâtisseurs de réseau
Comment HWC accompagne ses bâtisseurs de réseauComment HWC accompagne ses bâtisseurs de réseau
Comment HWC accompagne ses bâtisseurs de réseau
hwc-network
 
25 ans de passion
25 ans de passion25 ans de passion
25 ans de passion
Christophe GUILLARME
 
Las redes sociales en la política.
Las redes sociales en la política.Las redes sociales en la política.
Las redes sociales en la política.
ndiperu
 
DIAPORAMA C2I NANTES
DIAPORAMA C2I NANTESDIAPORAMA C2I NANTES
DIAPORAMA C2I NANTES
16LilyCat11
 
Presentación semana2 pn
Presentación semana2 pnPresentación semana2 pn
Presentación semana2 pnRose Chacón
 
Presentación power point
Presentación power pointPresentación power point
Presentación power point
BlancoAida
 
Información general
Información generalInformación general
Información generalclaubiquigu
 
Voyage autour de la terre... pour résoudre le mystère...
Voyage autour de la terre... pour résoudre le mystère...Voyage autour de la terre... pour résoudre le mystère...
Voyage autour de la terre... pour résoudre le mystère...Julie PAYET
 
Trabajo sobre la Historia Argentina
Trabajo sobre la Historia ArgentinaTrabajo sobre la Historia Argentina
Trabajo sobre la Historia Argentinamarta iatati
 
Comment bien tester son site RWD ?
Comment bien tester son site RWD ?Comment bien tester son site RWD ?
Comment bien tester son site RWD ?
StardustTesting
 
Le kiribati-diapo
Le kiribati-diapoLe kiribati-diapo
Le kiribati-diapoGeolinks
 
Analisis estructural rosa divina
Analisis estructural rosa divinaAnalisis estructural rosa divina
Analisis estructural rosa divina2005Johana
 
Feliz cumple juan
Feliz cumple  juanFeliz cumple  juan
Feliz cumple juanmaglds
 

En vedette (20)

Trabajo gbi etica
Trabajo gbi eticaTrabajo gbi etica
Trabajo gbi etica
 
Laser pdf
Laser pdfLaser pdf
Laser pdf
 
Fortaleciendo las capacidades de los partidos políticos y los Congresos en se...
Fortaleciendo las capacidades de los partidos políticos y los Congresos en se...Fortaleciendo las capacidades de los partidos políticos y los Congresos en se...
Fortaleciendo las capacidades de los partidos políticos y los Congresos en se...
 
Propuestas metodológicas
Propuestas metodológicasPropuestas metodológicas
Propuestas metodológicas
 
Musica
MusicaMusica
Musica
 
"Análisis de un problema: una actividad viva", POPBL en Pedagogía
"Análisis de un problema: una actividad viva", POPBL en Pedagogía"Análisis de un problema: una actividad viva", POPBL en Pedagogía
"Análisis de un problema: una actividad viva", POPBL en Pedagogía
 
Comment HWC accompagne ses bâtisseurs de réseau
Comment HWC accompagne ses bâtisseurs de réseauComment HWC accompagne ses bâtisseurs de réseau
Comment HWC accompagne ses bâtisseurs de réseau
 
25 ans de passion
25 ans de passion25 ans de passion
25 ans de passion
 
Las redes sociales en la política.
Las redes sociales en la política.Las redes sociales en la política.
Las redes sociales en la política.
 
DIAPORAMA C2I NANTES
DIAPORAMA C2I NANTESDIAPORAMA C2I NANTES
DIAPORAMA C2I NANTES
 
Presentación semana2 pn
Presentación semana2 pnPresentación semana2 pn
Presentación semana2 pn
 
Presentación power point
Presentación power pointPresentación power point
Presentación power point
 
Información general
Información generalInformación general
Información general
 
Voyage autour de la terre... pour résoudre le mystère...
Voyage autour de la terre... pour résoudre le mystère...Voyage autour de la terre... pour résoudre le mystère...
Voyage autour de la terre... pour résoudre le mystère...
 
Trabajo sobre la Historia Argentina
Trabajo sobre la Historia ArgentinaTrabajo sobre la Historia Argentina
Trabajo sobre la Historia Argentina
 
Comment bien tester son site RWD ?
Comment bien tester son site RWD ?Comment bien tester son site RWD ?
Comment bien tester son site RWD ?
 
Le kiribati-diapo
Le kiribati-diapoLe kiribati-diapo
Le kiribati-diapo
 
Analisis estructural rosa divina
Analisis estructural rosa divinaAnalisis estructural rosa divina
Analisis estructural rosa divina
 
Radiacion
RadiacionRadiacion
Radiacion
 
Feliz cumple juan
Feliz cumple  juanFeliz cumple  juan
Feliz cumple juan
 

Similaire à oracle : le PL-SQL

Plsql triggers
Plsql triggersPlsql triggers
Plsql triggers
Az Za
 
1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdf1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdf
ImaneZoubir1
 
Sql
SqlSql
PL LSQL.pptx
PL LSQL.pptxPL LSQL.pptx
PL LSQL.pptx
MaNl13
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
Paris Salesforce Developer Group
 
Les03.ppt
Les03.pptLes03.ppt
Les03.ppt
zidane39
 
SQL et MySQL
SQL et MySQLSQL et MySQL
SQL et MySQL
Jean-Marie Renouard
 
Plpython et Triggers
Plpython et TriggersPlpython et Triggers
Plpython et TriggersAffinitic
 
Algo poo ts
Algo poo tsAlgo poo ts
Algo poo ts
mohamed El babili
 
De legacy à symfony
De legacy à symfonyDe legacy à symfony
De legacy à symfony
Etienne Lachance
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
Korteby Farouk
 
Gestion des logs sur une plateforme web
Gestion des logs sur une plateforme webGestion des logs sur une plateforme web
Gestion des logs sur une plateforme webfredcons
 
Spring 3.0
Spring 3.0Spring 3.0
Marzouk une introduction à jdbc
Marzouk une introduction à jdbcMarzouk une introduction à jdbc
Marzouk une introduction à jdbc
abderrahim marzouk
 
Généralités sur la notion d’Algorithme
Généralités sur la notion d’AlgorithmeGénéralités sur la notion d’Algorithme
Généralités sur la notion d’Algorithme
InforMatica34
 
La première partie de la présentation PHP
La première partie de la présentation PHPLa première partie de la présentation PHP
La première partie de la présentation PHP
Club Scientifique de l'ESI - CSE
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
neuros
 

Similaire à oracle : le PL-SQL (20)

Plsql triggers
Plsql triggersPlsql triggers
Plsql triggers
 
1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdf1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdf
 
Sql
SqlSql
Sql
 
PL LSQL.pptx
PL LSQL.pptxPL LSQL.pptx
PL LSQL.pptx
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
 
Les03.ppt
Les03.pptLes03.ppt
Les03.ppt
 
SQL et MySQL
SQL et MySQLSQL et MySQL
SQL et MySQL
 
Plpython et Triggers
Plpython et TriggersPlpython et Triggers
Plpython et Triggers
 
Algo poo ts
Algo poo tsAlgo poo ts
Algo poo ts
 
De legacy à symfony
De legacy à symfonyDe legacy à symfony
De legacy à symfony
 
Cours3 gdm sql
Cours3 gdm sqlCours3 gdm sql
Cours3 gdm sql
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
 
Gestion des logs sur une plateforme web
Gestion des logs sur une plateforme webGestion des logs sur une plateforme web
Gestion des logs sur une plateforme web
 
Theme 7
Theme 7Theme 7
Theme 7
 
Jdbc
JdbcJdbc
Jdbc
 
Spring 3.0
Spring 3.0Spring 3.0
Spring 3.0
 
Marzouk une introduction à jdbc
Marzouk une introduction à jdbcMarzouk une introduction à jdbc
Marzouk une introduction à jdbc
 
Généralités sur la notion d’Algorithme
Généralités sur la notion d’AlgorithmeGénéralités sur la notion d’Algorithme
Généralités sur la notion d’Algorithme
 
La première partie de la présentation PHP
La première partie de la présentation PHPLa première partie de la présentation PHP
La première partie de la présentation PHP
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
 

Dernier

4 expositions à voir à Paris.pptx
4   expositions    à   voir   à Paris.pptx4   expositions    à   voir   à Paris.pptx
4 expositions à voir à Paris.pptx
Txaruka
 
SYLLABUS DU COURS MARKETING DTS 1-2.pdf
SYLLABUS DU COURS  MARKETING DTS 1-2.pdfSYLLABUS DU COURS  MARKETING DTS 1-2.pdf
SYLLABUS DU COURS MARKETING DTS 1-2.pdf
Moukagni Evrard
 
Mémoire de licence en finance comptabilité et audit
Mémoire de licence en finance comptabilité et auditMémoire de licence en finance comptabilité et audit
Mémoire de licence en finance comptabilité et audit
MelDjobo
 
Cours SE - Gestion de la mémoire- Cours IG IPSET.pdf
Cours SE - Gestion de la mémoire- Cours IG IPSET.pdfCours SE - Gestion de la mémoire- Cours IG IPSET.pdf
Cours SE - Gestion de la mémoire- Cours IG IPSET.pdf
MedBechir
 
Contrôle fiscale en république de guinée
Contrôle fiscale en république de guinéeContrôle fiscale en république de guinée
Contrôle fiscale en république de guinée
bangalykaba146
 
Iris et les hommes.pptx
Iris      et         les      hommes.pptxIris      et         les      hommes.pptx
Iris et les hommes.pptx
Txaruka
 
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Formation
 
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
IES Turina/Rodrigo/Itaca/Palomeras
 
Calendrier du 3 juin 2024 et compte rendu.pdf
Calendrier du 3 juin 2024 et compte rendu.pdfCalendrier du 3 juin 2024 et compte rendu.pdf
Calendrier du 3 juin 2024 et compte rendu.pdf
frizzole
 
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La JeunesseConseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Oscar Smith
 
Projet de fin d'étude licence en sciece.pptx
Projet de fin d'étude licence en sciece.pptxProjet de fin d'étude licence en sciece.pptx
Projet de fin d'étude licence en sciece.pptx
elfangourabdelouahab
 
Newsletter SPW Agriculture en province du Luxembourg du 03-06-24
Newsletter SPW Agriculture en province du Luxembourg du 03-06-24Newsletter SPW Agriculture en province du Luxembourg du 03-06-24
Newsletter SPW Agriculture en province du Luxembourg du 03-06-24
BenotGeorges3
 
Exame DELF - A2 Francês pout tout public
Exame DELF - A2  Francês pout tout publicExame DELF - A2  Francês pout tout public
Exame DELF - A2 Francês pout tout public
GiselaAlves15
 

Dernier (13)

4 expositions à voir à Paris.pptx
4   expositions    à   voir   à Paris.pptx4   expositions    à   voir   à Paris.pptx
4 expositions à voir à Paris.pptx
 
SYLLABUS DU COURS MARKETING DTS 1-2.pdf
SYLLABUS DU COURS  MARKETING DTS 1-2.pdfSYLLABUS DU COURS  MARKETING DTS 1-2.pdf
SYLLABUS DU COURS MARKETING DTS 1-2.pdf
 
Mémoire de licence en finance comptabilité et audit
Mémoire de licence en finance comptabilité et auditMémoire de licence en finance comptabilité et audit
Mémoire de licence en finance comptabilité et audit
 
Cours SE - Gestion de la mémoire- Cours IG IPSET.pdf
Cours SE - Gestion de la mémoire- Cours IG IPSET.pdfCours SE - Gestion de la mémoire- Cours IG IPSET.pdf
Cours SE - Gestion de la mémoire- Cours IG IPSET.pdf
 
Contrôle fiscale en république de guinée
Contrôle fiscale en république de guinéeContrôle fiscale en république de guinée
Contrôle fiscale en république de guinée
 
Iris et les hommes.pptx
Iris      et         les      hommes.pptxIris      et         les      hommes.pptx
Iris et les hommes.pptx
 
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
 
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
 
Calendrier du 3 juin 2024 et compte rendu.pdf
Calendrier du 3 juin 2024 et compte rendu.pdfCalendrier du 3 juin 2024 et compte rendu.pdf
Calendrier du 3 juin 2024 et compte rendu.pdf
 
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La JeunesseConseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
 
Projet de fin d'étude licence en sciece.pptx
Projet de fin d'étude licence en sciece.pptxProjet de fin d'étude licence en sciece.pptx
Projet de fin d'étude licence en sciece.pptx
 
Newsletter SPW Agriculture en province du Luxembourg du 03-06-24
Newsletter SPW Agriculture en province du Luxembourg du 03-06-24Newsletter SPW Agriculture en province du Luxembourg du 03-06-24
Newsletter SPW Agriculture en province du Luxembourg du 03-06-24
 
Exame DELF - A2 Francês pout tout public
Exame DELF - A2  Francês pout tout publicExame DELF - A2  Francês pout tout public
Exame DELF - A2 Francês pout tout public
 

oracle : le PL-SQL

  • 1. Le SQL procédural d’Oracle
  • 2.  Faire cohabiter des structures de contrôle (si, pour et tant que) avec des instructions SQL (principalement SELECT, INSERT, UPDATE et DELETE).  Eviter les encombrements reseau : En effet, un bloc PL/SQL donne lieu à un seul échange entre le client et le serveur  La modularité (un bloc d’instruction peut être composé d’un autre, etc.) : un bloc peut être nommé pour devenir une procédure ou une fonction cataloguée, donc réutilisable. Une procédure, ou fonction, cataloguée peut être incluse dans un paquetage (package) pour mieux contrôler et réutiliser ces composants logiciels.  La portabilité : un programme PL/SQL est indépendant du système d’exploitation qui héberge le serveur Oracle. En changeant de système, les applicatifs n’ont pas à être modifiés.  L’intégration avec les données des tables : on retrouvera avec PL/SQL tous les types de données et instructions disponibles sous SQL, et des mécanismes pour parcourir des résultats de requêtes (curseurs), pour traiter des erreurs (exceptions), pour manipuler des données complexes (paquetages DBMS_xxx) et pour programmer des transactions (COMMIT, ROLLBACK, SAVEPOINT).
  • 3.  un bloc de code, executé comme une commande SQL, via un interpréteur standard (SQL+ ou iSQL*PLus)  un fichier de commande PL/SQL  un programme stocké (procédure, fonction, package ou trigger)
  • 4.
  • 5.
  • 6.
  • 7. identificateur [CONSTANT] typeDeDonnée [NOT NULL] [:= | DEFAULT expression];  CONSTANT précise qu’il s’agit d’une constante ;  NOT NULL pose une contrainte en ligne sur la variable ;  DEFAULT permet d’initialiser la variable (équivaut à l’affectation :=). c_pi CONSTANT NUMBER := 3.14159; v_rayon NUMBER DEFAULT 1.5; v_aire NUMBER := c_pi * v_rayon**2; v_trouvé BOOLEAN NOT NULL := TRUE; VALUE_ERROR
  • 8.  l’affectation comme on la connaît dans les langages de programmation (variable := expression) ;  par la directive DEFAULT ;  par la directive INTO d’une requête (SELECT … INTO variable FROM …).
  • 9.  Variables %TYPE  Variables %ROWTYPE  TYPE RECORD DECLARE v_cat Produit.categorie%TYPE; r_prod Produit%ROWTYPE; BEGIN SELECT * INTO r_prod FROM produit WHERE refProd=5; v_cat=r_prod.categorie; r_prod.nom=‘nouvp’; insert into produit values r_prod; … TYPE nomRecord IS RECORD ( nomChamp typeDonnées [[NOT NULL] {:= | DEFAULT} expression] [,nomChamp typeDonnées… ]… );
  • 10.  Type TABLE TYPE nomTypeTableau IS TABLE OF {typeScalaire | variable%TYPE | table.colonne%TYPE} [NOT NULL] | table%ROWTYPE [INDEX BY BINARY_INTEGER]; nomTableau nomTypeTableau;
  • 11. IF condition THEN instructions; END IF; IF condition THEN instructions; ELSE instructions; END IF; IF condition1 THEN instructions; ELSIF condition2 THEN instructions; ELSE instructions; END IF;
  • 12. [<<étiquette>>] CASE variable WHEN expr1 THEN instructions1; WHEN expr2 THEN instructions2; … WHEN exprN THEN instructionsN; [ELSE instructionsN+1;] END CASE [étiquette]; [<<étiquette>>] CASE WHEN condition1 THEN instructions1; WHEN condition2 THEN instructions2; … WHEN conditionN THEN instructionsN; [ELSE instructionsN+1;] END CASE [étiquette];
  • 13.
  • 14. WHILE condition LOOP instructions; END LOOP; LOOP instructions; EXIT [WHEN condition;] END LOOP; FOR compteur IN [REVERSE] valeurInf..valeurSup LOOP instructions; END LOOP; CONTINUE [ etiquette ] [ WHEN condition ];
  • 15. SELECT liste INTO { nomVariablePLSQL [,nomVariablePLSQL]… | nomRECORD } FROM nomTable …;
  • 16.
  • 17.  l’atomicité des instructions qui sont considérées comme une seule opération (principe du tout ou rien) ;  la cohérence (passage d’un état cohérent de la base à un autre état cohérent) ;  l’isolation des transactions entre elles (lecture consistante, mécanisme décrit plus loin) ;  la durabilité des opérations (les mises à jour perdurent même si une panne se produit aprèsla transaction).
  • 18.
  • 19. CREATE [OR REPLACE] PROCEDURE [schéma.]nomProcédure [(paramètre [ IN | OUT | IN OUT ] [NOCOPY] typeSQL [{:= | DEFAULT} expression] [,paramètre [ IN | OUT | IN OUT ] [NOCOPY] typeSQL [{:= | DEFAULT} expression]… ) ] ] [AUTHID { CURRENT_USER | DEFINER }] { IS | AS } [PRAGMA AUTONOMOUS_TRANSACTION;] { corpsduSousProgrammePL/SQL | LANGUAGE { JAVA NAME 'nomMéthodeJava' | C [NAME nomSourceC] LIBRARY nomLibrairie [AGENT IN (paramètre)] [WITH CONTEXT] [PARAMETERS ( paramètres )] } };
  • 20.  IN désigne un paramètre d’entrée, out un paramètre de sortie et in out un paramètre d’entrée et de sortie. Il est possible d’initialiser chaque paramètre par une valeur.  NOCOPY permet de transmettre directement le paramètre. On l’utilise pour améliorer les performances lors du passage de volumineux paramètres de sortie comme les record, les tables index-by (les paramètres IN sont toujours passés en NOCOPY).  La clause AUTHID détermine si la procédure s’exécute avec les privilèges de son propriétaire (option par défaut, on parle de definer-rights procedure) ou de l’utilisateur courant (on parle de invoker-rights procedure).  PRAGMA AUTONOMOUS_TRANSACTION déclare le sous- programme en tant que transaction autonome (lancée par une autre transaction dite « principale »). Les transactions autonomes permettent de mettre en suspens la transaction principale puis de reprendre la transaction principale  corpsduSousProgrammePL/SQL contient la déclaration et les instructions de la procédure, toutes deux écrites en PL/SQL.
  • 21. CREATE [OR REPLACE ] FUNCTION [schéma.]nomFonction [(paramètre [ IN | OUT | IN OUT ] [NOCOPY] typeSQL [{:= | DEFAULT} expression] [,paramètre [ IN | OUT | IN OUT ] [NOCOPY] typeSQL [{:= | DEFAULT} expression]… ) ] ] RETURN typeSQL [ AUTHID { DEFINER | CURRENT_USER } ] {IS | AS} { corpsduSousProgrammePL/SQL | LANGUAGE { JAVA NAME 'nomMéthodeJava' | C [NAME nomSourceC] LIBRARY nomLibrairie [AGENT IN (paramètre)] [WITH CONTEXT] [PARAMETERS ( paramètres )] } };
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28. EXCEPTION WHEN exception1 [OR exception2 …] THEN instructions; [WHEN exception3 [OR exception4 …] THEN instructions; ] [WHEN OTHERS THEN instructions; ]
  • 29.
  • 30.
  • 31.
  • 32. nomException EXCEPTION; PRAGMA EXCEPTION_INIT(nomException, numéroErreurOracle); RAISE_APPLICATION_ERROR(numéroErreur, message [, {TRUE | FALSE}]); numéroErreur entre –20 000 et –20 999
  • 33.
  • 34.
  • 35.  BEFORE | AFTER | INSTEAD OF précise la chronologie entre l’action à réaliser par le déclencheur LMD et la réalisation de l’événement (exemple BEFORE INSERT programmera l’exécution du déclencheur avant de réaliser l’insertion).  DELETE | INSERT | UPDATE précise la nature de l’événement pour les déclencheurs LMD.  ON {[schéma.] nomTable | nomVue} spécifie la table, ou la vue, associée au déclencheur LMD.  REFERENCING permet de renommer des variables.  FOR EACH ROW différencie les déclencheurs LMD au niveau ligne ou au niveau état.
  • 36.  événementBase identifie la nature d’un déclencheur d’instance (STARTUP ou SHUTDOWN pour exécuter le déclencheur au démarrage ou à l’arrêt de la base), d’un déclencheur d’erreurs (SERVERERROR ou SUSPEND pour exécuter le déclencheur dans le cas d’une erreur particulière ou quand une transaction est suspendue) ou d’un déclencheur de connexion (LOGON ou LOGOFF pour exécuter le déclencheur lors de la connexion ou de la déconnexion à la base).  actionStructureBase spécifie la nature d’un déclencheur LDD (CREATE, ALTER, DROP, etc. pour exécuter par exemple le déclencheur lors de la création, la modification ou la suppression d’un objet de la base).  ON {[schéma.]SCHEMA | DATABASE}} précise le champ d’application du déclencheur (de type LDD, erreur ou connexion). Utilisez DATABASE pour les déclencheurs qui s’exécutent pour quiconque commence l’événement, ou SCHEMA pour les déclencheurs qui ne doivent s’exécuter que dans le schéma courant.  WHEN conditionne l’exécution du déclencheur
  • 37.
  • 38. CREATE [OR REPLACE] PACKAGE [AUTHID {CURRENT_USER | DEFINER}] {IS | AS} [déclarationTypeRECORD…] [déclarationSUBTYPE …] [déclarationCONSTANT …] [déclarationEXCEPTION …] [déclarationRECORD …] [déclarationVariable …] [déclarationCURSOR …] [déclarationFonction …] [déclarationProcédure …] END [ ];
  • 39.
  • 41. CREATE OR REPLACE PROCEDURE test_file_pack IS file_handle UTL_FILE.FILE_TYPE; BEGIN file_handle := UTL_FILE.FOPEN('l:db8utlfiledir','file1.txt','w'); DBMS_OUTPUT.PUT_LINE('Start'); UTL_FILE.PUT_LINE(file_handle,'Bonjour chez Vous !'); UTL_FILE.PUT_LINE(file_handle,' on est le ' || to_char(sysdate)); UTL_FILE.FFLUSH(file_handle); UTL_FILE.FCLOSE(file_handle); DBMS_OUTPUT.PUT_LINE('Fin !'); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('No_data_found'); UTL_FILE.FCLOSE(file_handle); WHEN UTL_FILE.INVALID_PATH THEN DBMS_OUTPUT.PUT_LINE('UTL_FILE.INVALID_PATH'); UTL_FILE.FCLOSE(file_handle); WHEN UTL_FILE.READ_ERROR THEN DBMS_OUTPUT.PUT_LINE('UTL_FILE.READ_ERROR'); UTL_FILE.FCLOSE(file_handle); WHEN UTL_FILE.WRITE_ERROR THEN DBMS_OUTPUT.PUT_LINE('UTL_FILE.WRITE_ERROR'); UTL_FILE.FCLOSE(file_handle); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Autres erreurs'); UTL_FILE.FCLOSE(file_handle); END;
  • 42.
  • 43.
  • 44.  SQL> @$ORACLE_HOME/rdbms/admin/utlmail.sql  SQL> @$ORACLE_HOME/rdbms/admin/prvtmail.plb  SMTP_OUT_SERVER ='XXX.XX.X.X‘
  • 45.
  • 46. UTL_MAIL.SEND_ATTACH_VARCHAR2 ( sender IN VARCHAR2 CHARACTER SET ANY_CS, recipients IN VARCHAR2 CHARACTER SET ANY_CS, cc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL, bcc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL, subject IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL, message IN VARCHAR2 CHARACTER SET ANY_CS, mime_type IN VARCHAR2 DEFAULT 'text/plain; charset=us-ascii', priority IN PLS_INTEGER DEFAULT NULL attachment IN RAW, att_inline IN BOOLEAN DEFAULT TRUE, att_mime_type IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain; charset=us-ascii', att_filename IN VARCHAR2 DEFAULT NULL);
  • 47. begin UTL_MAIL.send(sender => ‘source@gmail.fcom', recipients => ‘cible@hotmail.com', cc => NULL, bcc => NULL, subject => ‘email de test', message => ‘message de utl_mail ‘); end; begin UTL_MAIL.send_attach_raw (sender => ‘sender@yahoo.com', recipients => ‘aicha@gmail.com', subject => ‘sj', attachment => HEXTORAW('616262646566C2AA'), message => ‘email avec fichier attaché', att_filename => 'os.sql'); end;
  • 48.  Fonction OPEN_CURSOR RETURN INTEGER ;Cette fonction ouvre un curseur et renvoie un INTEGER.  Procédure PARSE (pointeur IN INTEGER, requête_sql IN VARCHAR2,DBMS.NATIVE) ;Cette procédure analyse la chaîne ‘requête_sql‘ suivant la version sous laquellel’utilisateur est connecté.  Fonction EXECUTE (pointeur IN INTEGER) RETURN INTEGER ;Cette fonction exécute l’ordre associé au curseur et renvoie le nombre de lignestraitées dans le cas d’un INSERT, DELETE ou UPDATE.  Procédure CLOSE_CURSOR (pointeur IN OUT INTEGER) ;Cette procédure ferme le curseur spécifié, met l’identifiant du curseur à NULL etlibère la mémoire allouée au curseur  Procédure BIND_VARIABLE( pointeur IN INTEGER, nom_variable_substitutionIN VARCHAR2, valeur_variable_substitution IN {NUMBER|VARCHAR2|DATE})
  • 49. CREATE OR REPLACE PROCEDURE up ( p_salaire IN NUMBER, p_no IN NUMBER, p_table IN VARCHAR2) IS pointeur INTEGER;exec INTEGER; BEGIN pointeur:=DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE( pointeur, 'update '||p_table|| ' set salaire ='||p_salaire|| ' where no ='||p_no, DBMS_SQL.V7); exec:=DBMS_SQL.EXECUTE(pointeur); DBMS_SQL.CLOSE_CURSOR(pointeur); END;
  • 50. CREATE PROCEDURE insert_into_table ( table_name VARCHAR2, deptnumber NUMBER, deptname VARCHAR2, location VARCHAR2) IS cur_hdl INTEGER; stmt_str VARCHAR2(200); rows_processed BINARY_INTEGER; BEGIN stmt_str := 'INSERT INTO ' || table_name || ' VALUES (:deptno, :dname, :loc)'; -- open cursor cur_hdl := dbms_sql.open_cursor; -- parse cursor dbms_sql.parse(cur_hdl, stmt_str, dbms_sql.native); -- supply binds dbms_sql.bind_variable(cur_hdl, ':deptno', deptnumber); dbms_sql.bind_variable(cur_hdl, ':dname', deptname); dbms_sql.bind_variable(cur_hdl, ':loc', location); -- execute cursor rows_processed := dbms_sql.execute(cur_hdl); -- close cursor dbms_sql.close_cursor(cur_hdl); END;
  • 51. … source_cursor := dbms_sql.open_cursor; DBMS_SQL.PARSE(source_cursor, 'SELECT id, name, birthdate FROM ' || source, DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, id_var); DBMS_SQL.DEFINE_COLUMN(source_cursor, 2, name_var, 30); DBMS_SQL.DEFINE_COLUMN(source_cursor, 3, birthdate_var); ignore := DBMS_SQL.EXECUTE(source_cursor); … LOOP IF DBMS_SQL.FETCH_ROWS(source_cursor)=0 THEN exit; END IF; -- get column values of the row DBMS_SQL.COLUMN_VALUE(source_cursor, 1, id_var); DBMS_SQL.COLUMN_VALUE(source_cursor, 2, name_var); DBMS_SQL.COLUMN_VALUE(source_cursor, 3, birthdate_var); … END LOOP;
  • 52. EXECUTE IMMEDIATE dynamic_string [ INTO { define_variable [, define_variable ...] | record_name } ] [ USING [ IN | OUT | IN OUT ] bind_argument [, [ IN | OUT | IN OUT ] bind_argument] ... ] Plus grande rapidité d’exécution : En moyenne, le SQL dynamique natif s’exécute de 1.5 à 3 fois plus rapidement. Support des types définis : Le SQL dynamique natif supporte tous les types définis par l’utilisateur, Objets, collections, etc… Support des types RECORD pour les ordres Select : Le SQL dynamique natif permet d’utiliser un objet de type RECORD dans une clause INTO
  • 53. DECLARE Requete VARCHAR2(256) ; Emp_id emp.emp_id%TYPE := 1214 ; BEGIN Requete := ‘CREATE TABLE XX ( ID NUMBER, LIBELLE VARCHAR2(100) )’; EXECUTE IMMEDIATE Requete ; Requete := ‘BEGIN Mon_package.Ma_procedure( :1 ); END;’; EXECUTE IMMEDIATE Requete USING Emp_id; END ;
  • 54. DECLARE Emp_id emp.emp_id%TYPE := 1214 ; Salary NUMBER(7,2) ; v_Null NUMBER := NULL ; Requete VARCHAR2(256) ; BEGIN Requete:= ‘SELECT salary from EMP WHERE empno = :1’; EXECUTE IMMEDIATE Requete INTO salary USING Emp_id ; Requete:= ‘UPDATE EMP SET salary = :1 WHERE empno = :2’; EXECUTE IMMEDIATE Requete USING NULL, Emp_id ; Requete:= ‘UPDATE EMP SET salary = :1 WHERE empno = :2’; EXECUTE IMMEDIATE Requete USING v_Null, Emp_id ; END ;
  • 55. create function row_count (tab_name VARCHAR2) RETURN NUMBER AS rows NUMBER; begin EXECUTE IMMEDIATE ’select count(*) from ’ || tab_name into rows; return rows; end; DECLARE Emp_id emp.emp_id%TYPE := 1214 ; Emp_name emp.name_id%TYPE ; Emp_rec emp%ROWTYPE ; Requete VARCHAR2(256) ; BEGIN Requete:= ‘SELECT emp_name from EMP WHERE empno = :1’; EXECUTE IMMEDIATE Requete INTO Emp_name USING Emp_id ; Requete:= ‘SELECT * from EMP WHERE empno = :1’; EXECUTE IMMEDIATE Requete INTO Emp_rec USING Emp_id ; END ;
  • 56. DECLARE TYPE T_EMP_NAME is TABLE of EMP.emp_name%TYPE; TYPE T_EMP_SAL is TABLE of EMP.salary%TYPE; T_Names T_EMP_NAME ; T_Sal T_EMP_SAL ; Requete VARCHAR2(256); BEGIN Requete:= ‘SELECT emp_name, salary from EMP’; EXECUTE IMMEDIATE Requete BULK COLLECT INTO T_Names, T_sal; END;
  • 57. DECLARE TYPE EmpCurTyp IS REF CURSOR; emp_cv EmpCurTyp; emp_rec employees%ROWTYPE; sql_stmt VARCHAR2(200); v_job VARCHAR2(10) := ’ST_CLERK’; BEGIN sql_stmt := ’SELECT * FROM employees WHERE job_id = :j’; OPEN emp_cv FOR sql_stmt USING v_job; LOOP FETCH emp_cv INTO emp_rec; EXIT WHEN emp_cv%NOTFOUND; DBMS_OUTPUT.PUT_LINE(’Name: ’ || emp_rec.last_name || ’ Job Id: ’ || emp_rec.job_id); END LOOP; CLOSE emp_cv; END; /
  • 58.
  • 59.  IDENTIFIED BY motdePasse permet d’affecter un mot de passe à un utilisateur local (cas le plus courant et le plus simple).  IDENTIFIED BY EXTERNALLY permet de se servir de l’authenticité du système d’exploitation pour s’identifier à Oracle (cas des compte OPS$ pour Unix).  IDENTIFIED BY GLOBALLY permet de se servir de l’authenticité d’un système d’annuaire.  DEFAULT TABLESPACE nomTablespace associe un espace disque de travail (appelé tablespace) à l’utilisateur.  TEMPORARY TABLESPACE nomTablespace associe un espace disque temporaire (dans lequel certaines opérations se dérouleront) à l’utilisateur.  QUOTA permet de limiter ou pas chaque espace alloué.  PROFILE nomProfil affecte un profil (caractéristiques système relatives au CPU et aux connexions) à l’utilisateur.  PASSWORD EXPIRE pour obliger l’utilisateur à changer son mot de passe à la première connexion (par défaut il est libre). Le DBA peut aussi changer ce mot de passe.  ACCOUNT pour verrouiller ou libérer l’accès à la base (par défaut UNLOCK).
  • 60.
  • 61.
  • 62.  SESSIONS_PER_USER : nombre de sessions concurrentes autorisées.  CPU_PER_SESSION : temps CPU maximal pour une session en centièmes de secondes.  CPU_PER_CALL : temps CPU autorisé pour un appel noyau en centièmes de secondes.  CONNECT_TIME : temps total autorisé pour une session en minutes (pratique pour les examens de TP minutés).  IDLE_TIME : temps d’inactivité autorisé, en minutes, au sein d’une même session (pour les étudiants qui ne clôturent jamais leurs sessions).  PRIVATE_SGA : espace mémoire privé alloué dans la SGA (System Global Area).  FAILED_LOGIN_ATTEMPTS : nombre de tentatives de connexion avant de bloquer l’utilisateur  PASSWORD_LIFE_TIME : nombre de jours de validité du mot de passe (il expire s’il n’est pas changé au cours de cette période).  PASSWORD_REUSE_TIME : nombre de jours avant que le mot de passe puisse être utilisé à nouveau. Si ce paramètre est initialisé à un entier, le paramètre PASSWORD_REUSE_MAX doit être passé à UNLIMITED.  PASSWORD_REUSE_MAX : nombre de modifications de mot de passe avant de pouvoir réutiliser le mot de passe courant. Si ce paramètre est initialisé à un entier, le paramètre PASSWORD_REUSE_TIME doit être passé à UNLIMITED.  PASSWORD_LOCK_TIME : nombre de jours d’interdiction d’accès à un compte après que le nombre de tentatives de connexions a été atteint  PASSWORD_GRACE_TIME : nombre de jours d’une période de grâce qui prolonge l’utilisation du mot de passe avant son changement (un message d’avertissement s’affiche lors des connexions). Après cette période le mot de passe expire.
  • 63.
  • 64.
  • 65.  privilègeSystème : description du privilège système (exemple CREATE TABLE, CREATE SESSION, etc.).  ALL PRIVILEGES : tous les privilèges système.  PUBLIC : pour attribuer le(s) privilège(s) à tous les utilisateurs.  IDENTIFIED BY désigne un utilisateur encore inexistant dans la base. Cette option n’est pas valide si le bénéficiaire est un rôle ou est PUBLIC.  WITH ADMIN OPTION : permet d’attribuer aux bénéficiaires le droit de retransmettre le(s) privilège(s) reçu(s) à une tierce personne (utilisateur(s) ou rôle(s)).
  • 66.
  • 67.
  • 68.
  • 69.  privilègeObjet : description du privilège objet (ex : SELECT, DELETE, etc.).  colonne précise la ou les colonnes sur lesquelles se porte le privilège INSERT, REFERENCES, ou UPDATE (exemple : UPDATE(typeAvion) pour n’autoriser que la modification de la colonne typeAvion).  ALL PRIVILEGES donne tous les privilèges avec l’option GRANT OPTION) l’objet en question.  PUBLIC : pour attribuer le(s) privilège(s) à tous les utilisateurs.  WITH GRANT OPTION : permet de donner aux bénéficiaires le droit de retransmettre les privilèges reçus à une tierce personne (utilisateur(s) ou rôle(s)).
  • 70.
  • 71.
  • 72.
  • 73.
  • 74. IDENTIFIED indique le mot de passe du rôle si besoin est. ALL active tous les rôles (non identifies) accordes a l’utilisateur qui execute la commande. Cette activation n’est valable que dans la session courante. La clause EXCEPT permet d’exclure des rôles accordes a l’utilisateur (mais pas via d’autres rôles) de l’activation globale. •NONE désactive tous les rôles dans la session courante (role DEFAULT inclus).