- SQL
- PL/SQL
- DBA
- Developer / Forms
- Developer / Reports
- Developer / Graphics
- Data-Warehouse

 
 
 

 
> Tutorials
 

Creazione di pagine web tramite PL/SQL.
di Massimiliano Merelli

L'utilizzo dei package HTP ed HTF, contenuti nello schema OAS_PUBLIC ed accessibili a tutti gli utenti, permette di fondere la praticitá di utilizzo delle pagine web con la potenza e la flessibilitá di un database Oracle. Utilizzando questi due package é possibile permettere agli utenti la visualizzazione di dati contenuti nel database, la modifica di questi dati, la creazione di tabelle, l'inserimento di nuovi dati e molte altre cose, senza che gli utenti debbano conoscere una sola riga di codice SQL.
I due Package citati sopra sono tra di loro speculari, per ogni procedura del package HTP esiste la corrispondente funzione del packageHTF. La scelta dell'uno o dell'altro dipende dallo scopo che ci si prefigge. Generalmente le funzioni del package HTF vengono chiamate da procedure HTP all'interno delle quali sono innestate. Le procedure contenute nel package HTP restituiscono come valori dei TAG HTML, quindi se una delle procedure in questione viene richiamata da una pagina web, il risultato della procedura sará proprio il codice HTML necessario a creare una nuova pagina.
Per far sí che i due package funzionino correttamente occorre disporre di una macchina su cui sia installato l'Application Server di Oracle (tipicamente un server web) che risponde alle richieste dei singoli client. Il Listener presente sul server "ascolta" le chiamate inviate dai client e risponde chiamando le procedure Oracle interessate. Una procedura molto semplice potrebbe ad esempio contenere:

CREATE OR REPLACE PROCEDURE main
IS

BEGIN


  htp.htmlOpen;
-- Apre una pagina web e restituisce il tag ‹HTML›

  htp.headOpen;
-- Sezione header della pagina, puó contenere il titolo e altre informazioni
  htp.title('ORACLE AS Test Page');
-- Titolo della pagina
  htp.headClose;

  htp.bodyOpen;
-- Apre il corpo vero e proprio della pagina ‹BODY›

  htp.tableOpen(cattributes =>' width="75%" border="5" bgcolor="#3399FF"align="center"');
-- Apre una tabella HTML ‹TABLE›
  htp.tableRowOpen;
  htp.tabledata('‹FONT size="6" color="#990033" face="arial black"›'
                     ||'TEST PAGE'
                     ||'‹/FONT›'
                     ||htf.br
                     ||'‹FONT size="6" color="#FFFF00" face="arial black"›'
                     ||'ORACLE APPLICATION SERVER 8i'
                     ||'‹/FONT›'
                    );
-- Indica cosa scrivere nella tabella
 htp.tableRowClose;

 htp.tableClose;
-- Chiude la tabella ‹/TABLE›
 htp.bodyClose;
-- Chiude il corpo della pagina ‹/BODY›
 htp.htmlClose;
-- Chiude la pagina stessa ‹/HMTL›

END;

Il risultato di questa procedura sará una pagina web piuttosto spartana:

Il punto di forza di questa soluzione Oracle/web é la possibilità di usare sia codice avanzato PL/SQL, sia codice HTML, JAVASCRIPT, FLASH o qualunque altro linguaggio gestito da un comune Browser.
Il vantaggio che si acquisce utilizzando questa tecnica é che non si obbliga l'utente finale a conoscere il linguaggio SQL (evitando quindi anche che possano commettere errori irreparabili sul DataBase!!), permettendo contemporaneamente la distribuzione di informazioni utili in tempo reale (ogni volta che viene richiamata la procedura in questione i dati vengono letti direttamente dal DataBase stesso). Inoltre le pagine create in questo modo possono essere arricchite con immagini, suoni, filmati, parti in Flash o altri linguaggi ad alto impatto visivo, per rendere comunque piú attraente il risultato finale.
Inoltre una procedura di questo tipo puó essere richiamata tramite il passaggio di valori in ingresso (variabili di input), per aumentarne ancora di piú la flessibilitá e l'efficacia. facciamo un altro esempio.


