29
2 Copyright © Oracle Corporation, 2001. Tous droits réservés. Créer des procédures

Créer des procédures

Embed Size (px)

DESCRIPTION

Créer des procédures. Objectifs. A la fin de ce chapitre, vous pourrez : décrire une procédure créer une procédure faire la distinction entre les paramètres formels et les paramètres réels répertorier les fonctions des différents modes des paramètres créer des procédures avec des paramètres - PowerPoint PPT Presentation

Citation preview

2Copyright © Oracle Corporation, 2001. Tous droits réservés.

Créer des procédures

2-2 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Objectifs

A la fin de ce chapitre, vous pourrez :

• décrire une procédure

• créer une procédure

• faire la distinction entre les paramètres formels et les paramètres réels

• répertorier les fonctions des différents modes des paramètres

• 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-3 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Définition d'une procédure

• 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

2-4 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|ASPL/SQL Block;

• 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

2-5 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Développer des procédures

1Editeur

Code de création de procédure

file.sql

iSQL*Plus

2 Chargement et exécution du fichier file.sql

Oracle Code source Compila-

tion

Pseudo-code

Utiliser SHOW ERRORS pour visualiser les erreurs de compilation

Procédure créée

Exécution 3

2-7 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Paramètres formels/réelsParamè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)

• 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-8 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Modes des paramètres des procédures

Environnement appelant

Procédure

(DECLARE)

BEGIN

EXCEPTION

END;

Paramètre IN

Paramètre OUT

Paramètre IN OUT

2-9 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Créer des procédures avec des paramètres

Peut se voir affecter une valeur par défaut

Le paramètre réel peut être un littéral, une expression, une constante ou une variable initialisée

Variable initialiséeVariable non initialisée

Le paramètre formel se comporte en constante

Est transmis à un sous-programme ; est renvoyé à l'environnement appelant

Est renvoyé à l'environnement appelant

La valeur est transmise au sous-programme

Mode par défaut

IN OUTOUTIN

Doit être indiqué

Doit être une variable

Doit être indiqué

Doit être une variable

Ne peut pas se voir affecter de valeur par défaut

Ne peut pas se voir affecter de valeur par défaut

2-10 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Exemples de paramètres IN

p_id176

CREATE OR REPLACE PROCEDURE raise_salary (p_id IN employees.employee_id%TYPE)ISBEGIN UPDATE employees SET salary = salary * 1.10 WHERE employee_id = p_id;END raise_salary;/

2-11 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Exemples de paramètres OUT

Environnement appelant Procédure QUERY_EMP

p_id

p_name

p_salary

p_comm

171

SMITH

7400

0.15

2-12 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Exemples de paramètres OUTExemples de paramètres OUT

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)ISBEGIN SELECT last_name, salary, commission_pct INTO p_name, p_salary, p_comm FROM employees WHERE employee_id = p_id;END query_emp;/

emp_query.sqlemp_query.sql

2-13 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 VARCHAR2(25)VARIABLE g_sal NUMBERVARIABLE g_comm NUMBER

EXECUTE query_emp(171, :g_name, :g_sal, :g_comm)

PRINT g_name

2-15 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Paramètres IN OUT

Environnement appelant Procédure FORMAT_PHONE

p_phone_no'(800)633-0575' '8006330575'

CREATE OR REPLACE PROCEDURE format_phone (p_phone_no IN OUT VARCHAR2)ISBEGIN p_phone_no := '(' || SUBSTR(p_phone_no,1,3) || ')' || SUBSTR(p_phone_no,4,3) || '-' || SUBSTR(p_phone_no,7);END format_phone;/

2-16 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_noEXECUTE format_phone (:g_phone_no)PRINT g_phone_no

2-17 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Méthodes de transmission des paramètres

• 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

2-18 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)ISBEGIN INSERT INTO departments(department_id, department_name, location_id) VALUES (departments_seq.NEXTVAL, p_name, p_loc);END add_dept;/

2-19 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_idFROM departments;

2-20 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Déclarer des sous-programmes

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;/

leave_emp2.sqlleave_emp2.sql

2-21 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Appeler une procédure depuis un bloc PL/SQL anonyme

Appeler une procédure depuis un bloc PL/SQL anonyme

DECLARE v_id NUMBER := 163;BEGIN raise_salary(v_id); --invoke procedure COMMIT;...END;

2-22 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Appeler une procédure depuis une autre procédure

Appeler une procédure depuis une autre procédure

CREATE OR REPLACE PROCEDURE process_empsIS 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;/

process_emps.sqlprocess_emps.sql

2-23 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Exceptions traitées

PROCEDUREPROC2 ...IS ...BEGIN ...EXCEPTION ...END PROC2;

Procédure appelée

Procédure appelante

PROCEDUREPROC1 ...IS ...BEGIN ... PROC2(arg1); ...EXCEPTION ...END PROC1;

Exception déclenchée

Exception traitée

La procédure appelante reprend le contrôle

2-24 Copyright © Oracle Corporation, 2001. Tous droits réservés.

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;

Exceptions traitéesCREATE 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;

2-26 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Exceptions non traitées

PROCEDUREPROC2 ...IS ...BEGIN ...EXCEPTION ...END PROC2;

Procédure appelée

Exception déclenchée

PROCEDUREPROC1 ...IS ...BEGIN ... PROC2(arg1); ...EXCEPTION ...END PROC1;

Procédure appelante

Exception non traitée

La section de traitement des exceptions de la procédure appelante a repris le contrôle

2-27 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Exceptions non traitéesCREATE 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-29 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Supprimer des procéduresSupprimer des procédures

Supprimer une procédure stockée dans la base de données.Supprimer une procédure stockée dans la base de données.

DROP PROCEDURE procedure_name

Syntaxe:

Exemple:

Syntaxe:

Exemple:

DROP PROCEDURE raise_salary;

2-30 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-32 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Synthèse

Ce chapitre vous a permis d'apprendre :

• 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

2-33 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Synthèse

• 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

2-34 Copyright © Oracle Corporation, 2001. Tous droits réservés.

Présentation de l'exercice 2

Dans cet exercice, vous allez :

• 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