6 Copyright © Oracle Corporation, Tous droits réservés. Autres concepts relatifs aux packages
6-2 Copyright © Oracle Corporation, Tous droits réservés. Objectifs A la fin de ce chapitre, vous pourrez : écrire des packages utilisant la fonction de surcharge décrire les erreurs liées aux sous-programmes à référence mutuelle initialiser des variables avec une procédure à exécution unique identifier des états persistants
6-3 Copyright © Oracle Corporation, Tous droits réservés. Surcharge Permet d'utiliser un même nom pour différents sous-programmes d'un bloc PL/SQL, d'un sous- programme ou d'un package Exige que les paramètres formels des sous- programmes soient différents en termes de nombre, d'ordre ou de famille de type de données Permet d'offrir une souplesse accrue dans la mesure où un utilisateur ou une application n'est pas limité(e) par un type de données particulier, ni par le nombre de paramètres formels Remarque : La surcharge ne peut être appliquée qu'aux sous-programmes locaux ou présentés sous forme de packages. Elle ne peut pas être appliquée aux sous-programmes autonomes.
6-4 Copyright © Oracle Corporation, Tous droits réservés.
6-5 Copyright © Oracle Corporation, Tous droits réservés. Exemple de surcharge CREATE OR REPLACE PACKAGE over_pack IS PROCEDURE add_dept (p_deptno IN departments.department_id%TYPE, p_name IN departments.department_name%TYPE DEFAULT 'unknown', p_loc IN departments.location_id%TYPE DEFAULT 0); PROCEDURE add_dept (p_name IN departments.department_name%TYPE DEFAULT 'unknown', p_loc IN departments.location_id%TYPE DEFAULT 0); END over_pack; / over_pack.sql
6-6 Copyright © Oracle Corporation, Tous droits réservés. Exemple de surcharge CREATE OR REPLACE PACKAGE BODY over_pack IS PROCEDURE add_dept (p_deptno IN departments.department_id%TYPE, p_name IN departments.department_name%TYPE DEFAULT 'unknown', p_loc IN departments.location_id%TYPE DEFAULT 0) IS BEGIN INSERT INTO departments (department_id, department_name, location_id) VALUES (p_deptno, p_name, p_loc); END add_dept; PROCEDURE add_dept (p_name IN departments.department_name%TYPE DEFAULT 'unknown', p_loc IN departments.location_id%TYPE DEFAULT 0) IS BEGIN INSERT INTO departments (department_id, department_name, location_id) VALUES (departments_seq.NEXTVAL, p_name, p_loc); END add_dept; END over_pack; / over_pack_body.sql
6-7 Copyright © Oracle Corporation, Tous droits réservés. Exemple de surcharge La plupart des fonctions intégrées font l'objet d'une surcharge Par exemple, reportez-vous à la fonction TO_CHAR du package STANDARD Si vous déclarez à nouveau un sous-programme intégré dans un programme PL/SQL, votre déclaration locale remplace la déclaration globale FUNCTION TO_CHAR (p1 DATE) RETURN VARCHAR2; FUNCTION TO_CHAR (p2 NUMBER) RETURN VARCHAR2; FUNCTION TO_CHAR (p1 DATE, P2 VARCHAR2) RETURN VARCHAR2; FUNCTION TO_CHAR (p1 NUMBER, P2 VARCHAR2) RETURN VARCHAR2;
6-8 Copyright © Oracle Corporation, Tous droits réservés. Utiliser les pré-déclarations Vous devez déclarer des identificateurs avant de les référencer. CREATE OR REPLACE PACKAGE BODY forward_pack IS PROCEDURE award_bonus(...) IS BEGIN calc_rating(...); --illegal reference END; PROCEDURE calc_rating(...) IS BEGIN... END; END forward_pack; /
6-9 Copyright © Oracle Corporation, Tous droits réservés. Utiliser les pré-déclarations CREATE OR REPLACE PACKAGE BODY forward_pack IS PROCEDURE calc_rating(...); -- forward declaration PROCEDURE award_bonus(...) IS-- subprograms defined BEGIN -- in alphabetical order calc_rating(...);... END; PROCEDURE calc_rating(...) IS BEGIN... END; END forward_pack; /
6-10 Copyright © Oracle Corporation, Tous droits réservés. Créer une procédure à exécution unique CREATE OR REPLACE PACKAGE taxes IS tax NUMBER; declare all public procedures/functions END taxes; / CREATE OR REPLACE PACKAGE BODY taxes IS declare all private variables define public/private procedures/functions BEGIN SELECT rate_value INTO tax FROM tax_rates WHERE rate_name = 'TAX'; END taxes; /
6-11 Copyright © Oracle Corporation, Tous droits réservés. Restrictions relatives aux fonctions de package utilisées en SQL Une fonction appelée depuis : une interrogation ou une instruction LMD (Langage de manipulation de données) ne peut pas terminer la transaction en cours, effectuer une création ou une annulation par rapport à un savepoint, ou modifier ( ALTER ) le système ou la session une instruction d'interrogation ou une instruction LMD en parallèle ne peut pas exécuter une instruction LMD ou modifier la base de données une fonction appelée depuis une instruction LMD ne peut pas lire ou modifier la table que l'instruction LMD est en train de modifier Remarque : Les appels de sous-programmes qui ne respectent pas les restrictions ci-dessus ne sont pas autorisés.
6-12 Copyright © Oracle Corporation, Tous droits réservés. CREATE OR REPLACE PACKAGE taxes_pack IS FUNCTION tax (p_value IN NUMBER) RETURN NUMBER; END taxes_pack; / Package défini par l'utilisateur : taxes_pack CREATE OR REPLACE PACKAGE BODY taxes_pack IS FUNCTION tax (p_value IN NUMBER) RETURN NUMBER IS v_rate NUMBER := 0.08; BEGIN RETURN (p_value * v_rate); END tax; END taxes_pack; /
6-13 Copyright © Oracle Corporation, Tous droits réservés. Appeler une fonction de package définie par l'utilisateur depuis une instruction SQL SELECT taxes_pack.tax(salary), salary, last_name FROM employees; …
6-14 Copyright © Oracle Corporation, Tous droits réservés. Exemple d'état persistant de variables de package CREATE OR REPLACE PACKAGE comm_package IS g_comm NUMBER := 10; --valeur initiale 10 PROCEDURE reset_comm (p_comm IN NUMBER); END comm_package; / CREATE OR REPLACE PACKAGE BODY comm_package IS FUNCTION validate_comm (p_comm IN NUMBER) RETURN BOOLEAN IS v_max_comm NUMBER; BEGIN valide la commission comme étant inférieure à la commission -- maximale dans la table END validate_comm; PROCEDURE reset_comm (p_comm IN NUMBER) IS BEGIN appelle validate_comm avec la valeur indiquée END reset_comm; END comm_package; /
6-15 Copyright © Oracle Corporation, Tous droits réservés. Etat persistant des variables de package Heure 9:00 EXECUTE comm_package.reset_comm (0.25) max_comm =0.4 > 0.25 g_comm = :30 INSERT INTO employees (last_name, commission_pct) VALUES ('Madonna', 0.8); max_comm =0.8 9:35 EXECUTE comm_package.reset_comm(0.5) max_comm =0.8 > 0.5 g_comm = 0.5 Scott Jones
6-16 Copyright © Oracle Corporation, Tous droits réservés. Etat persistant des variables de package Heure 9:00 EXECUTE comm_package.reset_comm (0.25) max_comm =0.4 > 0.25 g_comm = :30 INSERT INTO employees (last_name, commission_pct) VALUES ('Madonna', 0.8); max_comm =0.8 9:35 EXECUTE comm_package.reset_comm(0.5) max_comm =0.8 > 0.5 g_comm = :00 EXECUTE comm_package.reset_comm (0.6) max_comm =0.4 < 0.6 INVALIDE 11:00 ROLLBACK; 11:01 EXIT Scott Jones
6-17 Copyright © Oracle Corporation, Tous droits réservés. Etat persistant des variables de package Heure 9:00 EXECUTE comm_package.reset_comm (0.25) max_comm =0.4 > 0.25 g_comm = :30 INSERT INTO employees (last_name, commission_pct) VALUES ('Madonna', 0.8); max_comm =0.8 9:35 EXECUTE comm_package.reset_comm(0.5) max_comm =0.8 > 0.5 g_comm = :00 EXECUTE comm_package.reset_comm (0.6) max_comm =0.4 < 0.6 INVALIDE 11:00 ROLLBACK; 11:01 EXIT 11:45 Nouvelle connexion. g_comm = 10, max_comm =0.4 12:00 EXECUTE comm_package.reset_comm(0.25) Scott Jones VALIDE
6-18 Copyright © Oracle Corporation, Tous droits réservés. Contrôler l'état persistant d'un curseur de package CREATE OR REPLACE PACKAGE pack_cur IS CURSOR c1 IS SELECT employee_id FROM employees ORDER BY employee_id DESC; PROCEDURE proc1_3rows; PROCEDURE proc4_6rows; END pack_cur; / Exemple:
6-19 Copyright © Oracle Corporation, Tous droits réservés. CREATE OR REPLACE PACKAGE BODY pack_cur IS v_empno NUMBER; PROCEDURE proc1_3rows IS BEGIN OPEN c1; LOOP FETCH c1 INTO v_empno; DBMS_OUTPUT.PUT_LINE('Id :' ||(v_empno)); EXIT WHEN c1%ROWCOUNT >= 3; END LOOP; END proc1_3rows; PROCEDURE proc4_6rows IS BEGIN LOOP FETCH c1 INTO v_empno; DBMS_OUTPUT.PUT_LINE('Id :' ||(v_empno)); EXIT WHEN c1%ROWCOUNT >= 6; END LOOP; CLOSE c1; END proc4_6rows; END pack_cur; / Contrôler l'état persistant d'un curseur de package
6-20 Copyright © Oracle Corporation, Tous droits réservés. Exécuter PACK_CUR SET SERVEROUTPUT ON EXECUTE pack_cur.proc1_3rows EXECUTE pack_cur.proc4_6rows
6-21 Copyright © Oracle Corporation, Tous droits réservés. CREATE OR REPLACE PACKAGE BODY emp_package IS PROCEDURE read_emp_table (p_emp_table OUT emp_table_type) IS i BINARY_INTEGER := 0; BEGIN FOR emp_record IN (SELECT * FROM employees) LOOP p_emp_table(i) := emp_record; i:= i+1; END LOOP; END read_emp_table; END emp_package; / Tables et enregistrements PL/SQL dans les packages CREATE OR REPLACE PACKAGE emp_package IS TYPE emp_table_type IS TABLE OF employees%ROWTYPE INDEX BY BINARY_INTEGER; PROCEDURE read_emp_table (p_emp_table OUT emp_table_type); END emp_package; /
6-22 Copyright © Oracle Corporation, Tous droits réservés. Synthèse Ce chapitre vous a permis d'apprendre à : appliquer des surcharges aux sous-programmes utiliser les références amont utiliser les procédures à exécution unique décrire le niveau de pureté des fonctions de package identifier l'état persistant des objets de package
6-23 Copyright © Oracle Corporation, Tous droits réservés. Présentation de l'exercice 6 Dans cet exercice, vous allez : utiliser des sous-programmes surchargés créer une procédure à exécution unique Dans cet exercice, vous allez : utiliser des sous-programmes surchargés créer une procédure à exécution unique
6-24 Copyright © Oracle Corporation, Tous droits réservés.