La prima procedura genera una pagina web con una form da riempire in base a dei criteri prestabiliti, mentre la seconda riceve questi valori come input e produce il risultato interrogando il DataBase.

CREATE OR REPLACE PROCEDURE form
IS

BEGIN


 htp.htmlOpen;

 htp.headOpen;
 htp.title('Form Page');
 htp.headClose;

 htp.bodyOpen;

 htp.formOpen(curl => 'result', cmethod => 'post');
-- Apre la form ed individua la procedura da chiamare
 htp.tableOpen(cattributes => 'cellspacing="5" width="100%"' );

 htp.tableRowOpen;
 htp.tableData( 'Select one Name: ', calign => 'right', cattributes => 'valign=top');
 htp.tableData( htf.formText( cname => 'p_name', csize => '30', cmaxlength => '30'));
-- Crea la form per il testo da inserire come parametro ed indica il nome del parametro
 htp.tableRowClose;

 htp.tableRowOpen;
 htp.tableData( htf.formSubmit( cvalue => 'Submit'), calign => 'center', ccolspan => '2');
-- Crea un Pulsante per eseguire la seconda procedura
 htp.tableRowClose;

 htp.tableClose;

 htp.br;
 htp.br;

 htp.formClose;

 htp.bodyClose;

 htp.htmlClose;

END;


CREATE OR REPLACE PROCEDURE
result (p_name IN varchar2)
IS

 CURSOR impiegati IS SELECT * FROM EMPS WHERE name = p_name;

BEGIN

 htp.htmlOpen;
 htp.headOpen;

 htp.title('Result Page');

 htp.headClose;
 htp.bodyOpen;

for r in impiegati loop

 htp.tableOpen (cattributes => ' width="100%" border="1" frame="border" cellspacing="0" ');
 htp.tableRowOpen;

 htp.tableData(r.campo1);
 htp.tableData(r.campo2);
 htp.tableData(r.campo3);

 htp.tableRowClose;
 htp.tableClose;

 htp.br;
 htp.br;

end loop;

 htp.bodyClose;
 htp.htmlClose;

END;

Il risultato di queste due procedure sará una pagina finale generata dinamicamente in cui apparirá sullo schermo il risultato di una query sul DataBase con una semplice WHERE condition in base alla richiesta fatta dall'utente finale.

Altre procedure molto interessanti presenti all'interno di questi due package sono:
htp.comment
    che restituisce il TAG ‹!-- ... --›
htp.meta
    che restituisce il TAG ‹META›
htp.script
    che restituisce il TAG ‹SCRIPT›
htp.hr
    che restituisce il TAG ‹HR›
htp.anchor
    che restituisce il TAG ‹A›
htp.para
    che restituisce il TAG ‹P›
htp.print
    che restituisce tutto quello che viene passato come parametro
htp.mailto
    che restituisce il TAG ‹A›
htp.center
    che restituisce il TAG ‹CENTER› ed il TAG ‹/CENTER›
htp.frame
    che restituisce il TAG ‹FRAME›.


La procedura htp.print é molto utile in quanto restituisce, invece di un TAG html, tutto quello che viene passato come parametro alla procedura stessa. Questo permette di bypassare qualunque limite di PL/SQL riguardo alla complessitá delle pagine generate automaticamente. Infatti, qualora non esista una procedura adeguata, con l'htp.print si puó scrivere codice HTML per richiamare immagini, suoni, file di shockwave . Infine un ottimo aiuto per chi deve creare codice HTML tramite PL/SQL viene da un semplicissimo programmino chiamato WEBALCHEMY (http://www.users.bigpond.com/ahobbs/), che permette la conversione di codice HTML in PL/SQL con un fattore di precisione molto vicino al 100%. Ció consente di progettare la propria pagina Web senza tener conto delle limitazioni grafiche di PL/SQL, e di concentrarsi principalmente sull'aspetto estetico della pagina stessa.