La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Packages fournis par Oracle

Présentations similaires


Présentation au sujet: "Packages fournis par Oracle"— Transcription de la présentation:

1 Packages fournis par Oracle

2 Objectifs A la fin de ce chapitre, vous pourrez :
créer des instructions SQL dynamiques en utilisant DBMS_SQL et EXECUTE IMMEDIATE décrire l'utilisation et l'application de certains packages fournis par le serveur Oracle : DBMS_DDL DBMS_JOB DBMS_OUTPUT UTL_FILE UTL_HTTP et UTL_TCP But du chapitre Dans ce chapitre, vous allez apprendre à utiliser certains packages fournis par le serveur Oracle, et à exploiter leurs possibilités.

3 Utiliser les packages fournis
Les packages fournis par Oracle : sont livrés avec le serveur Oracle, étendent les fonctionnalités de la base de données permettent d'accéder à certaines fonctionnalités SQL réservées normalement au langage PL/SQL Utiliser les packages fournis Des packages sont fournis avec le serveur Oracle pour permettre d'accéder à certaines fonctionnalités SQL ou d'étendre les fonctionnalités de la base de données à l'aide du langage PL/SQL. Vous pouvez tirer parti des fonctionnalités des packages lorsque vous créez une application ; de même, vous pouvez simplement vous en inspirer lorsque vous créez des procédures stockées. La plupart des packages standard sont créés en exécutant le fichier catproc.sql.

4 Utiliser le code SQL dynamique natif
est une instruction SQL qui contient des variables susceptibles de changer lors de l'exécution est une instruction SQL stockée en tant que chaîne de caractères et contenant des marques de réservation permet d'écrire du code à usage général permet d'écrire et d'exécuter des instructions de définition de données, de contrôle des données ou de contrôle des sessions à partir du langage PL/SQL est écrit en utilisant DBMS_SQL ou le langage SQL dynamique natif Utiliser le code SQL dynamique natif (SQL dynamique) Vous pouvez écrire des blocs PL/SQL qui utilisent du code SQL dynamique. Les instructions SQL dynamiques ne sont pas imbriquées dans le programme source mais sont stockées dans des chaînes de caractères saisies dans le programme, ou sont générées par celui-ci. Les instructions SQL peuvent donc être créées dynamiquement à l'exécution grâce à des variables. Par exemple, vous pouvez utiliser le code SQL dynamique pour créer une procédure qui opère sur une table dont le nom ne sera connu qu'au moment de l'exécution, ou pour écrire et exécuter une instruction LDD (telle que CREATE TABLE), une instruction de contrôle des données (telle que GRANT) ou une instruction de contrôle des sessions (telle que ALTER SESSION). En PL/SQL, ce type d'instruction ne peut pas être exécuté de façon statique. Dans Oracle8 et les versions antérieures, vous devez utiliser DBMS_SQL pour écrire du code SQL dynamique. Dans Oracle8i, vous pouvez utiliser DBMS_SQL ou le code SQL dynamique natif. L'instruction EXECUTE IMMEDIATE peut effectuer des interrogations monolignes dynamiques. Elle est également utilisée pour les fonctionnalités telles que les objets et les ensembles, qui ne sont pas pris en charge par DBMS_SQL. Si l'instruction est une instruction SELECT multiligne, vous pouvez utiliser les instructions OPEN-FOR, FETCH et CLOSE.

5 Flux d'exécution Les instructions SQL passent par plusieurs étapes :
analyse affectation de valeur exécution extraction Remarque : Certaines étapes peuvent être ignorées. Etapes de traitement des instructions SQL Toutes les instructions SQL doivent passer par diverses étapes, dont certaines peuvent être ignorées. Analyse (parse) Toutes les instructions SQL doivent être analysées. L'analyse implique la vérification de la syntaxe et la validation de l'instruction ; elle garantit que toutes les références aux objets sont correctes et que ces derniers disposent des privilèges appropriés. Affectation de valeur (bind) Une fois l'analyse effectuée, le serveur Oracle connaît la signification de l'instruction Oracle, mais ne possède pas forcément suffisamment d'informations pour l'exécuter. Il peut avoir besoin de valeurs pour les variables attachées (bind variables) de l'instruction. Le processus d'obtention des valeurs se nomme affectation de variables. Exécution A ce stade, le serveur Oracle possède toutes les informations et ressources nécessaires ; l'instruction est donc exécutée. Extraction Lors de l'étape d'extraction, les lignes sont sélectionnées et triées (si l'interrogation l'exige) ; chaque opération successive permet d'extraire une autre ligne du résultat. Le traitement prend fin avec l'extraction de la dernière ligne. Vous pouvez extraire des interrogations, mais pas d'instruction LMD.

6 Utiliser le package DBMS_SQL
Le package DBMS_SQL permet d'écrire du code SQL dynamique dans des procédures stockées et d'analyser les instructions LDD (Langage de définition de données). Le package inclut les procédures et les fonctions suivantes : OPEN_CURSOR PARSE BIND_VARIABLE EXECUTE FETCH_ROWS CLOSE_CURSOR Utiliser le package DBMS_SQL Le package DBMS_SQL vous permet d'écrire des procédures stockées et des blocs PL/SQL anonymes utilisant du code SQL dynamique. DBMS_SQL peut exécuter des instructions LDD en PL/SQL. Par exemple, vous pouvez exécuter une instruction DROP TABLE depuis une procédure stockée. Les opérations fournies par ce package sont exécutées sous le nom de l'utilisateur actuel et non sous celui du propriétaire du package (SYS). Par conséquent, si l'appelant est un bloc PL/SQL anonyme, les opérations sont exécutées en fonction des privilèges de l'utilisateur en cours. En revanche, si l'appelant est une procédure stockée, les opérations sont exécutées en fonction du propriétaire de la procédure stockée. L'utilisation de ce package pour l'exécution d'instructions LDD peut entraîner un "verrou mortel" (deadlock). Une telle situation peut se produire si le package est utilisé pour supprimer une procédure en cours d'utilisation.

