|
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.
|