BEGIN

publicité
Créer des procédures
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Objectifs
A la fin de ce chapitre, vous pourrez :
•
•
•
décrire une procédure
•
répertorier les fonctions des différents modes des
paramètres
créer une procédure
faire la distinction entre les paramètres formels et
les paramètres réels
• créer des procédures avec des paramètres
• appeler une procédure
• traiter des exceptions dans les procédures
• supprimer une procédure
2-2
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Définition d'une procédure
2-3
•
Une procédure est un type de sous-programme
qui exécute une action
•
Une procédure peut être stockée en tant qu'objet
de schéma dans la base de données en vue
d'exécutions répétées
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Syntaxe pour la création de procédures
CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter1 [mode1] datatype1,
parameter2 [mode2] datatype2,
. . .)]
IS|AS
PL/SQL Block;
2-4
•
L'option REPLACE indique que, si la procédure
existe, elle sera supprimée et remplacée par la
nouvelle version créée avec l'instruction
•
Le bloc PL/SQL commence par BEGIN ou par la
déclaration de variables locales et se termine par
END ou par END procedure_name
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Développer des procédures
Editeur
Code de création
de procédure
1 file.sql
iSQL*Plus
2 Chargement et exécution du fichier file.sql
Oracle
Code source
Compilation
Pseudo-code
Exécution
2-5
Procédure
créée
Utiliser SHOW
ERRORS pour
visualiser les
erreurs de
compilation
3
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Paramètres formels/réels
•
Les paramètres formels sont des variables déclarées
dans la liste de paramètres d'une spécification de
sous-programme
Exemple:
CREATE PROCEDURE raise_sal(p_id NUMBER, p_amount NUMBER)
...
END raise_sal;
•
Les paramètres réels sont des variables ou des
expressions référencées dans la liste de paramètres
d'un appel de sous-programme
Exemple:
raise_sal(v_id, 2000)
2-7
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Modes des paramètres des procédures
Procédure
Paramètre IN
Environnement
appelant
Paramètre OUT
Paramètre IN OUT
(DECLARE)
BEGIN
EXCEPTION
END;
2-8
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Créer des procédures avec des paramètres
IN
OUT
Mode par défaut
Doit être indiqué
IN OUT
Doit être indiqué
La valeur est transmise au
sous-programme
Est renvoyé à
l'environnement
appelant
Est transmis à un sousprogramme ; est renvoyé
à l'environnement
appelant
Le paramètre formel se
comporte en constante
Variable non
initialisée
Variable initialisée
Le paramètre réel peut être
un littéral, une expression,
une constante ou une
variable initialisée
Doit être une
variable
Doit être une
variable
Peut se voir affecter une
valeur par défaut
Ne peut pas se
voir affecter de
valeur par défaut
Ne peut pas se voir
affecter de valeur par
défaut
2-9
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Exemples de paramètres IN
176
CREATE OR REPLACE PROCEDURE raise_salary
(p_id IN employees.employee_id%TYPE)
IS
BEGIN
UPDATE employees
SET
salary = salary * 1.10
WHERE employee_id = p_id;
END raise_salary;
/
2-10
Copyright © Oracle Corporation, 2001. Tous droits réservés.
p_id
Exemples de paramètres OUT
Environnement appelant Procédure QUERY_EMP
p_id
171
SMITH
2-11
p_name
7400
p_salary
0.15
p_comm
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Exemples de paramètres OUT
emp_query.sql
CREATE OR REPLACE PROCEDURE query_emp
(p_id
IN
employees.employee_id%TYPE,
p_name
OUT employees.last_name%TYPE,
p_salary OUT employees.salary%TYPE,
p_comm
OUT employees.commission_pct%TYPE)
IS
BEGIN
SELECT
last_name, salary, commission_pct
INTO
p_name, p_salary, p_comm
FROM
employees
WHERE
employee_id = p_id;
END query_emp;
/
2-12
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Visualiser des paramètres OUT
•
Charger et exécuter le fichier script emp_query.sql
pour créer la procédure QUERY_EMP
•
Déclarer les variables hôte, exécuter la procédure
QUERY_EMP, puis imprimer la valeur de la variable
globale G_NAME
VARIABLE g_name
VARIABLE g_sal
VARIABLE g_comm
VARCHAR2(25)
NUMBER
NUMBER
EXECUTE query_emp(171, :g_name, :g_sal, :g_comm)
PRINT g_name
2-13
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Paramètres IN OUT
Environnement appelant
'8006330575'
Procédure FORMAT_PHONE
'(800)633-0575'
p_phone_no
CREATE OR REPLACE PROCEDURE format_phone
(p_phone_no IN OUT VARCHAR2)
IS
BEGIN
p_phone_no := '(' || SUBSTR(p_phone_no,1,3) ||
')' || SUBSTR(p_phone_no,4,3) ||
'-' || SUBSTR(p_phone_no,7);
END format_phone;
/
2-15
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Visualiser des paramètres IN OUT
VARIABLE g_phone_no VARCHAR2(15)
BEGIN
:g_phone_no := '8006330575';
END;
/
PRINT g_phone_no
EXECUTE format_phone (:g_phone_no)
PRINT g_phone_no
2-16
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Méthodes de transmission des paramètres
2-17
•
Méthode positionnelle : répertorie les paramètres
réels dans le même ordre que les paramètres
formels
•
Méthode de transmission de paramètres par
association de noms : répertorie les paramètres
réels dans un ordre arbitraire en associant chacun
d'eux au paramètre formel correspondant
•
Méthode par combinaison : répertorie certains
paramètres réels en tant que paramètres
positionnels et d'autres en tant que paramètres
nommés
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Option DEFAULT des paramètres
CREATE OR REPLACE PROCEDURE add_dept
(p_name IN departments.department_name%TYPE
DEFAULT 'unknown',
p_loc
IN departments.location_id%TYPE
DEFAULT 1700)
IS
BEGIN
INSERT INTO departments(department_id,
department_name, location_id)
VALUES (departments_seq.NEXTVAL, p_name, p_loc);
END add_dept;
/
2-18
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Exemples de transmission de paramètres
BEGIN
add_dept;
add_dept ('TRAINING', 2500);
add_dept ( p_loc => 2400, p_name =>'EDUCATION');
add_dept ( p_loc => 1200) ;
END;
/
SELECT department_id, department_name, location_id
FROM departments;
…
2-19
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Déclarer des sous-programmes
leave_emp2.sql
CREATE OR REPLACE PROCEDURE leave_emp2
(p_id IN employees.employee_id%TYPE)
IS
PROCEDURE log_exec
IS
BEGIN
INSERT INTO log_table (user_id, log_date)
VALUES (USER, SYSDATE);
END log_exec;
BEGIN
DELETE FROM employees
WHERE employee_id = p_id;
log_exec;
END leave_emp2;
/
2-20
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Appeler une procédure depuis un bloc
PL/SQL anonyme
DECLARE
v_id NUMBER := 163;
BEGIN
raise_salary(v_id);
COMMIT;
...
END;
2-21
--invoke procedure
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Appeler une procédure depuis une autre
procédure
process_emps.sql
CREATE OR REPLACE PROCEDURE process_emps
IS
CURSOR emp_cursor IS
SELECT employee_id
FROM
employees;
BEGIN
FOR emp_rec IN emp_cursor
LOOP
raise_salary(emp_rec.employee_id);
END LOOP;
COMMIT;
END process_emps;
/
2-22
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Exceptions traitées
Procédure appelée
Procédure appelante
PROCEDURE
PROC2 ...
IS
...
BEGIN
...
EXCEPTION
...
END PROC2;
PROCEDURE
PROC1 ...
IS
...
BEGIN
...
PROC2(arg1);
...
EXCEPTION
La procédure
...
appelante reprend
END PROC1;
Exception déclenchée
Exception traitée
le contrôle
2-23
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Exceptions traitées
CREATE PROCEDURE p2_ins_dept(p_locid NUMBER) IS
v_did NUMBER(4);
BEGIN
DBMS_OUTPUT.PUT_LINE('Procedure p2_ins_dept started');
INSERT INTO departments VALUES (5, 'Dept 5', 145, p_locid);
SELECT department_id INTO v_did FROM employees
WHERE employee_id = 999;
END;
CREATE PROCEDURE p1_ins_loc(p_lid NUMBER, p_city VARCHAR2)
IS
v_city VARCHAR2(30); v_dname VARCHAR2(30);
BEGIN
DBMS_OUTPUT.PUT_LINE('Main Procedure p1_ins_loc');
INSERT INTO locations (location_id, city) VALUES (p_lid, p_city);
SELECT city INTO v_city FROM locations WHERE location_id = p_lid;
DBMS_OUTPUT.PUT_LINE('Inserted city '||v_city);
DBMS_OUTPUT.PUT_LINE('Invoking the procedure p2_ins_dept ...');
p2_ins_dept(p_lid);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No such dept/loc for any employee');
END;
2-24
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Exceptions non traitées
Procédure appelée
Procédure appelante
PROCEDURE
PROC2 ...
IS
...
BEGIN
...
EXCEPTION
...
END PROC2;
PROCEDURE
PROC1 ...
IS
...
Exception déclenchée
BEGIN
...
Exception non traitée
PROC2(arg1);
...
EXCEPTION
...
END PROC1;
La section de traitement
des exceptions de la
procédure appelante a
repris le contrôle
2-26
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Exceptions non traitées
CREATE PROCEDURE p2_noexcep(p_locid NUMBER) IS
v_did NUMBER(4);
BEGIN
DBMS_OUTPUT.PUT_LINE('Procedure p2_noexcep started');
INSERT INTO departments VALUES (6, 'Dept 6', 145, p_locid);
SELECT department_id INTO v_did FROM employees
WHERE employee_id = 999;
END;
CREATE PROCEDURE p1_noexcep(p_lid NUMBER, p_city VARCHAR2)
IS
v_city VARCHAR2(30); v_dname VARCHAR2(30);
BEGIN
DBMS_OUTPUT.PUT_LINE(' Main Procedure p1_noexcep');
INSERT INTO locations (location_id, city) VALUES (p_lid, p_city);
SELECT city INTO v_city FROM locations WHERE location_id = p_lid;
DBMS_OUTPUT.PUT_LINE('Inserted new city '||v_city);
DBMS_OUTPUT.PUT_LINE('Invoking the procedure p2_noexcep ...');
p2_noexcep(p_lid);
END;
2-27
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Supprimer des procédures
Supprimer une procédure stockée dans la
base de données.
Syntaxe:
DROP PROCEDURE procedure_name
Exemple:
DROP PROCEDURE raise_salary;
2-29
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Avantages liés aux sous-programmes
• Facilité de maintenance
• Sécurité et intégrité accrues des données
• Performances améliorées
• Clarté améliorée du code
2-30
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Synthèse
Ce chapitre vous a permis d'apprendre :
2-32
•
qu'une procédure est un sous-programme qui
exécute une action
•
que vous pouvez créer des procédures en utilisant la
commande CREATE PROCEDURE
•
que vous pouvez compiler et enregistrer une
procédure dans la base de données
•
que des paramètres sont utilisés pour transmettre
les données de l'environnement appelant vers la
procédure
•
qu'il existe trois modes de paramètre : IN, OUT et IN
OUT
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Synthèse
2-33
•
Les sous-programmes locaux sont des programmes
définis dans la section déclarative d'un autre
programme
•
Les procédures peuvent être appelées à partir de
n'importe quel outil ou langage prenant en charge le
langage PL/SQL
•
Vous devez être conscient de l'impact des exceptions
traitées et non traitées sur les transactions et les
procédures appelantes
•
Vous pouvez supprimer des procédures de la base de
données en utilisant la commande DROP PROCEDURE
•
Les procédures peuvent servir de blocs de
construction pour une application
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Présentation de l'exercice 2
Dans cet exercice, vous allez :
•
•
•
2-34
créer des procédures stockées pour :
–
insérer des lignes dans une table, en utilisant les
valeurs de paramètres fournies
–
mettre à jour les données d'une table pour les lignes
correspondant aux valeurs de paramètres fournies
–
supprimer d'une table les lignes correspondant aux
valeurs de paramètres fournies
–
interroger une table et extraire les données en
fonction des valeurs de paramètres fournies
traiter les exceptions dans les procédures
compiler et appeler les procédures
Copyright © Oracle Corporation, 2001. Tous droits réservés.
Téléchargement