7 Hidden slide Composants du package DBMS_SQL
Le package DBMS_SQL utilise le code SQL dynamique pour accéder à la base de données.

8 Utiliser DBMS_SQL CREATE OR REPLACE PROCEDURE delete_all_rows (p_tab_name IN VARCHAR2, p_rows_del OUT NUMBER) IS cursor_name INTEGER; BEGIN cursor_name := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(cursor_name, 'DELETE FROM '||p_tab_name, DBMS_SQL.NATIVE ); p_rows_del := DBMS_SQL.EXECUTE (cursor_name); DBMS_SQL.CLOSE_CURSOR(cursor_name); END; / Utilisez le code SQL dynamique pour supprimer des lignes VARIABLE deleted NUMBER EXECUTE delete_all_rows('employees', :deleted) PRINT deleted Exemple de package DBMS_SQL Dans l'exemple présenté sur la diapositive, le nom de la table est transmis à la procédure DELETE_ALL_ROWS via un paramètre IN. La procédure utilise le code SQL dynamique pour supprimer les lignes de la table indiquée. Le nombre de lignes supprimées à la suite de l'exécution du code SQL dynamique est transmis à l'environnement appelant via un paramètre OUT. Procédure de traitement des instructions LMD dynamiques 1. Utilisez OPEN_CURSOR pour créer une zone de mémoire destinée au traitement d'une instruction SQL. 2. Utilisez la commande PARSE pour établir la validité de l'instruction SQL. 3. Utilisez la fonction EXECUTE pour exécuter l'instruction SQL. Cette fonction renvoie le nombre de lignes traitées. 4. Utilisez la commande CLOSE_CURSOR pour fermer le curseur.

9 Utiliser l'instruction EXECUTE IMMEDIATE
Utilisez l'instruction EXECUTE IMMEDIATE pour améliorer les performances du code SQL dynamique natif. La clause INTO est utilisée pour les interrogations monolignes et indique les variables ou enregistrements dans lesquels les valeurs des colonnes sont extraites La clause USING est utilisée pour recevoir tous les arguments attachés. Le mode de paramètre par défaut est IN EXECUTE IMMEDIATE dynamic_string [INTO {define_variable [, define_variable] ... | record}] [USING [IN|OUT|IN OUT] bind_argument [, [IN|OUT|IN OUT] bind_argument] ... ]; Utiliser l'instruction EXECUTE IMMEDIATE Définition syntaxique Vous pouvez utiliser la clause INTO pour une interrogation monoligne, mais vous devez utiliser les instructions OPEN-FOR, FETCH et CLOSE pour une interrogation multiligne. Remarque : La syntaxe présentée dans la diapositive n'est pas complète. Les autres clauses de l'instruction sont présentées dans le cours Advanced PL/SQL.

10 Hidden slide Utiliser l'instruction EXECUTE IMMEDIATE (suite)
Dans l'instruction EXECUTE IMMEDIATE : La clause INTO indique les variables ou les enregistrements dans lesquels les valeurs de colonne sont extraites. Elle est utilisée uniquement pour les interrogations monolignes. Pour chaque valeur extraite par l'interrogation, la clause INTO doit comporter une variable ou un champ correspondant de type compatible. La clause RETURNING INTO indique les variables dans lesquelles les valeurs de colonne sont renvoyées. Elle est utilisée uniquement pour les instructions LMD qui contiennent une clause RETURNING (sans clause BULK COLLECT). Pour chaque valeur renvoyée par l'instruction LMD, la clause RETURNING INTO doit comporter une variable correspondante compatible. La clause USING reçoit tous les arguments attachés (bind arguments). Le mode de paramètre par défaut est IN. Dans le cas des instructions LMD qui contiennent une clause RETURNING, vous pouvez placer des arguments OUT dans la clause RETURNING INTO sans indiquer le mode de paramètre qui, par définition, est OUT. Si vous utilisez les clauses USING et RETURNING INTO, la clause USING ne peut contenir que des arguments IN. Lors de l'exécution, les arguments attachés remplacent les marques de réservation correspondantes dans la chaîne dynamique. Ainsi, chaque marque de réservation doit être associée à un argument attaché dans la clause USING ou RETURNING INTO. Vous pouvez utiliser un littéral numérique, de type caractère ou chaîne en tant qu'argument attaché, mais vous ne pouvez pas utiliser de littéral booléen (TRUE, FALSE ou NULL). Le code SQL dynamique prend en charge tous les types de données SQL. Par exemple, les variables et les arguments attachés peuvent être des ensembles, des objets LOB (Large Objects), des instances d'un type d'objet et des REF. En règle générale, le code SQL dynamique ne prend pas en charge les types spécifiques PL/SQL. Par exemple, les variables et les arguments attachés ne doivent pas être des booléens ou des valeurs de type "table PL/SQL". La seule exception est qu'un enregistrement PL/SQL peut apparaître dans la clause INTO. Vous pouvez exécuter une instruction SQL dynamique de façon répétée en utilisant de nouvelles valeurs pour les arguments attachés. Cependant, des surcharges peuvent survenir, car EXECUTE IMMEDIATE réanalyse la chaîne dynamique avant chaque exécution. Hidden slide

