Cours SQL ORACLE – 07-08 : PACKAGE
Les PACKAGE sont un ensemble de fonctions et/ou de procédures qui sont regroupés dans un package.
Un PACKAGE est composé de deux parties: l’entête et le corps.
La structure d’un PACKAGE est comme suit:
CREATE [OR REPLACE] PACKAGE <NOM_PACKAGE> AS
<DECLARATION PROCEDURE ET/OU FUCTION>
END;
/
CREATE [OR REPLACE] PACKAGE BODY <NOM_PACKAGE> AS
<CONTENU PROCEDURE ET/OU FUCTION>
END;
/
La partie entête comporte que la déclaration des procédures et/ou fonctions de ce package.
Alors que la partie corps comporte le corps des procédures et fonctions du package. La partie corps comporte dans sa déclaration le mot clé BODY.
Nous allons créer un package qui va comporter les procedures et fonctions des deux derniers chapitres:
CREATE OR REPLACE PACKAGE PACK_07_08 AS
PROCEDURE PKG_VERIF_EMP (PARAM1 IN EMP.EMPNO%TYPE);
FUNCTION PKG_F_VERIF_EMP(PARAM1 IN EMP.EMPNO%TYPE) RETURN NUMBER;
PROCEDURE PKG_COMPARE_CHAINE (PARAM1 IN VARCHAR2,
PARAM2 IN VARCHAR2,
RESULTAT OUT VARCHAR2);
FUNCTION PKG_F_COMPARE_CHAINE (PARAM1 IN VARCHAR2,
PARAM2 IN VARCHAR2) RETURN VARCHAR2;
FUNCTION PKG_F_MAJ_SUP_ESP_CH (PARAM1 IN VARCHAR2)
RETURN VARCHAR2;
END;
/
CREATE OR REPLACE PACKAGE BODY PACK_07_08 AS
FUNCTION PKG_TEST RETURN NUMBER IS
BEGIN
RETURN 1;
END;
PROCEDURE PKG_VERIF_EMP (PARAM1 IN EMP.EMPNO%TYPE) IS
I NUMBER;
BEGIN
SELECT 1 INTO I FROM EMP WHERE EMPNO = PARAM1;
DBMS_OUTPUT.PUT_LINE(PARAM1 || ' existe bien parmi nos employés');
EXCEPTION WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(PARAM1 || ' n''existe pas parmi nos employés');
END;
FUNCTION PKG_F_VERIF_EMP(PARAM1 IN EMP.EMPNO%TYPE) RETURN NUMBER IS
I NUMBER;
BEGIN
SELECT 1 INTO I FROM EMP WHERE EMPNO = PARAM1;
RETURN 1;
EXCEPTION WHEN NO_DATA_FOUND THEN
RETURN 0;
END;
PROCEDURE PKG_COMPARE_CHAINE (PARAM1 IN VARCHAR2,
PARAM2 IN VARCHAR2,
RESULTAT OUT VARCHAR2) IS
BEGIN
RESULTAT := 'FAUX';
IF UPPER(PARAM1) = UPPER(PARAM2) THEN
RESULTAT := 'VRAI';
END IF;
END;
FUNCTION PKG_F_COMPARE_CHAINE (PARAM1 IN VARCHAR2,
PARAM2 IN VARCHAR2) RETURN VARCHAR2
IS
BEGIN
IF UPPER(PARAM1) = UPPER(PARAM2) THEN
RETURN 'VRAI';
END IF;
RETURN 'FAUX';
END;
PROCEDURE PKG_MAJ_SUP_ESP_CH (PARAM1 IN OUT VARCHAR2) IS
BEGIN
PARAM1 := UPPER(PARAM1);
PARAM1 := REPLACE(PARAM1, ' ', '');
END;
FUNCTION PKG_F_MAJ_SUP_ESP_CH (PARAM1 IN VARCHAR2)
RETURN VARCHAR2 IS
VAR VARCHAR2(4000);
BEGIN
VAR := REPLACE(UPPER(PARAM1), ' ', '');
RETURN VAR;
END;
END;
/
Le résultat lors de l’exécution de ce code est le suivant:
Package créé.
Corps de package créé.
Nous pouvons faire appel à l’une des fonctions et procédures de ce package comme le montre l’exemple suivant:
SELECT
PACK_07_08.PKG_F_COMPARE_CHAINE('Bonjour COURS SQL', 'Bonjour Cours Sql')
FROM DUAL;
PKG_F_COMPARE_CHAINE('BONJOURCOURSSQL','BONJOURCOURSSQL')
-----------------------------------------------------
VRAI
Enfin, notez qu’on peut créer une fonction ou une procédure dans la partie corps sans la déclarée dans la partie entête du package. Dans ce cas, la fonction ou la procédure créée ne sera accessible que dans les autres fonctions ou procédures du même package à condition que cette fonction ou procédure soit déclaré avant celle qui fait appel à elle.
SELECT
PACK_07_08.PKG_TEST
FROM DUAL;
Error starting at line 1 in command:
SELECT PACK_07_08.PKG_TEST FROM DUAL
Error at Command Line:1 Column:7
Error report:
SQL Error: ORA-00904: "PACK_07_08"."PKG_TEST": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action: