PSP XDB (Oracle XML DB Server) XDB est un serveur APACHE intégré dans les bases de données Oracle. XDB est installé par DBCA comme un composant de la base de données exemple. Le framework APEX utilise XDB. Possède son propre écouteur XDB listener. Pour administrer un serveur XDB il faut avoir le privilège XDBA avec option d’administration. Le compte « ANONYMOUS » doit être déverrouillé. 2 Création d’un DAD DAD (Data Access Descriptor): contient les informations pour mapper des requêtes HTTP à des procédures PL/SQL dans un schéma Oracle. Création d’un DAD Lancez SQLPLUS avec un compte ayant le rôle XDBADMIN (sys par exemple). 1. Créez le DAD HR_DAD EXEC DBMS_EPG.CREATE_DAD('HR_DAD', '/hrweb/*'); HR_DAD: nom du DAD. /hrweb/*: chemin virtuel 2. Définir l’attribut database-username EXEC DBMS_EPG.SET_DAD_ATTRIBUTE('HR_DAD', 'database-username', 'HR'); HR_DAD possède maintenant les privilèges de l’utilisateur HR et utilise le schéma HR. 3. Accorder à HR l’utilisation du pachage DBMS_EPG GRANT EXECUTE ON DBMS_EPG TO HR 4. Autorisation: EXEC DBMS_EPG.AUTHORIZE_DAD('HR_DAD', 'HR'); Connectez vous avec le compte HR EXEC DBMS_EPG.AUTHORIZE_DAD('HR_DAD'); EXEC DBMS_EPG.SET_DAD_ATTRIBUTE('HR_DAD', 'database-username', 'ANONYMOUS'); 3 PL/SQL Web Server 4 1. 2. 3. 4. 5. 6. 7. 8. 5 L’écouter XDB listener reçoit une requête HTTP (pour appeler une page PSP ou une procédure stockée). XDB listener redirige la requête vers la passerelle intégrée PL/SQL. La passerelle utilise les informations de la requête pour sélectionner le compte à utiliser pour l’authentification La passerelle PL/SQL prépare les paramètres d’appel et exécute la procédure stockée. La procédure stockée génère une page html par appel de PL/SQL Web Toolkit. La procédure stockée retourne une page HTML à la passerelle intégrée. La passerelle envoie la page à XDB listener. XDB Listener envoie la réponse HTTP au client web. Configuration xdbconfig.xml: fichier de configuration de XDB stocké dans la base de données. L’interface de configuration du serveur XDB est fournie dans le package DBMS_EPG. 6 Exemple 1: une procédure stockée create or replace PROCEDURE exemple0 AS BEGIN htp.htmlopen; -- <HTML> htp.headopen; -- <HEAD> htp.htitle('Exemple 0'); htp.headclose; -- </HEAD> htp.bodyopen; -- <BODY> htp.line; -- <HR> htp.print(‘Exemple0.'); --Exemple0. htp.line; -- <HR> htp.bodyclose; -- </BODY> htp.htmlclose; -- </HTML> END exemple0; 7 PSP (PL/SQL Server Pages) <%@ page language="PL/SQL" %> <h1>Liste des employés</h1> <%@ page contentType="text/html" %> <table width="40%" border="1"> <tr> <%@ plsql procedure="afficher_employes" %> <th align="left">Nom</th> <%! <th align="left">Prénom</th> CURSOR emp_cursor IS </tr> SELECT last_name, first_name <% FOR emp_record IN emp_cursor FROM hr.employees LOOP %> ORDER BY last_name; <tr> %> <td> <%= emp_record.last_name %> </td> <html> <td> <%= emp_record.first_name %> <head> </td> <meta http-equiv="Content-Type" </tr> content="text/html"> <% END LOOP; %> <Liste des employés</title> </table> </head> </body> <body TEXT="#000000" BGCOLOR="#FFFFFF"> </html> 8 API PL/SQL Web Toolkit. Packages HTP: génère des éléments HTML. HTF: Génère des éléments HTML sous forme de chaines de caractères. OWA_CACHE: gestion du cache par la passerelle PL/SQL. OWA_COOKIE: gestion des cookies OWA_CUSTOM: OWA_IMAGE:pour obtenir les coordonnées du clic sur une image. OWA_PATTERN: expressions régulières. OWA_Text: manipulation des chaines de caractères. OWA_UTIL OWA_SEC: utilisé par la passerelle pour l’authentification des requetes. 9 paramètres d’une procédure stockée Les paramètres d’une procédure peuvent être passées de deux manières différentes: À partir de l’URL À partir d’un formulaire. Trois types de données possibles: Number Varchar2 Une collection PL/SQL de type table of (Number ou Varchar2) Compiler une page PSP: loadpsp -user hr exemple.psp 10 <%@ plsql language="PL/SQL" type="PL/SQL type" %> <%@ plsql procedure="PR3" %> <%@ plsql parameter="message" type="VARCHAR2" default="''" %> <%@ plsql parameter="repeter" type="NUMBER" default="0" %> <head> <title>PR2</title> </head> <body> <ul> <% FOR i IN 1..repeter LOOP %> <%= '<li>Bonjour' || i || '</li>'%> <% END LOOP; %> </ul> </body> </html> 11 <h1>Liste des employés</h1> <%@ page language="PL/SQL" %> <%@ page contentType="text/html" %> <table width="40%" border="1"> <tr> <%@ plsql procedure="afficher_employes" %> <th align="left">Nom</th> <%! <th align="left">Prénom</th> CURSOR emp_cursor IS </tr> SELECT last_name, first_name <% FOR emp_record IN emp_cursor LOOP %> FROM hr.employees ORDER BY last_name; <tr> %> <td> <%= emp_record.last_name %> </td> <html> <td> <%= emp_record.first_name %> <head> </td> <meta http-equiv="Content-Type" </tr> content="text/html"> <% END LOOP; %> <Liste des employés</title> </table> </head> </body> <body TEXT="#000000" BGCOLOR="#FFFFFF"> </html> 12