11 Instruction SQL dynamique utilisant EXECUTE IMMEDIATE
CREATE PROCEDURE del_rows (p_table_name IN VARCHAR2, p_rows_deld OUT NUMBER) IS BEGIN EXECUTE IMMEDIATE 'delete from '||p_table_name; p_rows_deld := SQL%ROWCOUNT; END; / VARIABLE deleted NUMBER EXECUTE del_rows('test_employees',:deleted) PRINT deleted Instruction SQL dynamique utilisant EXECUTE IMMEDIATE Il s'agit du même code SQL dynamique qu'avec DBMS_SQL, excepté qu'il utilise l'instruction EXECUTE IMMEDIATE d'Oracle8i. L'instruction EXECUTE IMMEDIATE prépare (analyse) et exécute immédiatement l'instruction SQL dynamique.

12 Utiliser le package DBMS_DDL
permet d'accéder à certaines instructions SQL LDD depuis des procédures stockées inclut certaines procédures : ALTER_COMPILE (object_type, owner, object_name) ANALYZE_OBJECT (object_type, owner, name, method) Remarque : Le package s'exécute avec les privilèges de l'utilisateur appelant, plutôt qu'avec ceux du propriétaire du package, SYS. DBMS_DDL.ALTER_COMPILE('PROCEDURE','A_USER','QUERY_EMP') Utiliser le package DBMS_DDL Il permet d'accéder à certaines instructions SQL LDD, que vous pouvez utiliser dans des programmes PL/SQL. L'utilisation du package DBMS_DDL n'est pas autorisée dans les déclencheurs (triggers), dans les procédures appelées depuis Forms Builder ou dans les sessions distantes. Le package s'exécute avec les privilèges de l'utilisateur appelant plutôt qu'avec ceux du propriétaire du package, SYS. Utilisations pratiques Vous pouvez recompiler les programmes PL/SQL en utilisant la commande DBMS_DDL.ALTER_COMPILE. L'objet doit être de type procédure, fonction, package, corps du package ou déclencheur. Vous pouvez analyser un seul objet en utilisant la commande DBMS_DDL.ANALYZE_OBJECT. (La commande DBMS_UTILITY vous permet d'analyser simultanément plusieurs objets.) Le type d'objet doit être TABLE, CLUSTER ou INDEX. La méthode doit être COMPUTE, ESTIMATE ou DELETE. Le package permet aux développeurs d'accéder aux instructions SQL ALTER et ANALYZE via des environnements PL/SQL. DBMS_DDL.ANALYZE_OBJECT('TABLE','A_USER','JOBS','COMPUTE')

13 Utiliser DBMS_JOB pour la programmation
DBMS_JOB permet de programmer et d'exécuter les programmes PL/SQL afin de : soumettre des travaux exécuter des travaux modifier les paramètres d'exécution des travaux supprimer des travaux suspendre des travaux Programmer des travaux en utilisant le package DBMS_JOB Le package DBMS_JOB permet de planifier l'exécution de programmes PL/SQL. En utilisant DBMS_JOB, vous pouvez soumettre des programmes PL/SQL pour exécution, les exécuter selon un planning, identifier le moment de leur exécution, les supprimer du planning et suspendre leur exécution. Il permet également de programmer des traitements batch pendant les heures creuses ou d'exécuter des programmes de maintenance pendant les heures de faible utilisation.

14 Sous-programmes DBMS_JOB
Sous-programmes disponibles : SUBMIT REMOVE CHANGE WHAT NEXT_DATE INTERVAL BROKEN RUN Sous-programmes DBMS_JOB

15 Soumettre les travaux Vous pouvez soumettre les travaux en utilisant la procédure DBMS_JOB.SUBMIT. Paramètres disponibles : JOB OUT BINARY_INTEGER WHAT IN VARCHAR2 NEXT_DATE IN DATE DEFAULT SYSDATE INTERVAL IN VARCHAR2 DEFAULT 'NULL' NO_PARSE IN BOOLEAN DEFAULT FALSE Paramètres DBMS_JOB.SUBMIT La procédure DBMS_JOB.SUBMIT ajoute un travail à la file d'attente des travaux. Elle accepte cinq paramètres et renvoie le numéro d'un travail soumis via le paramètre OUT "JOB". La description des paramètres est présentée dans le tableau ci-dessous. Remarque : Une exception est déclenchée si l'intervalle ne correspond pas à une date ultérieure.

16 Soumettre des travaux Utilisez DBMS_JOB.SUBMIT pour placer un travail à exécuter dans la file d'attente des travaux. VARIABLE jobno NUMBER BEGIN DBMS_JOB.SUBMIT ( job => :jobno, what => 'OVER_PACK.ADD_DEPT(''EDUCATION'',2710);', next_date => TRUNC(SYSDATE + 1), interval => 'TRUNC(SYSDATE + 1)' ); COMMIT; END; / PRINT jobno Exemple Le bloc de code présenté sur la diapositive soumet la procédure ADD_DEPT du package OVER_PACK à la file d'attente des travaux. Le numéro du travail est renvoyé via le paramètre JOB. Le paramètre WHAT doit être placé entre apostrophes et la chaîne de texte qu'il contient doit se terminer par un point-virgule. Le travail est soumis pour une exécution quotidienne à minuit. Remarque : L'exemple illustre la méthode de transmission de paramètres par association de noms. Les transactions du travail soumis ne sont validées que lorsque la commande COMMIT est exécutée ou que la procédure DBMS_JOB.RUN est lancée pour l'exécution du travail. La commande COMMIT de la diapositive permet de valider la transaction.

17 Modifier les caractéristiques des travaux
DBMS_JOB.CHANGE : modifie les paramètres WHAT, NEXT_DATE et INTERVAL DBMS_JOB.INTERVAL : modifie le paramètre INTERVAL DBMS_JOB.NEXT_DATE : modifie la date d'exécution suivante DBMS_JOB.WHAT : modifie le paramètre WHAT Modifier les travaux après leur soumission Les procédures CHANGE, INTERVAL, NEXT_DATE et WHAT vous permettent de modifier les caractéristiques d'un travail, après soumission de ce dernier à la file d'attente. Chaque procédure accepte le paramètre JOB en tant que paramètre IN indiquant le travail à modifier. Exemple Le code suivant modifie le travail n° 1 afin qu'il s'exécute à 6h00 le jour suivant, puis toutes les quatre heures. BEGIN DBMS_JOB.CHANGE(1, NULL, TRUNC(SYSDATE+1)+6/24, ’SYSDATE+4/24'); END; / Remarque : Chacune des procédures peut être exécutée sur les travaux détenus par le nom utilisateur ayant ouvert la session. Si le paramètre what, next_date ou interval a la valeur NULL, la dernière valeur affectée au paramètre est utilisée.

18 Exécuter, supprimer et suspendre des travaux
DBMS_JOB.RUN : exécute immédiatement un travail soumis DBMS_JOB.REMOVE : supprime un travail soumis de la file d'attente des travaux DBMS_JOB.BROKEN : identifie un travail soumis comme suspendu (un travail suspendu ne s'exécute pas) Exécuter, supprimer et suspendre des travaux La procédure DBMS_JOB.RUN exécute immédiatement un travail. Indiquez dans cette procédure le numéro du travail à exécuter immédiatement. EXECUTE DBMS_JOB.RUN(1) La procédure DBMS_JOB.REMOVE supprime un travail soumis dans la file d'attente des travaux. Indiquez dans cette procédure le numéro du travail à supprimer de la file d'attente. EXECUTE DBMS_JOB.REMOVE(1) La procédure DBMS_JOB.BROKEN identifie un travail comme suspendu ou non suspendu. Par défaut, les travaux ne sont pas suspendus. Vous pouvez affecter l'état suspendu à un travail pour qu'il ne s'exécute pas. La procédure comporte trois paramètres. Le paramètre JOB identifie le travail à suspendre ou non. Le paramètre BROKEN est un paramètre booléen. Affectez-lui la valeur FALSE pour indiquer qu'un travail n'est pas suspendu, et la valeur TRUE pour indiquer qu'il est suspendu. Le paramètre NEXT_DATE identifie la date d'exécution suivante du travail. EXECUTE DBMS_JOB.BROKEN(1, TRUE)

19 Visualiser les informations sur les travaux soumis
Utilisez la vue du dictionnaire DBA_JOBS pour consulter l'état des travaux soumis. Utilisez la vue du dictionnaire DBA_JOBS_RUNNING pour afficher les travaux en cours d'exécution. SELECT job, log_user, next_date, next_sec, broken, what FROM DBA_JOBS; Visualiser les informations sur les travaux soumis Les vues de dictionnaire DBA_JOBS et DBA_JOBS_RUNNING affichent des informations sur les travaux qui se trouvent dans la file d'attente et sur ceux qui se sont exécutés. Pour visualiser les informations du dictionnaire, les utilisateurs doivent disposer du privilège SELECT sur SYS.DBA_JOBS. L'interrogation présentée dans la diapositive affiche le numéro du travail, l'identité de l'utilisateur qui l'a soumis, sa date d'exécution programmée, son heure d'exécution et le bloc PL/SQL exécuté en tant que travail. La vue du dictionnaire de données USER_JOBS vous permet d'afficher les informations sur les travaux en file d'attente vous concernant. Sa structure est identique à celle de la vue DBA_JOBS.

20 Utiliser le package DBMS_OUTPUT
Le package DBMS_OUTPUT vous permet de sortir des messages des blocs PL/SQL. Procédures disponibles : PUT NEW_LINE PUT_LINE GET_LINE GET_LINES ENABLE/DISABLE Utiliser le package DBMS_OUTPUT Le package DBMS_OUTPUT génère des valeurs et des messages à partir de n'importe quel bloc PL/SQL. Utilisations pratiques Vous pouvez sortir les résultats intermédiaires dans la fenêtre à des fins de débogage. Le package permet aux développeurs de suivre attentivement l'exécution d'une fonction ou d'une procédure grâce à l'envoi de messages et de valeurs vers la mémoire tampon des résultats.

