Title: Oracle PL/SQL Server Pages (PSP)
1Oracle PL/SQL Server Pages (PSP)
2Grundidee PSP
- Internet-Seiten mit dynamischer Präsentation von
Inhalten durch Einsatz von PL/SQL-Anweisungen - Server-Side Scripting (Generierung der Seiten im
DB-Server - nicht im Webserver) - Basiert auf PL/SQL Web Toolkit
- Bestandteil von Oracle Application Server (OAS)
und Oracle WebDB - Einbindung dynamischer Inhalte durch
PL/SQL-Skripte, durch spezielle Tags
gekennzeichnet
3Einordnung in Oracle Application Server
4Vorteile von PSP
- Trennung von Anwendungs- und Präsentationslogik
- HTML-Anweisungen und PL/SQL Code separat
- Abgrenzung durch PL/SQL-spezifische Tags
- Leichte Erlernbarkeit
- Einfacher Zugriff auf Daten der Datenbank
- Ausführung im Server
- Verbindung mit anderen Skriptsprachen möglich
- z.B. Javascript oder Visual Basic-Script (zur
Prüfung von Benutzereingaben) - nicht kombinierbar mit anderen serverseitigen
Scripting-techniken
5Web Toolkit vs. PSP
CREATE OR REPLACE PROCEDURE home_page AS BEGIN
htp.htmlOpen htp.headOpen htp.title(My
home page) htp.headClose htp.bodyOpen htp.p
rint (This is the home page of user
generated on sysdate
.) htp.bodyClose htp.htmlClose END
6Entwicklung von PL/SQL Server Pages
- Schreiben der PL/SQL Server Page
- Standard-Skripttag
- Spezielle Skripttags
- Pages
- Prozeduren
- Parameter
- Deklarationen
- Expression Blocks
- Include
- Kommentare
- Kompilieren der PSP-Datei als Stored Procedure
- Aufruf der PSP im Browser
7Standard-Skripttag
lt PL/SQL code gt
Syntax
- Funktion Begrenzung von PL/SQL-Anweisungen
- Inhalt beliebige PL/SQL-Statements, z.B.
Prozeduraufrufe
8Spezielle TagsPage Direktive
lt page languagePL/SQL contentTypecontent
type string errorPagefile.psp gt
Syntax
- Funktion Charakterisierung der PSP
- Attribute
- language verwendete Skriptsprache (PL/SQL
Standard) - contentType Inhaltstyp der Seite text/html
Standard - errorPage PSP-Seite, die auf auftretenden
Fehlern aufgerufen wird (Standard keine Datei)
9Spezielle TagsProcedure Parameter Direktive
lt plsql procedureprocedure name gt
Syntax
lt plsql parameterparameter name
gt typePL/SQL datatype defaultvalue gt
- Funktion Spezifikation von Prozedur und
Parameter (alles IN) - Attribute
- procedure Name des Prozedur
- parameter Name des Parameters
- type Datentyp des Parameters Standardwert
varchar2 (ohne Länge) - default Standardwert für Parameter
10Spezielle TagsDeclaration Direktive
lt! PL/SQL declaration PL/SQL declaration ...
gt
Syntax
- Funktion Deklaration von Variablen und Cursor
auf der ganzen Seite - Beispiel
lt! cursor prod_cur is select from products
where price between minprice andmaxprice
vc_name varchar2(200)Peter gt
11Spezielle Tags Expression Block / Print
Direktive
lt PL/SQL expression gt
Syntax
- Funktion Ausgabe eines beliebigen
PL/SQL-Ausdrucks (String, Zahl, Ergebnis eines
Funktionsaufrufs) - Beispiel
lt The employee name is emp_rec.ename
gt oder The employee name is lt emp_rec.ename
gt
12Spezielle Tags Include Direktive
lt_at_ include file path name gt
Syntax
- Funktion Einbinden des Quelltexts anderer
Dateien in die Seite - Beispiel
lt include fileheader.inc gt
- Anmerkungen
- Datei darf HTML- und PSP-Skriptelemente enthalten
- Einbindung nur einmal zur Ãœbersetzungszeit
(mögliche Alternative Einbindung durch
Prozeduraufruf)
13Spezielle Tags Kommentare
lt-- Kommentar --gt
Syntax
- Funktion erscheint nicht in der generierten
Prozedur bzw. in den daraus erstellten HTML-Seiten
lt!-- Kommentar --gt
Syntax
- Funktion Kommentare, die in der HTML-Ausgabe
erscheinen (normale HTML-Syntax)
-- einzeiliger Kommentar / mehrzeiliger
Kommentar /
Syntax
- Funktion Kommentare innerhalb eines
PL/SQL-Blocks
14Kompilieren der PL/SQL Server Page
Syntax
loadpsp -replace - user username/password_at_conne
ct_string include_file_name ... ltpage1gt
ltpage2gt ...
- Attribute
- replace überschreibt Prozedur gleichen Namens
- username/password_at_connect_string
Login-Information - include-file_name Dateien, die mittels include
eingebunden werden - page1 ... Name der PSP-Dateien, die kompiliert
werden sollen
Beispiel
loadpsp -replace - user name/passw_at_imnlehre
timestamp.inc display_cust.psp
15Beispiel einer Generierung
16Verarbeitung des Aufrufs
17ParameterverarbeitungGET-Methode
... ltform methodGET actioncust_order_itemsgt
ltinput typehidden namecust_id
valueltcust_id gt ltinput typetext
nameord_id size10 valueltorder_id
gt ltinput_typesubmit value Order
Detailsgt lt/formgt ...
URL bei Submit
http//goliath.imn.htwk-leipzig.de8080/WebDB/ cu
st_order_items?ord_id100cust_id100
18ParameterverarbeitungPOST-Methode
... ltform methodPOST actioncust_order_itemsgt
ltinput typehidden namecust_id
valueltcust_id gt ltinput typetext
nameord_id size10 valueltorder_id
gt ltinput_typesubmit value Order
Detailsgt lt/formgt ...
URL bei Submit
http//goliath.imn.htwk-leipzig.de8080/WebDB/ cu
st_order_items
19Hinweise zur Verwendung von PSP
- Trennung von Anwendungs- und Präsentationslogik
- Berechnungen in eigenständiger Prozedur
- Einbinden zusätzlicher Dateien
- Procedure Invocation direkter Prozeduraufruf
(bessere Berücksichtigung von Änderungen)
20Wiederverwendung von Seitenköpfen und -füßen
lt_at_ plsql procedure"page_header" gt lt!-- header
links to customer help page and search button
--gt ltCENTERgt ltA HREF"/support/help.html"gtCustomer
Helplt/Agt ltFORM ACTION"/product/search_prod"gtltINP
UT NAME"item"gt ltINPUT TYPESUBMITgtlt/FORMgt ltHRgt lt!
-- end of header --gt
lt_at_ plsql procedure"page_footer" gt lt!-- footer
company contact info --gt ltHRgt ltCENTERgt WebStore
Inc. ltBRgt 123 Main Street ltBRgt San Francisco, CA
94021 ltBRgt (415) 123-4567 ltBRgt ltA
HREF"mailtosales_at_webstore. lt!-- end of footer
--gt
Aufruf der Prozeduren
ltHTMLgt ltTITLEgtPage Titlelt/TITLEgt ltBODYgt lt
page_headergt ... page body lt
page_footergt lt/BODYgt lt/HTMLgt
21Fehlerbehandlung - Beispiel
create or replace procedure Show_Details (
Prod_ID in Number, Name out varchar2, Price out
Number ) as as Prod_Name varchar2(30)
Prod_Price Number begin Select Name, Price
Into Prod_name, Prod_Price From Products
Where ID Prod_id ... Name Prod_Name
Price Prod_Price end
create or replace procedure Show_Details(
Prod_ID in Number, Name out varchar2, Price out
Number ) as Prod_Name varchar2(30)
Prod_Price Numberbegin Select Name, Price
Into Prod_name, Prod_Price From Products
Where ID Prod_id ... Name Prod_Name
Price Prod_Priceend
22Fehlerbehandlung - Verwendung von Errorpages
create or replace procedure Show_Details (
Prod_ID in Number, Name out varchar2, Price out
Number ) as as Prod_Name varchar2(30)
Prod_Price Number begin Select Name, Price
Into Prod_name, Prod_Price From Products
Where ID Prod_id ... Name Prod_Name
Price Prod_Price end
- erwartete vs. unerwartete Fehler
- erwarteter Fehler NO_DATA_FOUND
- unerwarteter Fehler 2 Produkte mit der gleichen
ID - Verwendung von ErrorPage in Page-Direktive zur
Behandlung unerwarteter Fehler - Nachteil keine Parameterübergabe möglich (z.B.
Fehlerzeitpunkt, Eingabeparameter)
23Benutzerdefinierte Ausnahmebehandlung (Exceptions)
lt_at_ page errorPage"Error_Page.psp" gt -- Angabe
der Fehlerseite...l_exception EXCEPTION --
Deklaration der Ausnahme l_exception...IF
(TO_DATE(arrival_date,'YYYY-MM-DD') lt
SYSDATE)THEN RAISE l_exception -- Datum
liegt vor dem aktuellem DatumEND IFEXCEPTION
WHEN l_exception THEN -- Test, ob es der vom
Benutzer ausgelöste Fehler ist RAISE
-- Weiterleitung des Fehlers an übergeordnete
Fehler- END --
behandlung in Error_Page
... lt IF (SQLERRM 'User-Defined Exception')
THEN gt lt l_error_message 'Date values
should be greater than Current Date' gt lt
l_error_message gt -- Ausgabe der
Fehlermeldung lt ELSE gt lt SQLERRM gt --
wenn anderer Fehler, Ausgabe der Fehlermeldung lt
END IF gt ...
24Parameterübergabe
lt_at_ plsql procedure show errorPage"Error_Page.ps
p" gtlt_at_ plsql parameterp_ID typenumber
default0gtlt_at_ plsql parameterp_Text
typevarchar2 defaultgt
ltSELECT NAME p_ID size1gtlt for item in
(select ID, Name from Products order by Name)
loop gt ltoption valueltitem.ID gt
gtltitem.Name gtlt/optiongt lt end loop
gtlt/SELECTgt
SELECT-Box wird durch Abfrage auf Tabelle
Products mit Werten gefüllt, Zuordnung zum
Parameter p_ID 2. Eingabeparameter p_Text als
Input-Feld in HTML-Formular
ltform methodpost actionshow_detailgt
ltpgtEingabe ltinput typetext size50 maxlength50
namep_Namegt ltSELECT NAMEp_ID size1gt
... lt/SELECTgt ltinput typesubmit
valueAbschickengt lt/formgt
25Benutzeridentifikation
Beispiel Anmeldung mit Kunden-Nr
ltform methodPOST actionStartseitegt
ltpgtltbgtKundennummer eingebenlt/bgt ltINPUT
TYPEtext namecust_id size5gt ltinput
typesubmit valueLogingtlt/pgt lt/formgt
PSP der Startseite-Prozedur und alle
nachfolgenden Prozeduren Parameter für Kunden-Nr.
lt_at_ plsql parametercust_id typenumber gt
Speicherung der Kunden-Nr. in verstecktem Feld,
ermöglicht Weitergabe bei Abschicken des
Formulars (nicht günstig bei komplexeren
Anwendungen!)
ltinput typehidden namecust_id valuelt
cust_id gt
26Verwendung von Javascript
- keine Einschränkung gegenüber normalen
HTML-Seiten - clientseitige Skriptsprache
- Test von Benutzereingaben vor Abschicken in die
Datenbank - Beispiel
- Prüfe bei Absenden des Formulars (onSubmit) durch
Aufruf einer Javascript-Funktion (chkFormular),
die True oder False zurückliefert - if TRUE Aufruf der PSP-Prozedur insertCheck
- vergleiche Quellcode-Beispiel
27Anzeige von Master-Detail-Beziehungen (Beispiel)
lt_at_ plsql proceduremain gtlthtmlgtltheadgtlttitle
gtMaster/Detail-Textlt/titlegtlt/headgtltframeset
rows40,60gt ltframe srcshow_Master
nameMastergt ltframe srcshow_Detail
nameDetailgtlt/framesetgtlt/htmlgt
Darstellung einer Master-Detail-Beziehung in
Frames Anzeige der Master-Datensätze
show_Master Anzeige der Detail-Datensätze
show_Detail
28PSP des Master-Frames
lt_at_ page language"PL/SQL" gt lt_at_ plsql
procedure"show_Master" gt lthtmlgt ltheadgtlttitlegtMa
ster-Datasetslt/titlegtlt/headgt ltbodygt ltform
action"show_detail" target"Detail"gt ltSELECT
NAME"p_Cust_ID" size"1"gt lt for item in (select
from Customer order by Cust_name) loop gt
ltoption value"lt item.Cust_ID gt"
gtltitem.Cust_Name gtlt/optiongt lt end loop gt
lt/selectgt ltinput type"submit"
value"Bestellungen anzeigen"gt lt/formgt lt/bodygt lt/h
tmlgt
29PSP des Detail-Frames
lt_at_ page language"PL/SQL" gt lt_at_ plsql
procedure"show_detail" gt lt_at_ plsql
parameter"p_Cust_ID" default"0"gt lthtmlgt ltheadgt
lttitlegt Detaildatensätze lt/titlegt lt/headgt ltbodygt
ltformgt lttable border"1" gt lttrgt ltth
align"center"gtArtikelnamelt/tdgt ltth
align"center"gtPreislt/tdgt ltth
align"center"gtAnzahllt/tdgt ltth
align"center"gtBestellnummerlt/tdgt ltth
align"center"gtBestellstatuslt/tdgt lt/trgt lt for
item in (SELECT Order_ID, Order_Number,
Order_Sign, Stat_ID, Stat_Desc, Prod_Name,
Prod_Price
FROM CustOrders, Status,
Products WHERE
ORDER_CUST_IDp_Cust_ID AND Stat_ID
()Order_Status AND
Order_Prod_IDProd_ID
ORDER BY Prod_Name ) loop -- () Outer Join,
um auch Bestellungen auszuwählen, die keinen
Status habengt lttrgt lttd align"left"gtlt
item.Prod_Name gtlt/tdgt lttd align"left"gtlt
item.Prod_Price gtlt/tdgt lttd align"left"gtlt
item.Order_Number gtlt/tdgt lttd align"left"gtlt
item.Order_Sign gtlt/tdgt lttd align"left"gtlt
item.Stat_Desc gtlt/tdgt lt/trgt lt end loop gt
lt/tablegt lt/formgt lt/bodygt lt/htmlgt
PSP des Detail-Frames
30Ergebnis