Vous êtes sur la page 1sur 14

9

Créer des procédures stockées


et des fonctions stockées

Copyright © Oracle, 2004. Tous droits réservés.


Objectifs

A la fin de ce chapitre, vous pourrez :


• faire la distinction entre les blocs anonymes et les
sous-programmes
• créer une procédure simple et l'appeler à partir
d'un bloc anonyme
• créer une fonction simple
• créer une fonction simple qui accepte un
paramètre
• faire la distinction entre les procédures et les
fonctions

Copyright © Oracle, 2004. Tous droits réservés.


Procédures et fonctions

• Blocs PL/SQL nommés


• Appelés sous-programmes PL/SQL
• Présentent des structures de bloc semblables à
celle des blocs anonymes :
– Section déclarative facultative (sans le mot-clé
DECLARE)
– Section exécutable obligatoire
– Section facultative de traitement
des exceptions

Copyright © Oracle, 2004. Tous droits réservés.


Différences entre les blocs anonymes
et les sous-programmes
Blocs anonymes Sous-programmes

Blocs PL/SQL non nommés Blocs PL/SQL nommés

Compilés chaque fois Compilés une seule fois

Non stockés dans la base de Stockés dans la base de données


données

Pas d'appel possible par Appel possible par d'autres


d'autres applications applications, car nommés

Ne renvoient pas de valeurs Les sous-programmes appelés


fonctions doivent renvoyer des valeurs

Ne peuvent pas accepter de Peuvent accepter des paramètres


paramètres
Copyright © Oracle, 2004. Tous droits réservés.
Procédure : syntaxe

CREATE [OR REPLACE] PROCEDURE procedure_name


[(argument1 [mode1] datatype1,
argument2 [mode2] datatype2,
. . .)]
IS|AS
procedure_body;

Copyright © Oracle, 2004. Tous droits réservés.


Procédure : exemple

...
CREATE TABLE dept AS SELECT * FROM departments;
CREATE PROCEDURE add_dept IS
dept_id dept.department_id%TYPE;
dept_name dept.department_name%TYPE;
BEGIN
dept_id:=280;
dept_name:='ST-Curriculum';
INSERT INTO dept(department_id,department_name)
VALUES(dept_id,dept_name);
DBMS_OUTPUT.PUT_LINE(' Inserted '||
SQL%ROWCOUNT ||' row ');
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Appeler la procédure

BEGIN
add_dept;
END;
/
SELECT department_id, department_name FROM
dept WHERE department_id=280;

Copyright © Oracle, 2004. Tous droits réservés.


Fonction : syntaxe

CREATE [OR REPLACE] FUNCTION function_name


[(argument1 [mode1] datatype1,
argument2 [mode2] datatype2,
. . .)]
RETURN datatype
IS|AS
function_body;

Copyright © Oracle, 2004. Tous droits réservés.


Fonction : exemple
CREATE FUNCTION check_sal RETURN Boolean IS
dept_id employees.department_id%TYPE;
empno employees.employee_id%TYPE;
sal employees.salary%TYPE;
avg_sal employees.salary%TYPE;
BEGIN
empno:=205;
SELECT salary,department_id INTO sal,dept_id
FROM employees WHERE employee_id= empno;
SELECT avg(salary) INTO avg_sal FROM employees
WHERE department_id=dept_id;
IF sal > avg_sal THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL;
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Appeler une fonction

SET SERVEROUTPUT ON
BEGIN
IF (check_sal IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('The function returned
NULL due to exception');
ELSIF (check_sal) THEN
DBMS_OUTPUT.PUT_LINE('Salary > average');
ELSE
DBMS_OUTPUT.PUT_LINE('Salary < average');
END IF;
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Transmettre un paramètre à une fonction
DROP FUNCTION check_sal;
/
CREATE FUNCTION check_sal(empno employees.employee_id%TYPE)
RETURN Boolean IS
dept_id employees.department_id%TYPE;
sal employees.salary%TYPE;
avg_sal employees.salary%TYPE;
BEGIN
SELECT salary,department_id INTO sal,dept_id
FROM employees WHERE employee_id=empno;
SELECT avg(salary) INTO avg_sal FROM employees
WHERE department_id=dept_id;
IF sal > avg_sal THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
EXCEPTION ...
...

Copyright © Oracle, 2004. Tous droits réservés.


Appeler une fonction avec un paramètre
BEGIN
DBMS_OUTPUT.PUT_LINE('Checking for employee with id 205');
IF (check_sal(205) IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('The function returned
NULL due to exception');
ELSIF (check_sal(205)) THEN
DBMS_OUTPUT.PUT_LINE('Salary > average');
ELSE
DBMS_OUTPUT.PUT_LINE('Salary < average');
END IF;
DBMS_OUTPUT.PUT_LINE('Checking for employee with id 70');
IF (check_sal(70) IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('The function returned
NULL due to exception');
ELSIF (check_sal(70)) THEN
...
END IF;
END;
/
PUT THE SCREENSHOT OF OUTPUT HERE
Copyright © Oracle, 2004. Tous droits réservés.
Synthèse

Ce chapitre vous a permis d'apprendre à :


• créer une procédure simple
• appeler la procédure à partir d'un bloc anonyme
• créer une fonction simple
• créer une fonction simple qui accepte des
paramètres
• appeler la fonction à partir d'un bloc anonyme

Copyright © Oracle, 2004. Tous droits réservés.


Présentation de l'exercice 9

Cet exercice porte sur les points suivants :


• convertir un bloc anonyme existant en procédure
• modifier la procédure afin d'accepter un paramètre
• écrire un bloc anonyme afin d'appeler la
procédure

Copyright © Oracle, 2004. Tous droits réservés.

Vous aimerez peut-être aussi