21 Interagir avec les fichiers du système d'exploitation
Le package UTL_FILE fourni par Oracle : offre des fonctions d'E/S sur les fichiers texte est disponible avec la version 7.3 et les versions ultérieures Le package DBMS_LOB fourni par Oracle : permet d'effectuer des opérations en lecture seule sur les fichiers BFILES externes est disponible avec la version 8 et les versions ultérieures permet d'effectuer des opérations de lecture et d'écriture sur les objets LOB internes Interagir avec les fichiers du système d'exploitation Deux packages fournis par Oracle sont disponibles. Ils vous permettent d'accéder aux fichiers du système d'exploitation. Le package UTL_FILE vous permet d'effectuer des opérations de lecture et d'écriture sur les fichiers du système d'exploitation. Il est disponible avec les versions 7.3. et ultérieures de la base de données, ainsi qu'avec les versions 2.3 et ultérieures du langage PL/SQL. Le package DBMS_LOB vous permet d'effectuer des opérations de lecture sur les fichiers binaires du système d'exploitation. Le package est disponible avec les versions 8.0 et ultérieures de la base de données. Il est présenté ultérieurement dans le chapitre "Manipuler des objets de grande taille".

22 Présentation du package UTL_FILE
Le package UTL_FILE étend les E/S aux fichiers texte en PL/SQL Il assure la sécurité des répertoires du serveur via le fichier init.ora Il offre des fonctions d'E/S similaires à celle d'un système d'exploitation standard ouverture des fichiers extraction de texte insertion de texte fermeture des fichiers utilisation des exceptions spécifiques au package UTL_FILE Package UTL_FILE Le package UTL_FILE offre des fonctions d'E/S sur les fichiers texte à partir du langage PL/SQL. L'implémentation de la sécurité côté client implique un système de contrôle normal des autorisations sur les fichiers du système d'exploitation. La sécurité côté serveur est implémentée via des restrictions d'accès aux répertoires. Dans le fichier init.ora, le paramètre d'initialisation UTL_FILE_DIR est défini en fonction des répertoires pour lesquels un accès est souhaité. UTL_FILE_DIR = directory_name Par exemple, le paramètre d'initialisation suivant indique que le répertoire /usr/ngreenbe/my_app est accessible à la fonction fopen, si l'on considère que ce répertoire est accessible aux processus du serveur de bases de données. Le paramètre doit être entré en faisant la distinction majuscules/minuscules sur les systèmes où cette distinction est en vigueur. UTL_FILE_DIR = /user/ngreenbe/my_app Le répertoire doit résider sur la même machine que le serveur de bases de données. Le paramètre suivant permet de désactiver les autorisations de la base de données et de rendre accessibles au package UTL_FILE tous les répertoires déjà accessibles aux processus du serveur de bases de données. UTL_FILE_DIR = *

23 What Is the UTL_FILE Package?
Package UTL_FILE (suite) Les procédures et les fonctions de ce package vous permettent d'ouvrir les fichiers, d'y extraire ou d'y insérer du texte, et de fermer les fichiers. Sept exceptions déclarées dans le package représentent les éventuelles erreurs pouvant se déclencher lors de l'exécution. What Is the UTL_FILE Package? Extends I/O to text files within PL/SQL Provides security for directories on the server through the init.ora file Is similar to standard operating system I/O Open files Get text Put text Close files Use the exceptions specific to the UTL_FILE package

24 Traiter les fichiers en utilisant le package UTL_FILE
Oui Extraire les lignes du fichier texte Ouvrir le fichier texte Autres lignes à traiter ? Fermer le fichier texte Non Insérer les lignes dans le fichier texte Traiter les fichiers en utilisant le package UTL_FILE Avant d'effectuer des opérations de lecture ou d'écriture sur un fichier texte via le package UTL_FILE, vous devez utiliser la fonction IS_OPEN pour vérifier si le fichier est ouvert. Si ce n'est pas le cas, ouvrez-le en utilisant la fonction FOPEN. Effectuez ensuite l'opération de lecture ou d'écriture sur le fichier jusqu'à ce que le traitement soit terminé. Une fois le fichier traité, fermez-le en utilisant la procédure FCLOSE. Remarque : Une synthèse des procédures et des fonctions du package UTL_FILE est présentée à la page suivante.

25 Procédures et fonctions du package UTL_FILE
Fonction FOPEN Fonction IS_OPEN Procédure GET_LINE Procédure PUT, PUT_LINE, et PUTF Procédure NEW_LINE Procédure FFLUSH Procédure FCLOSE, et FCLOSE_ALL

26 UTL_FILE Procedures and Functions
Procédures et fonctions du package UTL_FILE Remarque : La taille maximale d'un enregistrement d'entrée est de 1 023 octets, sauf si vous indiquez une taille supérieure dans la version surchargée de FOPEN. UTL_FILE Procedures and Functions Function FOPEN Function IS_OPEN Procedure GET_LINE Procedure PUT, PUT_LINE, PUTF Procedure NEW_LINE Procedure FFLUSH Procedure FCLOSE, FCLOSE_ALL

27 Exceptions spécifiques au package UTL_FILE
INVALID_PATH INVALID_MODE INVALID_FILEHANDLE INVALID_OPERATION READ_ERROR WRITE_ERROR INTERNAL_ERROR Exceptions spécifiques au package UTL_FILE Sept exceptions déclarées dans le package UTL_FILE se déclenchent lorsqu'une erreur survient dans le traitement des fichiers du système d'exploitation. Remarque : Les exceptions doivent être précédées du nom du package. Les procédures UTL_FILE peuvent également déclencher des exceptions PL/SQL prédéfinies telles que NO_DATA_FOUND ou VALUE_ERROR.

