Oracle Package PL/SQL : type, spécification, corps [Exemple]
Qu'est-ce que le paquet dans Oracle?
Le package PL/SQL est un regroupement logique d’un sous-programme associé (procédure/fonction) en un seul élément. Un package est compilé et stocké en tant qu’objet de base de données pouvant être utilisé ultérieurement.
Composants des packages
Le package PL/SQL comporte deux composants.
- Spécifications du paquet
- Corps du paquet
Spécifications du paquet
La spécification du package consiste en une déclaration de tous les les variables, curseurs, objets, procédures, fonctions et exceptions.
Vous trouverez ci-dessous quelques caractéristiques de la spécification du package.
- Les éléments qui sont tous déclarés dans la spécification sont accessibles depuis l'extérieur du package. De tels éléments sont appelés éléments publics.
- La spécification du package est un élément autonome, ce qui signifie qu'elle peut exister seule sans le corps du package.
- Chaque fois qu'un package a fait référence, une instance du package est créée pour cette session particulière.
- Une fois l'instance créée pour une session, tous les éléments du package initiés dans cette instance sont valides jusqu'à la fin de la session.
Syntaxe
CREATE [OR REPLACE] PACKAGE <package_name> IS <sub_program and public element declaration> . . END <package name>
La syntaxe ci-dessus montre la création d'une spécification de package.
Corps du paquet
Il consiste en la définition de tous les éléments présents dans la spécification du package. Il peut également avoir une définition d'éléments qui ne sont pas déclarés dans la spécification, ces éléments sont appelés éléments privés et ne peuvent être appelés que depuis l'intérieur du package.
Vous trouverez ci-dessous les caractéristiques d'un corps de colis.
- Il doit contenir des définitions pour tous les sous-programmes/curseurs qui ont été déclarés dans le cahier des charges.
- Il peut également contenir davantage de sous-programmes ou d'autres éléments qui ne sont pas déclarés dans la spécification. C’est ce qu’on appelle des éléments privés.
- C'est un objet fiable et cela dépend des spécifications du package.
- L'état du corps du package devient « Invalide » chaque fois que la spécification est compilée. Par conséquent, il doit être recompilé à chaque fois après la compilation de la spécification.
- Les éléments privés doivent d’abord être définis avant d’être utilisés dans le corps du package.
- La première partie du package est la partie déclaration globale. Cela inclut les variables, les curseurs et les éléments privés (déclaration directe) visibles par l'ensemble du package.
- La dernière partie du package est la partie d'initialisation du package qui s'exécute une fois chaque fois qu'un package est référencé pour la première fois dans la session.
syntaxe:
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <global_declaration part> <Private element definition> <sub_program and public element definition> . <Package Initialization> END <package_name>
- La syntaxe ci-dessus montre la création du corps du package.
Nous allons maintenant voir comment référencer des éléments de package dans le programme.
Éléments de package référents
Une fois les éléments déclarés et définis dans le package, nous devons référencer les éléments pour les utiliser.
Tous les éléments publics du package peuvent être référencés en appelant le nom du package suivi du nom de l'élément séparé par un point, c'est-à-dire ' . '.
La variable publique du package peut également être utilisée de la même manière pour leur attribuer et récupérer des valeurs, c'est-à-dire ' . '.
Créer un package en PL/SQL
En PL/SQL, chaque fois qu'un package est référencé/appelé dans une session, une nouvelle instance sera créée pour ce package.
Oracle fournit une fonctionnalité permettant d'initialiser les éléments du package ou d'effectuer toute activité au moment de la création de cette instance via « Initialisation du package ».
Ce n'est rien d'autre qu'un bloc d'exécution qui est écrit dans le corps du package après avoir défini tous les éléments du package. Ce bloc sera exécuté chaque fois qu'un package est référencé pour la première fois dans la session.
Syntaxe
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element definition> <sub_program and public element definition> . BEGINE <Package Initialization> END <package_name>
- La syntaxe ci-dessus montre la définition de l'initialisation du package dans le corps du package.
Déclarations à terme
La déclaration/référence directe dans le package n'est rien d'autre que la déclaration des éléments privés séparément et leur définition dans la dernière partie du corps du package.
Les éléments privés ne peuvent être référencés que s'ils sont déjà déclarés dans le corps du package. Pour cette raison, la déclaration anticipée est utilisée. Mais son utilisation est plutôt inhabituelle car la plupart du temps, les éléments privés sont déclarés et définis dans la première partie du corps du package.
La déclaration anticipée est une option proposée par Oracle, ce n'est pas obligatoire et l'utilisation et la non-utilisation dépendent des exigences du programmeur.
syntaxe:
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element declaration> . . . <Public element definition that refer the above private element> . . <Private element definition> . BEGIN <package_initialization code>; END <package_name>
La syntaxe ci-dessus montre une déclaration directe. Les éléments privés sont déclarés séparément dans la partie avant du package, et ils ont été définis dans la partie ultérieure.
Utilisation des curseurs dans le package
Contrairement aux autres éléments, il faut être prudent lors de l'utilisation des curseurs à l'intérieur du package.
Si le curseur est défini dans la spécification du package ou dans la partie globale du corps du package, alors le curseur une fois ouvert persistera jusqu'à la fin de la session.
Il faut donc toujours utiliser les attributs du curseur '%ISOPEN' pour vérifier l'état du curseur avant de le référencer.
Surcharge
La surcharge est le concept consistant à avoir plusieurs sous-programmes portant le même nom. Ces sous-programmes différeront les uns des autres par un certain nombre de paramètres ou types de paramètres ou type de retour, c'est-à-dire qu'un sous-programme portant le même nom mais avec un nombre de paramètres différent, un type de paramètres différent ou un retype différent sont considérés comme une surcharge.
Ceci est utile lorsque de nombreux sous-programmes doivent effectuer la même tâche, mais que la manière d’appeler chacun d’eux doit être différente. Dans ce cas, le nom du sous-programme restera le même pour tous et les paramètres seront modifiés conformément à l'instruction appelante.
Exemple 1: Dans cet exemple, nous allons créer un package pour obtenir et définir les valeurs des informations sur l'employé dans la table 'emp'. La fonction get_record renverra la sortie du type d'enregistrement pour le numéro d'employé donné, et la procédure set_record insérera l'enregistrement du type d'enregistrement dans la table emp.
Étape 1) Création de spécifications de package
CREATE OR REPLACE PACKAGE guru99_get_set IS PROCEDURE set_record (p_emp_rec IN emp%ROWTYPE); FUNCTION get record (p_emp no IN NUMBER) RETURN emp%ROWTYPE; END guru99_get_set: /
Sortie :
Package created
Explication du code
- Ligne de code 1-5: Création de la spécification du package pour guru99_get_set avec une procédure et une fonction. Ces deux éléments sont désormais des éléments publics de ce package.
Étape 2) Le package contient le corps du package, où la définition réelle de toutes les procédures et fonctions sera définie. Dans cette étape, le corps du package est créé.
CREATE OR REPLACE PACKAGE BODY guru99_get_set IS PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE) IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO emp VALUES(p_emp_rec.emp_name,p_emp_rec.emp_no; p_emp_rec.salary,p_emp_rec.manager); COMMIT; END set_record; FUNCTION get_record(p_emp_no IN NUMBER) RETURN emp%ROWTYPE IS l_emp_rec emp%ROWTYPE; BEGIN SELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_no RETURN l_emp_rec; END get_record; BEGUN dbms_output.put_line(‘Control is now executing the package initialization part'); END guru99_get_set: /
Sortie :
Package body created
Explication du code
- Ligne de code 7: Création du corps du package.
- Ligne de code 9-16: Définition de l'élément 'set_record' déclaré dans la spécification. Cela revient à définir la procédure autonome dans PL/SQL.
- Ligne de code 17 à 24 : Définition de l'élément 'get_record'. Cela revient à définir la fonction autonome.
- Ligne de code 25 à 26 : Définition de la partie initialisation du package.
Étape 3) Création d'un bloc anonyme pour insérer et afficher les enregistrements en faisant référence au package créé ci-dessus.
DECLARE l_emp_rec emp%ROWTYPE; l_get_rec emp%ROWTYPE; BEGIN dbms output.put line(‘Insert new record for employee 1004'); l_emp_rec.emp_no:=l004; l_emp_rec.emp_name:='CCC'; l_emp_rec.salary~20000; l_emp_rec.manager:=’BBB’; guru99_get_set.set_record(1_emp_rec); dbms_output.put_line(‘Record inserted'); dbms output.put line(‘Calling get function to display the inserted record'): l_get_rec:=guru99_get_set.get_record(1004); dbms_output.put_line(‘Employee name: ‘||l_get_rec.emp_name); dbms_output.put_line(‘Employee number:‘||l_get_rec.emp_no); dbms_output.put_line(‘Employee salary:‘||l_get_rec.salary'); dbms output.put line(‘Employee manager:‘||1_get_rec.manager); END: /
Sortie :
Insert new record for employee 1004 Control is now executing the package initialization part Record inserted Calling get function to display the inserted record Employee name: CCC Employee number: 1004 Employee salary: 20000 Employee manager: BBB
Explication du code :
- Ligne de code 34 à 37 : Remplir les données de la variable de type d'enregistrement dans un bloc anonyme pour appeler l'élément 'set_record' du package.
- Ligne de code 38 : Un appel a été effectué vers 'set_record' du package guru99_get_set. Le package est désormais instancié et il persistera jusqu'à la fin de la session.
- La partie initialisation du package est exécutée puisqu’il s’agit du premier appel au package.
- L'enregistrement inséré par l'élément 'set_record' dans la table.
- Ligne de code 41 : Appel de l'élément 'get_record' pour afficher les détails de l'employé inséré.
- Le package est référencé pour la deuxième fois lors de l'appel 'get_record' au package. Mais la partie initialisation n'est pas exécutée cette fois car le package est déjà initialisé dans cette session.
- Ligne de code 42 à 45 : Impression des détails de l'employé.
Dépendance dans les packages
Étant donné que le package est un regroupement logique d’éléments liés, il comporte certaines dépendances. Voici les dépendances à prendre en compte.
- Une spécification est un objet autonome.
- Le corps d'un package dépend de la spécification.
- Le corps du package peut être compilé séparément. Chaque fois que la spécification est compilée, le corps doit être recompilé car il deviendra invalide.
- Le sous-programme du corps du package qui dépend d'un élément privé ne doit être défini qu'après la déclaration de l'élément privé.
- Les objets de base de données référencés dans la spécification et le corps doivent avoir un statut valide au moment de la compilation du package.
Informations sur le forfait
Une fois les informations du package créées, les informations du package telles que la source du package, les détails du sous-programme et les détails de surcharge sont disponibles dans le Oracle tableaux de définition de données.
Le tableau ci-dessous donne le tableau de définition des données et les informations sur le package disponibles dans le tableau.
Nom de la table | Description | Question |
---|---|---|
ALL_OBJECT | Donne les détails du package comme object_id, Creation_date, last_ddl_time, etc. Il contiendra les objets créés par tous les utilisateurs. | SELECT * FROM all_objects où object_name =' ' |
USER_OBJECT | Donne les détails du package comme object_id, Creation_date, last_ddl_time, etc. Il contiendra les objets créés par l'utilisateur actuel. | SELECT * FROM user_objects où object_name =' ' |
ALL_SOURCE | Donne la source des objets créés par tous les utilisateurs. | SELECT * FROM all_source où nom=' ' |
USER_SOURCE | Donne la source des objets créés par l'utilisateur actuel. | SELECT * FROM user_source où nom=' ' |
ALL_PROCEDURES | Donne les détails du sous-programme comme object_id, les détails de surcharge, etc. créés par tous les utilisateurs. | SELECT * FROM all_procedures Où nom_objet=' ' |
USER_PROCEDURES | Donne les détails du sous-programme comme object_id, les détails de surcharge, etc. créés par l'utilisateur actuel. | SELECT * FROM user_procedures Où nom_objet=' ' |
FICHIER UTL – Un aperçu
Le fichier UTL est le package utilitaire distinct fourni par Oracle pour effectuer des tâches spéciales. Ceci est principalement utilisé pour lire et écrire les fichiers du système d'exploitation à partir de packages ou de sous-programmes PL/SQL. Il a les fonctions distinctes pour mettre les informations et pour obtenir les informations à partir des fichiers. Il permet également de lire/écrire dans le jeu de caractères natif.
Le programmeur peut l'utiliser pour écrire des fichiers du système d'exploitation de n'importe quel type et le fichier sera écrit directement sur le serveur de base de données. Le nom et le chemin du répertoire seront mentionnés au moment de la rédaction.
Résumé
Nous avons maintenant appris les packages dans PL / SQL, et vous devriez maintenant être capable de travailler dans ce qui suit.
- Packages PL/SQL et ses composants
- Caractéristiques des forfaits
- Référencer et surcharger des éléments de package
- Gestion des dépendances dans les packages
- Affichage des informations sur le package
- Qu'est-ce qu'un fichier UTL