28 Fonctions FOPEN et IS_OPEN
FUNCTION FOPEN (location IN VARCHAR2, filename IN VARCHAR2, open_mode IN VARCHAR2) RETURN UTL_FILE.FILE_TYPE; FUNCTION IS_OPEN (file_handle IN FILE_TYPE) RETURN BOOLEAN; Paramètres de la fonction FOPEN Définitions syntaxiques La valeur renvoyée correspond au pointeur de fichier transmis à tous les sous-programmes suivants qui traitent le fichier. Fonction IS_OPEN La fonction IS_OPEN teste un pointeur de fichier pour vérifier s'il identifie un fichier ouvert. Elle renvoie une valeur booléenne indiquant si le fichier a été ouvert mais n'a pas encore été fermé. Remarque : Pour connaître la syntaxe complète, consultez le manuel Oracle9i Supplied PL/SQL Packages and Types Reference.

29 Utiliser UTL_FILE sal_status.sql
CREATE OR REPLACE PROCEDURE sal_status (p_filedir IN VARCHAR2, p_filename IN VARCHAR2) IS v_filehandle UTL_FILE.FILE_TYPE; CURSOR emp_info IS SELECT last_name, salary, department_id FROM employees ORDER BY department_id; v_newdeptno employees.department_id%TYPE; v_olddeptno employees.department_id%TYPE := 0; BEGIN v_filehandle := UTL_FILE.FOPEN (p_filedir, p_filename,'w'); UTL_FILE.PUTF (v_filehandle,'SALARY REPORT: GENERATED ON %s\n', SYSDATE); UTL_FILE.NEW_LINE (v_filehandle); FOR v_emp_rec IN emp_info LOOP v_newdeptno := v_emp_rec.department_id; ... Utiliser UTL_FILE Exemple La procédure SAL_STATUS crée un état sur les employés de chaque service et sur leurs salaires. Les informations sont transmises à un fichier texte via les procédures et les fonctions du package UTL_FILE. La variable v_filehandle utilise un type défini dans le package UTL_FILE. Ce type est un enregistrement comportant un champ ID dont le type de données est BINARY_INTEGER. TYPE file_type IS RECORD (id BINARY_INTEGER); Le contenu de file_type est réservé au package UTL_FILE. Les utilisateurs du package ne doivent pas faire référence aux composants de l'enregistrement, ni les modifier. Le nom et l'emplacement du fichier texte sont fournis au programme en tant que paramètres. EXECUTE sal_status('C:\UTL_FILE', 'SAL_RPT.TXT') Remarque : L'emplacement du fichier indiqué dans l'exemple ci-dessus est défini en tant que valeur de UTL_FILE_DIR dans le fichier init.ora : UTL_FILE_DIR = C:\UTL_FILE. Lorsque vous lisez un fichier entier dans une boucle, vous devez utiliser l'exception NO_DATA_FOUND pour sortir de la boucle. Le résultat du package UTL_FILE est envoyé de façon synchrone. Les procédures DBMS_OUTPUT ne génèrent pas de résultat tant que la procédure n'est pas terminée.

30 Utiliser UTL_FILE sal_status.sql ...
IF v_newdeptno <> v_olddeptno THEN UTL_FILE.PUTF (v_filehandle, 'DEPARTMENT: %s\n', v_emp_rec.department_id); END IF; UTL_FILE.PUTF (v_filehandle,' EMPLOYEE: %s earns: %s\n', v_emp_rec.last_name, v_emp_rec.salary); v_olddeptno := v_newdeptno; END LOOP; UTL_FILE.PUT_LINE (v_filehandle, '*** END OF REPORT ***'); UTL_FILE.FCLOSE (v_filehandle); EXCEPTION WHEN UTL_FILE.INVALID_FILEHANDLE THEN RAISE_APPLICATION_ERROR (-20001, 'Invalid File.'); WHEN UTL_FILE.WRITE_ERROR THEN RAISE_APPLICATION_ERROR (-20002, 'Unable to write to file'); END sal_status; / Utiliser UTL_FILE (suite) Le résultat de cet état dans le fichier sal_rpt.txt est le suivant : SALARY REPORT: GENERATED ON 08-MAR-01 DEPARTMENT: 10 EMPLOYEE: Whalen earns: 4400 DEPARTMENT: 20 EMPLOYEE: Hartstein earns: 13000 EMPLOYEE: Fay earns: 6000 DEPARTMENT: 30 EMPLOYEE: Raphaely earns: 11000 EMPLOYEE: Khoo earns: 3100 ... DEPARTMENT: 100 EMPLOYEE: Greenberg earns: 12000 DEPARTMENT: 110 EMPLOYEE: Higgins earns: 12000 EMPLOYEE: Gietz earns: 8300 EMPLOYEE: Grant earns: 7000 *** END OF REPORT ***

31 Package UTL_HTTP Le package UTL_HTTP :
permet d'effectuer des appels programme externes à l'aide du protocole HTTP depuis les langages PL/SQL et SQL, afin d'accéder aux données sur Internet contient les fonctions REQUEST et REQUEST_PIECES, qui utilisent l'URL d'un site en tant que paramètre, contactent le site et renvoient les données obtenues sur celui-ci peut être défini dans les fonctions ci-dessus en utilisant un paramètre proxy, si le client est protégé par un pare-feu déclenche les exceptions INIT_FAILED ou REQUEST_FAILED en cas d'échec d'un appel HTTP génère un message signalant une erreur HTML si l'URL indiquée n'est pas accessible Package UTL_HTTP UTL_HTTP est un package qui vous permet d'effectuer directement des demandes HTTP depuis la base de données. Il effectue des appels programme externes à l'aide du protocole HTTP à l'aide des langages PL/SQL et SQL. Vous pouvez utiliser le package pour accéder à des données sur Internet ou pour appeler des cartouches du serveur Web d'Oracle. En associant UTL_HTTP au package DBMS_JOBS, vous pouvez aisément programmer l'envoi de demandes récurrentes entre le serveur de bases de données et le Web. Le package inclut deux fonctions de point d'entrée : REQUEST et REQUEST_PIECES. Ces deux fonctions utilisent une chaîne de type URL comme paramètre, contactent le site et revoient les données HTML obtenues sur le site. La fonction REQUEST renvoie jusqu'aux 2 000 premiers octets de données extraits de l'URL indiquée. La fonction REQUEST_PIECES renvoie une table PL/SQL contenant les données extraites de l'URL indiquée, sous forme de segments de 2 000 octets. Si l'appel HTTP échoue, notamment parce que l'URL n'est pas correctement indiquée dans la syntaxe HTTP, l'exception REQUEST_FAILED est déclenchée. Si l'initialisation du sous-système d'appel programme externe à l'aide du protocole HTTP échoue, par manque de mémoire par exemple, l'exception INIT_FAILED est déclenchée. Si l'URL indiquée ne répond pas, un message d'erreur au format HTML peut être renvoyé. Si REQUEST ou REQUEST_PIECES échoue en renvoyant une exception ou un message d'erreur, vérifiez l'URL en utilisant un navigateur pour vous assurer que votre machine peut accéder au réseau. Si vous êtes protégé par un pare-feu (firewall), vous devez indiquer le paramètre du proxy en complément de l'URL Le package UTL_HTTP est présenté plus en détail dans le cours Administering Oracle9i Application Server. Pour plus d'informations, consultez le manuel Oracle9i Supplied PL/SQL Packages Reference.

32 Utiliser le package UTL_HTTP
SELECT UTL_HTTP.REQUEST(' 'edu-proxy.us.oracle.com') FROM DUAL; Utiliser le package UTL_HTTP L'instruction SELECT et le résultat présentés dans la diapositive indiquent comment utiliser la fonction REQUEST du package UTL_HTTP pour extraire le contenu de l'URL Le second paramètre de la fonction indique le proxy, car le client testé est protégé par un pare-feu. Le résultat extrait est au format HTML. Vous pouvez utiliser la fonction dans un bloc PL/SQL, comme indiqué ci-dessous. La fonction extrait de l'URL jusqu'à 100 données de 2 000 octets maximum chacune. Les informations relatives au nombre et à la longueur totale des données extraites sont imprimées.

33 Using the UTL_HTTP Package
Utiliser le package UTL_HTTP DECLARE x UTL_HTTP.HTML_PIECES; BEGIN x := UTL_HTTP.REQUEST_PIECES(' 'edu-proxy.us.oracle.com'); DBMS_OUTPUT.PUT_LINE(x.COUNT || ' pieces were retrieved.'); DBMS_OUTPUT.PUT_LINE('with total length '); IF x.COUNT < 1 THEN DBMS_OUTPUT.PUT_LINE('0'); ELSE DBMS_OUTPUT.PUT_LINE((2000*(x.COUNT - 1))+LENGTH(x(x.COUNT))); END IF; END; / Using the UTL_HTTP Package SELECT UTL_HTTP.REQUEST(' 'edu-proxy.us.oracle.com') FROM DUAL;

34 Utiliser le package UTL_TCP
permet aux applications PL/SQL de communiquer avec les serveurs TCP/IP externes via le protocole TCP/IP contient des fonctions permettant d'établir et d'interrompre les connexions, de lire ou d'écrire les données binaires ou textuelles d'un service via une connexion ouverte requiert un hôte et un port distant, ainsi qu'un hôte et un port local, en tant qu'arguments pour ses fonctions déclenche des exceptions lorsque la taille de la mémoire tampon est insuffisante, lorsqu'une connexion n'offre plus de données à lire, lorsqu'une erreur réseau générique se produit ou lorsque des arguments incorrects sont transmis à un appel de fonction Utiliser le package UTL_TCP Le package UTL_TCP permet aux applications PL/SQL de communiquer avec des serveurs TCP/IP externes à l'aide du protocole TCP/IP. Etant donné que de nombreux protocoles d'application Internet sont basés sur TCP/IP, le package s'avère utile pour les applications qui utilisent des protocoles Internet. Le package inclut plusieurs fonctions : La fonction OPEN_CONNECTION établit une connexion TCP/IP en utilisant les informations relatives au port et à l'hôte, aussi bien locaux que distants. L'hôte distant fournit le service. Le port distant correspond au numéro de port sur lequel le service est à l'écoute des connexions entrantes. Les numéros d'hôte et de port locaux correspondent à ceux de l'hôte qui fournit le service. La fonction renvoie une connexion de type enregistrement PL/SQL. La procédure CLOSE_CONNECTION ferme la connexion TCP/IP ouverte. Elle utilise en tant que paramètre, les informations relatives à la connexion précédemment établie. La procédure CLOSE_ALL_CONNECTIONS met fin à toutes les connexions ouvertes. La fonction READ_BINARY()/TEXT()/LINE() extrait les données binaires, le texte ou les lignes de texte d'un service via une connexion ouverte. La fonction WRITE_BINARY()/TEXT()/LINE() transmet à un service un message contenant des données binaires, du texte ou des lignes de texte via une connexion ouverte. Des exceptions sont déclenchées lorsque la taille de la mémoire tampon est insuffisante pour les entrées, lorsqu'une erreur réseau générique se produit, lorsque la connexion n'offre plus de données à lire ou lorsque des arguments incorrects ont été transmis dans un appel de fonction. Le package UTL_TCP est présenté en détail dans le cours Administering Oracle9i Application Server. Pour plus d'informations, consultez le manuel Oracle 9i Supplied PL/SQL Packages Reference.

35 Packages fournis par Oracle
Autres packages fournis par Oracle : DBMS_ALERT DBMS_APPLICATION_INFO DBMS_DESCRIBE DBMS_LOCK DBMS_SESSION DBMS_SHARED_POOL DBMS_TRANSACTION DBMS_UTILITY Utiliser les packages fournis par Oracle

36 Packages fournis par Oracle
Le tableau suivant présente une synthèse et une brève description des packages fournis avec Oracle9i.

37 Packages fournis par Oracle (suite)

38 Packages fournis par Oracle (suite)

39 Packages fournis par Oracle (suite)

40 Synthèse Ce chapitre vous a permis d'apprendre à :
tirer parti des packages préconfigurés fournis par Oracle créer des packages en utilisant le script catproc.sql créer des packages de façon individuelle Packages DBMS et scripts d'exécution correspondants Remarque : Pour plus d'informations sur les packages et les scripts, consultez le manuel Oracle9i Supplied PL/SQL Packages and Types Reference.

41 Présentation de l'exercice 7
Dans cet exercice, vous allez utiliser : DBMS_SQL pour créer du code SQL dynamique DBMS_DDL pour analyser une table DBMS_JOB pour programmer une tâche UTL_FILE pour générer des états de type texte Présentation de l'exercice 7 Dans cet exercice, vous allez utiliser DBMS_SQL pour implémenter une procédure permettant de supprimer une table. Vous allez également utiliser la commande EXECUTE IMMEDIATE pour supprimer une table. Grâce à DBMS_DDL, vous pourrez analyser les objets du schéma. Enfin, vous pourrez programmer la procédure d'analyse via DBMS_JOB. Vous allez également écrire un programme PL/SQL qui génère des états client dans un fichier texte.

42 Exercice 7 1. a. Créez une procédure DROP_TABLE qui supprime la table indiquée dans le paramètre d'entrée. Utilisez les procédures et les fonctions du package DBMS_SQL fourni. b. Pour tester la procédure DROP_TABLE, créez au préalable une table nommée EMP_DUP représentant la copie de la table EMPLOYEES. c. Exécutez la procédure DROP_TABLE pour supprimer la table EMP_DUP. 2. a. Créez une autre procédure DROP_TABLE2 qui supprime la table indiquée dans le paramètre d'entrée. Utilisez l'instruction EXECUTE IMMEDIATE. b. Répétez le test présenté aux étapes 1-b et 1-c. 3. a. Créez une procédure nommée ANALYZE_OBJECT qui analyse l'objet indiqué dans les paramètres d'entrée. Utilisez le package DBMS_DDL et la méthode COMPUTE. b. Testez la procédure en utilisant la table EMPLOYEES. Vérifiez l'exécution de la procédure ANALYZE_OBJECT en interrogeant la colonne LAST_ANALYZED de la vue du dictionnaire de données USER_TABLES. Si vous avez le temps : 4. a. Programmez ANALYZE_OBJECT en utilisant DBMS_JOB. Analysez la table DEPARTMENTS et programmez le travail pour qu'il s'exécute dans cinq minutes. (Pour ce faire, définissez le paramètre NEXT_DATE comme suit : 5/(24*60) = 1/288.) b. Assurez-vous que le travail a bien été programmé en utilisant la vue USER_JOBS. 5. Créez une procédure nommée CROSS_AVGSAL, qui génère un état de type fichier texte sur les employés dont le salaire moyen dépasse celui de leur service. Le code partiel est fourni dans le fichier lab07_5.sql. a. Le programme doit accepter deux paramètres. Le premier identifie le répertoire de sortie, le second le nom du fichier texte dans lequel la procédure est écrite. b. Le formateur vous indiquera l'emplacement du répertoire. Lorsque vous appelez le programme, nommez le second paramètre sal_rptxx.txt, où xx correspond au numéro utilisateur, 01 ou 15 par exemple. c. Ajoutez une section de traitement des exceptions pour traiter les erreurs susceptibles de se produire lors de l'utilisation du package UTL_FILE. Exemple de résultat du fichier : EMPLOYEES OVER THE AVERAGE SALARY OF THEIR DEPARTMENT: REPORT GENERATED ON 26-FEB-01 Hartstein $13,000.00 Raphaely $11,000.00 Marvis $6,500.00 ... *** END OF REPORT ***


Télécharger ppt "Packages fournis par Oracle"

Présentations similaires


Annonces Google